diff --git a/db/zm_create.sql.in b/db/zm_create.sql.in index 128c1a0e9..bff9e83cc 100644 --- a/db/zm_create.sql.in +++ b/db/zm_create.sql.in @@ -887,14 +887,14 @@ CREATE TABLE `ZonePresets` ( `CheckMethod` enum('AlarmedPixels','FilteredPixels','Blobs') NOT NULL default 'Blobs', `MinPixelThreshold` smallint(5) unsigned default NULL, `MaxPixelThreshold` smallint(5) unsigned default NULL, - `MinAlarmPixels` int(10) unsigned default NULL, - `MaxAlarmPixels` int(10) unsigned default NULL, + `MinAlarmPixels` DECIMAL(10,2) unsigned default NULL, + `MaxAlarmPixels` DECIMAL(10,2) unsigned default NULL, `FilterX` tinyint(3) unsigned default NULL, `FilterY` tinyint(3) unsigned default NULL, - `MinFilterPixels` int(10) unsigned default NULL, - `MaxFilterPixels` int(10) unsigned default NULL, - `MinBlobPixels` int(10) unsigned default NULL, - `MaxBlobPixels` int(10) unsigned default NULL, + `MinFilterPixels` DECIMAL(10,2) unsigned default NULL, + `MaxFilterPixels` DECIMAL(10,2) unsigned default NULL, + `MinBlobPixels` DECIMAL(10,2) unsigned default NULL, + `MaxBlobPixels` DECIMAL(10,2) unsigned default NULL, `MinBlobs` smallint(5) unsigned default NULL, `MaxBlobs` smallint(5) unsigned default NULL, `OverloadFrames` smallint(5) unsigned NOT NULL default '0', @@ -921,14 +921,14 @@ CREATE TABLE `Zones` ( `CheckMethod` enum('AlarmedPixels','FilteredPixels','Blobs') NOT NULL default 'Blobs', `MinPixelThreshold` smallint(5) unsigned default NULL, `MaxPixelThreshold` smallint(5) unsigned default NULL, - `MinAlarmPixels` int(10) unsigned default NULL, - `MaxAlarmPixels` int(10) unsigned default NULL, + `MinAlarmPixels` DECIMAL(10,2) unsigned default NULL, + `MaxAlarmPixels` DECIMAL(10,2) unsigned default NULL, `FilterX` tinyint(3) unsigned default NULL, `FilterY` tinyint(3) unsigned default NULL, - `MinFilterPixels` int(10) unsigned default NULL, - `MaxFilterPixels` int(10) unsigned default NULL, - `MinBlobPixels` int(10) unsigned default NULL, - `MaxBlobPixels` int(10) unsigned default NULL, + `MinFilterPixels` DECIMAL(10,2) unsigned default NULL, + `MaxFilterPixels` DECIMAL(10,2) unsigned default NULL, + `MinBlobPixels` DECIMAL(10,2) unsigned default NULL, + `MaxBlobPixels` DECIMAL(10,2) unsigned default NULL, `MinBlobs` smallint(5) unsigned default NULL, `MaxBlobs` smallint(5) unsigned default NULL, `OverloadFrames` smallint(5) unsigned NOT NULL default '0', @@ -1349,6 +1349,39 @@ CREATE TABLE `Notifications` ( CONSTRAINT `Notifications_ibfk_1` FOREIGN KEY (`UserId`) REFERENCES `Users` (`Id`) ON DELETE CASCADE ) ENGINE=@ZM_MYSQL_ENGINE@; +-- +-- Table structure for table `Menu_Items` +-- + +DROP TABLE IF EXISTS `Menu_Items`; +CREATE TABLE `Menu_Items` ( + `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `MenuKey` varchar(32) NOT NULL, + `Enabled` tinyint(1) NOT NULL DEFAULT 1, + `Label` varchar(64) DEFAULT NULL, + `SortOrder` smallint NOT NULL DEFAULT 0, + `Icon` varchar(128) DEFAULT NULL, + `IconType` enum('material','fontawesome','image','none') NOT NULL DEFAULT 'material', + PRIMARY KEY (`Id`), + UNIQUE KEY `Menu_Items_MenuKey_idx` (`MenuKey`) +) ENGINE=@ZM_MYSQL_ENGINE@; + +INSERT INTO `Menu_Items` (`MenuKey`, `Enabled`, `SortOrder`) VALUES + ('Console', 1, 10), + ('Montage', 1, 20), + ('MontageReview', 1, 30), + ('Events', 1, 40), + ('Options', 1, 50), + ('Log', 1, 60), + ('Devices', 1, 70), + ('IntelGpu', 1, 80), + ('Groups', 1, 90), + ('Filters', 1, 100), + ('Snapshots', 1, 110), + ('Reports', 1, 120), + ('ReportEventAudit', 1, 130), + ('Map', 1, 140); + source @PKGDATADIR@/db/Object_Types.sql -- We generally don't alter triggers, we drop and re-create them, so let's keep them in a separate file that we can just source in update scripts. source @PKGDATADIR@/db/triggers.sql diff --git a/db/zm_update-1.37.81.sql b/db/zm_update-1.37.81.sql deleted file mode 100644 index 5c4ac498a..000000000 --- a/db/zm_update-1.37.81.sql +++ /dev/null @@ -1,110 +0,0 @@ --- --- This updates a 1.37.80 database to 1.37.81 --- --- Convert Zone Coords from pixel values to percentage values (0.00-100.00) --- so that zones are resolution-independent. --- - -DELIMITER // - -DROP PROCEDURE IF EXISTS `zm_update_zone_coords_to_percent` // - -CREATE PROCEDURE `zm_update_zone_coords_to_percent`() -BEGIN - DECLARE done INT DEFAULT FALSE; - DECLARE v_zone_id INT; - DECLARE v_coords TINYTEXT; - DECLARE v_mon_width INT; - DECLARE v_mon_height INT; - DECLARE v_new_coords TEXT DEFAULT ''; - DECLARE v_pair TEXT; - DECLARE v_x_str TEXT; - DECLARE v_y_str TEXT; - DECLARE v_x_pct TEXT; - DECLARE v_y_pct TEXT; - DECLARE v_remaining TEXT; - DECLARE v_space_pos INT; - - DECLARE cur CURSOR FOR - SELECT z.Id, z.Coords, m.Width, m.Height - FROM Zones z - JOIN Monitors m ON z.MonitorId = m.Id - WHERE m.Width > 0 AND m.Height > 0; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; - - OPEN cur; - - read_loop: LOOP - FETCH cur INTO v_zone_id, v_coords, v_mon_width, v_mon_height; - IF done THEN - LEAVE read_loop; - END IF; - - -- Skip if coords already look like percentages (contain a decimal point) - IF v_coords LIKE '%.%' THEN - ITERATE read_loop; - END IF; - - SET v_new_coords = ''; - SET v_remaining = TRIM(v_coords); - - -- Parse each space-separated x,y pair - coord_loop: LOOP - IF v_remaining = '' OR v_remaining IS NULL THEN - LEAVE coord_loop; - END IF; - - SET v_space_pos = LOCATE(' ', v_remaining); - IF v_space_pos > 0 THEN - SET v_pair = LEFT(v_remaining, v_space_pos - 1); - SET v_remaining = TRIM(SUBSTRING(v_remaining, v_space_pos + 1)); - ELSE - SET v_pair = v_remaining; - SET v_remaining = ''; - END IF; - - -- Skip empty pairs (from double spaces, trailing commas etc) - IF v_pair = '' OR v_pair = ',' THEN - ITERATE coord_loop; - END IF; - - -- Split on comma - SET v_x_str = SUBSTRING_INDEX(v_pair, ',', 1); - SET v_y_str = SUBSTRING_INDEX(v_pair, ',', -1); - - -- Convert to percentage with 2 decimal places - -- Use CAST to DECIMAL which always uses '.' as decimal separator (locale-independent) - SET v_x_pct = CAST(ROUND(CAST(v_x_str AS DECIMAL(10,2)) / v_mon_width * 100, 2) AS DECIMAL(10,2)); - SET v_y_pct = CAST(ROUND(CAST(v_y_str AS DECIMAL(10,2)) / v_mon_height * 100, 2) AS DECIMAL(10,2)); - - IF v_new_coords != '' THEN - SET v_new_coords = CONCAT(v_new_coords, ' '); - END IF; - SET v_new_coords = CONCAT(v_new_coords, v_x_pct, ',', v_y_pct); - - END LOOP coord_loop; - - IF v_new_coords != '' THEN - UPDATE Zones SET Coords = v_new_coords WHERE Id = v_zone_id; - END IF; - - END LOOP read_loop; - - CLOSE cur; -END // - -DELIMITER ; - -CALL zm_update_zone_coords_to_percent(); -DROP PROCEDURE IF EXISTS `zm_update_zone_coords_to_percent`; - --- Recalculate Area from pixel-space to percentage-space (100x100 = 10000 for full frame) -UPDATE Zones z - JOIN Monitors m ON z.MonitorId = m.Id - SET z.Area = ROUND(z.Area * 10000.0 / (m.Width * m.Height)) - WHERE m.Width > 0 AND m.Height > 0 AND z.Area > 0; - --- Update Units to Percent for all zones, and set as new default -UPDATE Zones SET Units = 'Percent' WHERE Units = 'Pixels'; -ALTER TABLE Zones ALTER Units SET DEFAULT 'Percent'; diff --git a/db/zm_update-1.39.2.sql b/db/zm_update-1.39.2.sql index 3018e7f75..09f3ca566 100644 --- a/db/zm_update-1.39.2.sql +++ b/db/zm_update-1.39.2.sql @@ -1,3 +1,112 @@ +-- +-- Convert Zone Coords from pixel values to percentage values (0.00-100.00) +-- so that zones are resolution-independent. +-- + +DELIMITER // + +DROP PROCEDURE IF EXISTS `zm_update_zone_coords_to_percent` // + +CREATE PROCEDURE `zm_update_zone_coords_to_percent`() +BEGIN + DECLARE done INT DEFAULT FALSE; + DECLARE v_zone_id INT; + DECLARE v_coords TINYTEXT; + DECLARE v_mon_width INT; + DECLARE v_mon_height INT; + DECLARE v_new_coords TEXT DEFAULT ''; + DECLARE v_pair TEXT; + DECLARE v_x_str TEXT; + DECLARE v_y_str TEXT; + DECLARE v_x_pct TEXT; + DECLARE v_y_pct TEXT; + DECLARE v_remaining TEXT; + DECLARE v_space_pos INT; + + DECLARE cur CURSOR FOR + SELECT z.Id, z.Coords, m.Width, m.Height + FROM Zones z + JOIN Monitors m ON z.MonitorId = m.Id + WHERE m.Width > 0 AND m.Height > 0; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; + + OPEN cur; + + read_loop: LOOP + FETCH cur INTO v_zone_id, v_coords, v_mon_width, v_mon_height; + IF done THEN + LEAVE read_loop; + END IF; + + -- Skip if coords already look like percentages (contain a decimal point) + IF v_coords LIKE '%.%' THEN + ITERATE read_loop; + END IF; + + SET v_new_coords = ''; + SET v_remaining = TRIM(v_coords); + + -- Parse each space-separated x,y pair + coord_loop: LOOP + IF v_remaining = '' OR v_remaining IS NULL THEN + LEAVE coord_loop; + END IF; + + SET v_space_pos = LOCATE(' ', v_remaining); + IF v_space_pos > 0 THEN + SET v_pair = LEFT(v_remaining, v_space_pos - 1); + SET v_remaining = TRIM(SUBSTRING(v_remaining, v_space_pos + 1)); + ELSE + SET v_pair = v_remaining; + SET v_remaining = ''; + END IF; + + -- Skip empty pairs (from double spaces, trailing commas etc) + IF v_pair = '' OR v_pair = ',' THEN + ITERATE coord_loop; + END IF; + + -- Split on comma + SET v_x_str = SUBSTRING_INDEX(v_pair, ',', 1); + SET v_y_str = SUBSTRING_INDEX(v_pair, ',', -1); + + -- Convert to percentage with 2 decimal places + -- Use CAST to DECIMAL which always uses '.' as decimal separator (locale-independent) + SET v_x_pct = CAST(ROUND(CAST(v_x_str AS DECIMAL(10,2)) / v_mon_width * 100, 2) AS DECIMAL(10,2)); + SET v_y_pct = CAST(ROUND(CAST(v_y_str AS DECIMAL(10,2)) / v_mon_height * 100, 2) AS DECIMAL(10,2)); + + IF v_new_coords != '' THEN + SET v_new_coords = CONCAT(v_new_coords, ' '); + END IF; + SET v_new_coords = CONCAT(v_new_coords, v_x_pct, ',', v_y_pct); + + END LOOP coord_loop; + + IF v_new_coords != '' THEN + UPDATE Zones SET Coords = v_new_coords WHERE Id = v_zone_id; + END IF; + + END LOOP read_loop; + + CLOSE cur; +END // + +DELIMITER ; + +CALL zm_update_zone_coords_to_percent(); +DROP PROCEDURE IF EXISTS `zm_update_zone_coords_to_percent`; + +-- Recalculate Area from pixel-space to percentage-space (100x100 = 10000 for full frame) +UPDATE Zones z + JOIN Monitors m ON z.MonitorId = m.Id + SET z.Area = ROUND(z.Area * 10000.0 / (m.Width * m.Height)) + WHERE m.Width > 0 AND m.Height > 0 AND z.Area > 0; + +-- Update Units to Percent for all zones, and set as new default +UPDATE Zones SET Units = 'Percent' WHERE Units = 'Pixels'; +ALTER TABLE Zones ALTER Units SET DEFAULT 'Percent'; + -- -- Add Notifications table for FCM push token registration -- diff --git a/db/zm_update-1.39.3.sql b/db/zm_update-1.39.3.sql index 67df5363c..4acc18ec6 100644 --- a/db/zm_update-1.39.3.sql +++ b/db/zm_update-1.39.3.sql @@ -1,3 +1,4 @@ + -- -- Add Profile column to Notifications table -- @@ -14,3 +15,187 @@ SET @s = (SELECT IF( PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- Convert zone threshold fields (MinAlarmPixels, etc.) from pixel counts +-- to percentages of zone area, matching the coordinate percentage migration +-- done in zm_update-1.39.2.sql. +-- + +-- First convert existing pixel count values to percentages WHILE columns +-- are still INT (values 0-100 fit in INT; ALTER to DECIMAL would fail on +-- large pixel counts that exceed DECIMAL(10,2) max of 99999.99). +-- +-- Zone pixel area = (Zones.Area * Monitors.Width * Monitors.Height) / 10000 +-- where Zones.Area is in percentage-space (0-10000) from zm_update-1.39.2.sql. +-- new_percent = old_pixel_count * 100 / zone_pixel_area +-- = old_pixel_count * 1000000 / (Zones.Area * Monitors.Width * Monitors.Height) +-- +-- Only convert zones with percentage coordinates (contain '.') that still have +-- pixel-scale threshold values (> 100 means it can't be a percentage). + +UPDATE Zones z + JOIN Monitors m ON z.MonitorId = m.Id +SET + z.MinAlarmPixels = CASE + WHEN z.MinAlarmPixels IS NULL THEN NULL + WHEN z.MinAlarmPixels = 0 THEN 0 + WHEN z.Area > 0 AND m.Width > 0 AND m.Height > 0 + THEN LEAST(ROUND(z.MinAlarmPixels * 1000000.0 / (z.Area * m.Width * m.Height)), 100) + ELSE z.MinAlarmPixels END, + z.MaxAlarmPixels = CASE + WHEN z.MaxAlarmPixels IS NULL THEN NULL + WHEN z.MaxAlarmPixels = 0 THEN 0 + WHEN z.Area > 0 AND m.Width > 0 AND m.Height > 0 + THEN LEAST(ROUND(z.MaxAlarmPixels * 1000000.0 / (z.Area * m.Width * m.Height)), 100) + ELSE z.MaxAlarmPixels END, + z.MinFilterPixels = CASE + WHEN z.MinFilterPixels IS NULL THEN NULL + WHEN z.MinFilterPixels = 0 THEN 0 + WHEN z.Area > 0 AND m.Width > 0 AND m.Height > 0 + THEN LEAST(ROUND(z.MinFilterPixels * 1000000.0 / (z.Area * m.Width * m.Height)), 100) + ELSE z.MinFilterPixels END, + z.MaxFilterPixels = CASE + WHEN z.MaxFilterPixels IS NULL THEN NULL + WHEN z.MaxFilterPixels = 0 THEN 0 + WHEN z.Area > 0 AND m.Width > 0 AND m.Height > 0 + THEN LEAST(ROUND(z.MaxFilterPixels * 1000000.0 / (z.Area * m.Width * m.Height)), 100) + ELSE z.MaxFilterPixels END, + z.MinBlobPixels = CASE + WHEN z.MinBlobPixels IS NULL THEN NULL + WHEN z.MinBlobPixels = 0 THEN 0 + WHEN z.Area > 0 AND m.Width > 0 AND m.Height > 0 + THEN LEAST(ROUND(z.MinBlobPixels * 1000000.0 / (z.Area * m.Width * m.Height)), 100) + ELSE z.MinBlobPixels END, + z.MaxBlobPixels = CASE + WHEN z.MaxBlobPixels IS NULL THEN NULL + WHEN z.MaxBlobPixels = 0 THEN 0 + WHEN z.Area > 0 AND m.Width > 0 AND m.Height > 0 + THEN LEAST(ROUND(z.MaxBlobPixels * 1000000.0 / (z.Area * m.Width * m.Height)), 100) + ELSE z.MaxBlobPixels END +WHERE z.Coords LIKE '%.%' + AND (z.MinAlarmPixels > 100 OR z.MaxAlarmPixels > 100 + OR z.MinFilterPixels > 100 OR z.MaxFilterPixels > 100 + OR z.MinBlobPixels > 100 OR z.MaxBlobPixels > 100); + +-- Now change threshold columns from int to DECIMAL(10,2) to store percentages +-- with 2 decimal places (e.g. 25.50 = 25.50% of zone area). +-- Values are now 0-100 from the UPDATE above, so they fit in DECIMAL(10,2). + +SET @s = (SELECT IF( + (SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE() + AND table_name = 'Zones' AND column_name = 'MinAlarmPixels' + ) = 'decimal', +"SELECT 'Zones threshold columns already DECIMAL'", +"ALTER TABLE `Zones` + MODIFY `MinAlarmPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MaxAlarmPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MinFilterPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MaxFilterPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MinBlobPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MaxBlobPixels` DECIMAL(10,2) unsigned default NULL" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +-- Also update ZonePresets table column types for consistency +SET @s = (SELECT IF( + (SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE() + AND table_name = 'ZonePresets' AND column_name = 'MinAlarmPixels' + ) = 'decimal', +"SELECT 'ZonePresets threshold columns already DECIMAL'", +"ALTER TABLE `ZonePresets` + MODIFY `MinAlarmPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MaxAlarmPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MinFilterPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MaxFilterPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MinBlobPixels` DECIMAL(10,2) unsigned default NULL, + MODIFY `MaxBlobPixels` DECIMAL(10,2) unsigned default NULL" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +-- +-- Add Menu_Items table for customizable navbar/sidebar menu +-- + +SET @s = (SELECT IF( + (SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = DATABASE() + AND table_name = 'Menu_Items' + ) > 0, +"SELECT 'Table Menu_Items already exists'", +"CREATE TABLE `Menu_Items` ( + `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `MenuKey` varchar(32) NOT NULL, + `Enabled` tinyint(1) NOT NULL DEFAULT 1, + `Label` varchar(64) DEFAULT NULL, + `SortOrder` smallint NOT NULL DEFAULT 0, + `Icon` varchar(128) DEFAULT NULL, + `IconType` enum('material','fontawesome','image','none') NOT NULL DEFAULT 'material', + PRIMARY KEY (`Id`), + UNIQUE KEY `Menu_Items_MenuKey_idx` (`MenuKey`) +) ENGINE=InnoDB" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +-- +-- Seed default menu items if table is empty +-- + +SET @s = (SELECT IF( + (SELECT COUNT(*) FROM `Menu_Items`) > 0, +"SELECT 'Menu_Items already has data'", +"INSERT INTO `Menu_Items` (`MenuKey`, `Enabled`, `SortOrder`) VALUES + ('Console', 1, 10), + ('Montage', 1, 20), + ('MontageReview', 1, 30), + ('Events', 1, 40), + ('Options', 1, 50), + ('Log', 1, 60), + ('Devices', 1, 70), + ('IntelGpu', 1, 80), + ('Groups', 1, 90), + ('Filters', 1, 100), + ('Snapshots', 1, 110), + ('Reports', 1, 120), + ('ReportEventAudit', 1, 130), + ('Map', 1, 140)" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +-- +-- Add Icon and IconType columns if they don't exist +-- + +SET @s = (SELECT IF( + (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE() + AND table_name = 'Menu_Items' AND column_name = 'Icon' + ) > 0, +"SELECT 'Column Icon already exists'", +"ALTER TABLE `Menu_Items` ADD `Icon` varchar(128) DEFAULT NULL AFTER `SortOrder`" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +SET @s = (SELECT IF( + (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE() + AND table_name = 'Menu_Items' AND column_name = 'IconType' + ) > 0, +"SELECT 'Column IconType already exists'", +"ALTER TABLE `Menu_Items` ADD `IconType` enum('material','fontawesome','image','none') NOT NULL DEFAULT 'material' AFTER `Icon`" +)); + +PREPARE stmt FROM @s; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; diff --git a/dep/CMakeLists.txt b/dep/CMakeLists.txt index e5b2cfaa5..d8ac9ab1d 100644 --- a/dep/CMakeLists.txt +++ b/dep/CMakeLists.txt @@ -7,5 +7,7 @@ add_subdirectory(RtspServer) add_subdirectory(span-lite) set(ENABLE_INSTALL_SAVED "${ENABLE_INSTALL}") set(ENABLE_INSTALL OFF) +set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) add_subdirectory(CxxUrl) +unset(CMAKE_POLICY_DEFAULT_CMP0077) set(ENABLE_INSTALL "${ENABLE_INSTALL_SAVED}") diff --git a/dep/RtspServer b/dep/RtspServer index 24e6b7153..a07159957 160000 --- a/dep/RtspServer +++ b/dep/RtspServer @@ -1 +1 @@ -Subproject commit 24e6b7153aa561ecc4123cc7c8fc1b530cde0bc9 +Subproject commit a071599575f60a6f1f424e1f9b408dad7da734a8 diff --git a/distros/redhat/zoneminder.spec b/distros/redhat/zoneminder.spec index 68e663705..ca8384879 100644 --- a/distros/redhat/zoneminder.spec +++ b/distros/redhat/zoneminder.spec @@ -21,7 +21,7 @@ %global zmtargetdistro %{?rhel:el%{rhel}}%{!?rhel:fc%{fedora}} Name: zoneminder -Version: 1.39.0 +Version: 1.39.3 Release: 1%{?dist} Summary: A camera monitoring and analysis tool Group: System Environment/Daemons diff --git a/eslint.config.js b/eslint.config.js index 179a574c2..ba5d64269 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -96,7 +96,7 @@ module.exports = defineConfig([{ "web/js/fontfaceobserver.standalone.js", "web/skins/classic/js/bootstrap-4.5.0.js", "web/skins/classic/js/bootstrap.bundle.min.js", - "web/skins/classic/js/bootstrap-table-1.23.5", + "web/skins/classic/assets", "web/skins/classic/js/chosen", "web/skins/classic/js/dateTimePicker", "web/skins/classic/js/jquery-*.js", diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in index 482d3bc38..4897ebc1a 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in +++ b/scripts/ZoneMinder/lib/ZoneMinder/ConfigData.pm.in @@ -535,6 +535,22 @@ our @options = ( type => $types{boolean}, category => 'system', }, + { + name => 'ZM_OPT_USE_REMEMBER_ME', + default => 'no', + description => 'Show a "Remember Me" option on the login page', + help => q` + When enabled, a "Remember Me" checkbox will appear on the login + page. If the user does not check "Remember Me", the session + cookie will expire when the browser is closed. If checked, the + session will persist for the duration configured by + ZM_COOKIE_LIFETIME. When this option is disabled, sessions + always persist for ZM_COOKIE_LIFETIME as before. + `, + requires => [ { name=>'ZM_OPT_USE_AUTH', value=>'yes' } ], + type => $types{boolean}, + category => 'auth', + }, # Google reCaptcha settings { name => 'ZM_OPT_USE_GOOG_RECAPTCHA', @@ -2974,6 +2990,30 @@ our @options = ( }, category => 'web', }, + { + name => 'ZM_WEB_FILTER_SETTINGS_POSITION', + default => 'sidebar', + description => 'Where to position the monitor filter settings panel on views.', + help => q` + Controls how the monitor filter settings panel is displayed on + views that support it (Console, Watch, Montage, Montage Review). + When set to 'Embedded in Left Sidebar' (default), the filter + panel is moved into the left sidebar extruder. This option only + takes effect when ZM_WEB_NAVBAR_TYPE is set to 'left'. When + the navbar is not on the left, filters use the standard + toggle icon regardless of this setting. + Setting this to 'inline' makes the filter panel always visible + at the top of the page. + `, + type => { + db_type => 'string', + hint => 'Embedded in Left Sidebar|inline', + pattern => qr|^([EiI])|i, + format => q( ($1 =~ /^i/i) ? 'inline' : 'sidebar' ) + }, + requires => [ { name=>'ZM_WEB_NAVBAR_TYPE', value=>'left' } ], + category => 'web', + }, { name => 'ZM_WEB_H_REFRESH_MAIN', default => '240', diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Control/ONVIF.pm b/scripts/ZoneMinder/lib/ZoneMinder/Control/ONVIF.pm index c0f18b33a..6fc223435 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Control/ONVIF.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Control/ONVIF.pm @@ -232,6 +232,19 @@ sub open { } } + # --- Credential fallback: ONVIF_Username/Password, then User/Pass ----- + if (!$$self{username}) { + if ($self->{Monitor}->{ONVIF_Username}) { + $$self{username} = $self->{Monitor}->{ONVIF_Username}; + $$self{password} = $self->{Monitor}->{ONVIF_Password} if $self->{Monitor}->{ONVIF_Password}; + Debug('Using ONVIF_Username/ONVIF_Password from Monitor'); + } elsif ($self->{Monitor}->{User}) { + $$self{username} = $self->{Monitor}->{User}; + $$self{password} = $self->{Monitor}->{Pass} if $self->{Monitor}->{Pass}; + Debug('Using User/Pass from Monitor'); + } + } + # --- Connectivity check (non-fatal) ------------------------------------ if ($$self{BaseURL}) { my $res = $self->sendCmd('/onvif/device_service', diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Monitor.pm b/scripts/ZoneMinder/lib/ZoneMinder/Monitor.pm index 3f1d668f0..f9c21daec 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Monitor.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Monitor.pm @@ -347,12 +347,20 @@ sub control { my $command = shift; my $process = shift; + my $valid_device = (defined $monitor->{Device} and $monitor->{Device} =~ /^\/dev\/[\w\/.\-]+$/); + if ($monitor->{Type} eq 'Local' and !$valid_device) { + Error("Invalid device path rejected: $monitor->{Device}"); + return; + } elsif (!$valid_device and defined $monitor->{Device} and length($monitor->{Device})) { + Warning("Monitor $$monitor{Id} has invalid device path: $monitor->{Device}"); + } + if ($command eq 'stop') { if ($process) { ZoneMinder::General::runCommand("zmdc.pl stop $process -m $$monitor{Id}"); } else { if ($monitor->{Type} eq 'Local') { - ZoneMinder::General::runCommand('zmdc.pl stop zmc -d '.$monitor->{Device}); + ZoneMinder::General::runCommand("zmdc.pl stop zmc -d '$monitor->{Device}'"); } else { ZoneMinder::General::runCommand('zmdc.pl stop zmc -m '.$monitor->{Id}); } @@ -362,7 +370,7 @@ sub control { ZoneMinder::General::runCommand("zmdc.pl start $process -m $$monitor{Id}"); } else { if ($monitor->{Type} eq 'Local') { - ZoneMinder::General::runCommand('zmdc.pl start zmc -d '.$monitor->{Device}); + ZoneMinder::General::runCommand("zmdc.pl start zmc -d '$monitor->{Device}'"); } else { ZoneMinder::General::runCommand('zmdc.pl start zmc -m '.$monitor->{Id}); } @@ -372,7 +380,7 @@ sub control { ZoneMinder::General::runCommand("zmdc.pl restart $process -m $$monitor{Id}"); } else { if ($monitor->{Type} eq 'Local') { - ZoneMinder::General::runCommand('zmdc.pl restart zmc -d '.$monitor->{Device}); + ZoneMinder::General::runCommand("zmdc.pl restart zmc -d '$monitor->{Device}'"); } else { ZoneMinder::General::runCommand('zmdc.pl restart zmc -m '.$monitor->{Id}); } @@ -498,7 +506,11 @@ sub zmcControl { if ((!$ZoneMinder::Config{ZM_SERVER_ID}) or ( $$self{ServerId} and ($ZoneMinder::Config{ZM_SERVER_ID}==$$self{ServerId}) )) { if ($$self{Type} eq 'Local') { - $zmcArgs .= '-d '.$self->{Device}; + if (!defined $$self{Device} or $$self{Device} !~ /^\/dev\/[\w\/.\-]+$/) { + Error("Invalid device path rejected: $$self{Device}"); + return; + } + $zmcArgs .= "-d '$$self{Device}'"; } else { $zmcArgs .= '-m '.$self->{Id}; } diff --git a/scripts/zmpkg.pl.in b/scripts/zmpkg.pl.in index 0bb22a9a9..0f97e6d80 100644 --- a/scripts/zmpkg.pl.in +++ b/scripts/zmpkg.pl.in @@ -211,7 +211,11 @@ if ( $command =~ /^(?:start|restart)$/ ) { foreach my $monitor (@monitors) { if (($monitor->{Capturing} ne 'None') and ($monitor->{Type} ne 'WebSite')) { if ( $monitor->{Type} eq 'Local' ) { - runCommand("zmdc.pl start zmc -d $monitor->{Device}"); + if ($monitor->{Device} !~ /^\/dev\/[\w\/.\-]+$/) { + Error("Invalid device path rejected for monitor $monitor->{Id}: $monitor->{Device}"); + next; + } + runCommand("zmdc.pl start zmc -d '$monitor->{Device}'"); } else { runCommand("zmdc.pl start zmc -m $monitor->{Id}"); } diff --git a/src/zm_ffmpeg_input.cpp b/src/zm_ffmpeg_input.cpp index 130e54d32..51d6e7a37 100644 --- a/src/zm_ffmpeg_input.cpp +++ b/src/zm_ffmpeg_input.cpp @@ -44,8 +44,13 @@ int FFmpeg_Input::Open(const char *filepath) { /** Open the input file to read from it. */ error = avformat_open_input(&input_format_context, filepath, nullptr, nullptr); if ( error < 0 ) { - Error("Could not open input file '%s' (error '%s')", - filepath, av_make_error_string(error).c_str()); + if (std::string(filepath).find("incomplete") != std::string::npos) { + Warning("Could not open input file '%s' (error '%s')", + filepath, av_make_error_string(error).c_str()); + } else { + Error("Could not open input file '%s' (error '%s')", + filepath, av_make_error_string(error).c_str()); + } input_format_context = nullptr; return error; } diff --git a/src/zm_group_permission.cpp b/src/zm_group_permission.cpp index 7a5e200c8..2f6df4a92 100644 --- a/src/zm_group_permission.cpp +++ b/src/zm_group_permission.cpp @@ -81,6 +81,22 @@ std::vector Group_Permission::find(int p_user_id) { return results; } +std::vector Group_Permission::findByRole(int role_id) { + std::vector results; + std::string sql = stringtf("SELECT `Id`,`RoleId`,`GroupId`,`Permission`+0 FROM Role_Groups_Permissions WHERE `RoleId`='%d'", role_id); + + MYSQL_RES *result = zmDbFetch(sql.c_str()); + + if (result) { + results.reserve(mysql_num_rows(result)); + while (MYSQL_ROW dbrow = mysql_fetch_row(result)) { + results.push_back(Group_Permission(dbrow)); + } + mysql_free_result(result); + } + return results; +} + void Group_Permission::loadMonitorIds() { Group group(group_id); monitor_ids = group.MonitorIds(); diff --git a/src/zm_group_permission.h b/src/zm_group_permission.h index a57bc13ff..71eca75b1 100644 --- a/src/zm_group_permission.h +++ b/src/zm_group_permission.h @@ -57,6 +57,7 @@ class Group_Permission { void loadMonitorIds(); static std::vector find(int p_user_id); + static std::vector findByRole(int role_id); }; #endif // ZM_GROUP_PERMISSION_H diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index 6c42e8910..470a02135 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -741,8 +741,10 @@ void Monitor::Load(MYSQL_ROW dbrow, bool load_zones=true, Purpose p = QUERY) { startup_delay = dbrow[col] ? atoi(dbrow[col]) : 0; col++; - // How many frames we need to have before we start analysing - ready_count = std::max(warmup_count, pre_event_count); + // How many frames we need to have before we start analysing. + // Must account for alarm_frame_count because openEvent walks back + // max(pre_event_count, alarm_frame_count) frames from the analysis point. + ready_count = std::max({warmup_count, pre_event_count, alarm_frame_count}); //shared_data->image_count = 0; last_alarm_count = 0; diff --git a/src/zm_monitor_permission.cpp b/src/zm_monitor_permission.cpp index b71d8d63e..6b7df93e5 100644 --- a/src/zm_monitor_permission.cpp +++ b/src/zm_monitor_permission.cpp @@ -60,3 +60,19 @@ std::vector Monitor_Permission::find(int p_user_id) { } return results; } + +std::vector Monitor_Permission::findByRole(int role_id) { + std::vector results; + std::string sql = stringtf("SELECT `Id`,`RoleId`,`MonitorId`,`Permission`+0 FROM Role_Monitors_Permissions WHERE `RoleId`='%d'", role_id); + + MYSQL_RES *result = zmDbFetch(sql.c_str()); + + if (result) { + results.reserve(mysql_num_rows(result)); + while (MYSQL_ROW dbrow = mysql_fetch_row(result)) { + results.push_back(Monitor_Permission(dbrow)); + } + mysql_free_result(result); + } + return results; +} diff --git a/src/zm_monitor_permission.h b/src/zm_monitor_permission.h index 2da3f6c6d..1f369483a 100644 --- a/src/zm_monitor_permission.h +++ b/src/zm_monitor_permission.h @@ -52,6 +52,7 @@ class Monitor_Permission { Permission getPermission() const { return permission; } static std::vector find(int p_user_id); + static std::vector findByRole(int role_id); }; #endif // ZM_MOnitor_PERMISSION_H diff --git a/src/zm_monitorstream.cpp b/src/zm_monitorstream.cpp index f153a6ef3..59a01911d 100644 --- a/src/zm_monitorstream.cpp +++ b/src/zm_monitorstream.cpp @@ -255,6 +255,7 @@ void MonitorStream::processCommand(const CmdMsg *msg) { bool forced; int score; int analysing; + bool analysis_image; } status_data; status_data.id = monitor->Id(); @@ -302,7 +303,10 @@ void MonitorStream::processCommand(const CmdMsg *msg) { status_data.delay = FPSeconds(now - last_frame_sent).count(); status_data.zoom = zoom; status_data.scale = scale; - Debug(2, "viewing fps: %.2f capture_fps: %.2f analysis_fps: %.2f Buffer Level:%d, Delayed:%d, Paused:%d, Rate:%d, delay:%.3f, Zoom:%d, Enabled:%d Forced:%d score: %d", + status_data.analysis_image = (frame_type == FRAME_ANALYSIS) && + monitor->ShmValid() && + (monitor->Analysing() != Monitor::ANALYSING_NONE); + Debug(2, "viewing fps: %.2f capture_fps: %.2f analysis_fps: %.2f Buffer Level:%d, Delayed:%d, Paused:%d, Rate:%d, delay:%.3f, Zoom:%d, Enabled:%d Forced:%d score: %d analysis_image: %d", status_data.fps, status_data.capture_fps, status_data.analysis_fps, @@ -314,7 +318,8 @@ void MonitorStream::processCommand(const CmdMsg *msg) { status_data.zoom, status_data.enabled, status_data.forced, - status_data.score + status_data.score, + status_data.analysis_image ); DataMsg status_msg; diff --git a/src/zm_user.cpp b/src/zm_user.cpp index 495317cfd..9aedcbe80 100644 --- a/src/zm_user.cpp +++ b/src/zm_user.cpp @@ -25,7 +25,7 @@ #include "zm_utils.h" #include -User::User() : id(0), enabled(false) { +User::User() : id(0), enabled(false), role_id(0) { username[0] = password[0] = 0; stream = events = control = monitors = system = PERM_NONE; } @@ -41,8 +41,15 @@ User::User(const MYSQL_ROW &dbrow) { control = (Permission)atoi(dbrow[index++]); monitors = (Permission)atoi(dbrow[index++]); system = (Permission)atoi(dbrow[index++]); + role_id = atoi(dbrow[index++]); monitor_permissions_loaded = false; group_permissions_loaded = false; + role_monitor_permissions_loaded = false; + role_group_permissions_loaded = false; + + if (role_id > 0) { + loadRoleBasePermissions(); + } } User::~User() { @@ -58,10 +65,15 @@ void User::Copy(const User &u) { control = u.control; monitors = u.monitors; system = u.system; + role_id = u.role_id; monitor_permissions_loaded = u.monitor_permissions_loaded; monitor_permissions = u.monitor_permissions; group_permissions_loaded = u.group_permissions_loaded; group_permissions = u.group_permissions; + role_monitor_permissions_loaded = u.role_monitor_permissions_loaded; + role_monitor_permissions = u.role_monitor_permissions; + role_group_permissions_loaded = u.role_group_permissions_loaded; + role_group_permissions = u.role_group_permissions; } void User::loadMonitorPermissions() { @@ -76,6 +88,48 @@ void User::loadGroupPermissions() { Debug(1, "# of Group_Permissions %zu", group_permissions.size()); } +void User::loadRoleBasePermissions() { + std::string sql = stringtf("SELECT `Stream`+0, `Events`+0, `Control`+0, `Monitors`+0, `System`+0" + " FROM `User_Roles` WHERE `Id` = %d", role_id); + MYSQL_RES *result = zmDbFetch(sql); + if (!result) return; + if (mysql_num_rows(result) != 1) { + mysql_free_result(result); + return; + } + MYSQL_ROW dbrow = mysql_fetch_row(result); + Permission role_stream = (Permission)atoi(dbrow[0]); + Permission role_events = (Permission)atoi(dbrow[1]); + Permission role_control = (Permission)atoi(dbrow[2]); + Permission role_monitors = (Permission)atoi(dbrow[3]); + Permission role_system = (Permission)atoi(dbrow[4]); + mysql_free_result(result); + + // Use role permission as fallback when user permission is PERM_NONE + if (stream == PERM_NONE && role_stream > PERM_NONE) stream = role_stream; + if (events == PERM_NONE && role_events > PERM_NONE) events = role_events; + if (control == PERM_NONE && role_control > PERM_NONE) control = role_control; + if (monitors == PERM_NONE && role_monitors > PERM_NONE) monitors = role_monitors; + if (system == PERM_NONE && role_system > PERM_NONE) system = role_system; + + Debug(1, "Merged role %d base permissions: stream=%d events=%d control=%d monitors=%d system=%d", + role_id, stream, events, control, monitors, system); +} + +void User::loadRoleMonitorPermissions() { + for (const Monitor_Permission &p : Monitor_Permission::findByRole(role_id)) { + role_monitor_permissions[p.MonitorId()] = p; + } + role_monitor_permissions_loaded = true; + Debug(1, "# of Role_Monitor_Permissions %zu", role_monitor_permissions.size()); +} + +void User::loadRoleGroupPermissions() { + role_group_permissions = Group_Permission::findByRole(role_id); + role_group_permissions_loaded = true; + Debug(1, "# of Role_Group_Permissions %zu", role_group_permissions.size()); +} + bool User::canAccess(int monitor_id) { if (!monitor_permissions_loaded) loadMonitorPermissions(); auto it = monitor_permissions.find(monitor_id); @@ -124,6 +178,56 @@ bool User::canAccess(int monitor_id) { } } // end foreach Group_Permission + // Check role permissions if user has a role + if (role_id > 0) { + if (!role_monitor_permissions_loaded) loadRoleMonitorPermissions(); + auto rit = role_monitor_permissions.find(monitor_id); + + if (rit != role_monitor_permissions.end()) { + auto permission = rit->second.getPermission(); + switch (permission) { + case Monitor_Permission::PERM_NONE : + Debug(1, "Returning None from role_monitor_permission"); + return false; + case Monitor_Permission::PERM_VIEW : + Debug(1, "Returning true because VIEW from role_monitor_permission"); + return true; + case Monitor_Permission::PERM_EDIT : + Debug(1, "Returning true because EDIT from role_monitor_permission"); + return true; + case Monitor_Permission::PERM_INHERIT : + Debug(1, "INHERIT from role_monitor_permission"); + break; + default: + Warning("UNKNOWN permission %d from role_monitor_permission", permission); + break; + } + } + + if (!role_group_permissions_loaded) loadRoleGroupPermissions(); + + for (Group_Permission &gp : role_group_permissions) { + auto permission = gp.getPermission(monitor_id); + switch (permission) { + case Group_Permission::PERM_NONE : + Debug(1, "Returning None from role_group_permission"); + return false; + case Group_Permission::PERM_VIEW : + Debug(1, "Returning true because VIEW from role_group_permission"); + return true; + case Group_Permission::PERM_EDIT : + Debug(1, "Returning true because EDIT from role_group_permission"); + return true; + case Group_Permission::PERM_INHERIT : + Debug(1, "INHERIT from role_group_permission %d", gp.GroupId()); + break; + default : + Warning("UNKNOWN permission %d from role_group_permission %d", permission, gp.GroupId()); + break; + } + } // end foreach role Group_Permission + } // end if role_id + return (monitors != PERM_NONE); } @@ -131,7 +235,8 @@ User *User::find(const std::string &username) { std::string escaped_username = zmDbEscapeString(username); std::string sql = stringtf("SELECT `Id`, `Username`, `Password`, `Enabled`," - " `Stream`+0, `Events`+0, `Control`+0, `Monitors`+0, `System`+0" + " `Stream`+0, `Events`+0, `Control`+0, `Monitors`+0, `System`+0," + " COALESCE(`RoleId`, 0)" " FROM `Users` WHERE `Username` = '%s' AND `Enabled` = 1", escaped_username.c_str()); MYSQL_RES *result = zmDbFetch(sql); @@ -149,7 +254,8 @@ User *User::find(const std::string &username) { User *User::find(int id) { std::string sql = stringtf("SELECT `Id`, `Username`, `Password`, `Enabled`," - " `Stream`+0, `Events`+0, `Control`+0, `Monitors`+0, `System`+0" + " `Stream`+0, `Events`+0, `Control`+0, `Monitors`+0, `System`+0," + " COALESCE(`RoleId`, 0)" " FROM `Users` WHERE `Id` = %d AND `Enabled` = 1", id); MYSQL_RES *result = zmDbFetch(sql); @@ -229,7 +335,8 @@ User *zmLoadTokenUser(const std::string &jwt_token_str, bool use_remote_addr) { } std::string sql = stringtf("SELECT `Id`, `Username`, `Password`, `Enabled`, `Stream`+0, `Events`+0," - " `Control`+0, `Monitors`+0, `System`+0, `TokenMinExpiry`" + " `Control`+0, `Monitors`+0, `System`+0, COALESCE(`RoleId`, 0)," + " `TokenMinExpiry`" " FROM `Users` WHERE `Username` = '%s' AND `Enabled` = 1", username.c_str()); MYSQL_RES *result = zmDbFetch(sql); @@ -274,7 +381,8 @@ User *zmLoadAuthUser(const std::string &auth, const std::string &username, bool Debug(1, "Attempting to authenticate user %s from auth string '%s', remote addr(%s)", username.c_str(), auth.c_str(), remote_addr); std::string sql = "SELECT `Id`, `Username`, `Password`, `Enabled`," - " `Stream`+0, `Events`+0, `Control`+0, `Monitors`+0, `System`+0" + " `Stream`+0, `Events`+0, `Control`+0, `Monitors`+0, `System`+0," + " COALESCE(`RoleId`, 0)" " FROM `Users` WHERE `Enabled` = 1"; if (!username.empty()) { sql += " AND `Username`='"+zmDbEscapeString(username)+"'"; diff --git a/src/zm_user.h b/src/zm_user.h index b492bb444..e79641b2c 100644 --- a/src/zm_user.h +++ b/src/zm_user.h @@ -44,6 +44,7 @@ class User { Permission control; Permission monitors; Permission system; + int role_id; bool group_permissions_loaded; std::vector group_permissions; @@ -51,6 +52,12 @@ class User { bool monitor_permissions_loaded; std::map monitor_permissions; + bool role_group_permissions_loaded; + std::vector role_group_permissions; + + bool role_monitor_permissions_loaded; + std::map role_monitor_permissions; + public: User(); explicit User(const MYSQL_ROW &dbrow); @@ -78,6 +85,9 @@ class User { void loadMonitorPermissions(); void loadGroupPermissions(); + void loadRoleBasePermissions(); + void loadRoleMonitorPermissions(); + void loadRoleGroupPermissions(); }; User *zmLoadUser(const std::string&username, const std::string &password=""); diff --git a/src/zm_videostore.cpp b/src/zm_videostore.cpp index 6fd634773..f69f38743 100644 --- a/src/zm_videostore.cpp +++ b/src/zm_videostore.cpp @@ -1497,7 +1497,7 @@ int VideoStore::write_packet(AVPacket *pkt, AVStream *stream) { Debug(1, "non increasing dts, fixing. our dts %" PRId64 " stream %d last_dts %" PRId64 " stream %d. reorder_queue_size=%zu", pkt->dts, stream->index, last_dts[stream->index], stream->index, reorder_queue_size); // dts MUST monotonically increase, so add 1 which should be a small enough time difference to not matter. - pkt->dts = last_dts[stream->index]+last_duration[stream->index]; + pkt->dts = last_dts[stream->index]+1; if (pkt->dts > pkt->pts) pkt->pts = pkt->dts; // Do it here to avoid warning below } } diff --git a/src/zm_zone.cpp b/src/zm_zone.cpp index bff7dff09..47e390030 100644 --- a/src/zm_zone.cpp +++ b/src/zm_zone.cpp @@ -956,21 +956,21 @@ std::vector Zone::Load(const std::shared_ptr &monitor) { col++; int MaxPixelThreshold = dbrow[col]?atoi(dbrow[col]):0; col++; - int MinAlarmPixels = dbrow[col]?atoi(dbrow[col]):0; + double MinAlarmPixels_pct = dbrow[col] ? atof(dbrow[col]) : 0; col++; - int MaxAlarmPixels = dbrow[col]?atoi(dbrow[col]):0; + double MaxAlarmPixels_pct = dbrow[col] ? atof(dbrow[col]) : 0; col++; int FilterX = dbrow[col]?atoi(dbrow[col]):0; col++; int FilterY = dbrow[col]?atoi(dbrow[col]):0; col++; - int MinFilterPixels = dbrow[col]?atoi(dbrow[col]):0; + double MinFilterPixels_pct = dbrow[col] ? atof(dbrow[col]) : 0; col++; - int MaxFilterPixels = dbrow[col]?atoi(dbrow[col]):0; + double MaxFilterPixels_pct = dbrow[col] ? atof(dbrow[col]) : 0; col++; - int MinBlobPixels = dbrow[col]?atoi(dbrow[col]):0; + double MinBlobPixels_pct = dbrow[col] ? atof(dbrow[col]) : 0; col++; - int MaxBlobPixels = dbrow[col]?atoi(dbrow[col]):0; + double MaxBlobPixels_pct = dbrow[col] ? atof(dbrow[col]) : 0; col++; int MinBlobs = dbrow[col]?atoi(dbrow[col]):0; col++; @@ -984,60 +984,47 @@ std::vector Zone::Load(const std::shared_ptr &monitor) { /* HTML colour code is actually BGR in memory, we want RGB */ AlarmRGB = rgb_convert(AlarmRGB, ZM_SUBPIX_ORDER_BGR); + // Auto-detect coordinate format: decimal points mean percentages, + // integer-only means legacy pixel values. Units field is not trusted. Debug(5, "Parsing polygon %s (Units=%s)", Coords, Units); Polygon polygon; - if (!strcmp(Units, "Pixels")) { - // Legacy pixel-based coordinates: parse as integer pixel values - if (!ParsePolygonString(Coords, polygon)) { + if (strchr(Coords, '.')) { + // Decimal values present — treat as percentages regardless of Units field + if (!ParsePercentagePolygon(Coords, monitor->Width(), monitor->Height(), polygon)) { Error("Unable to parse polygon string '%s' for zone %d/%s for monitor %s, ignoring", Coords, Id, Name, monitor->Name()); continue; } } else { - // Percentage-based coordinates (default): convert to pixels using monitor dimensions. - // However, if any coordinate value exceeds 100, these are actually pixel values - // stored with incorrect Units — fall back to pixel parsing with a warning. - bool has_pixel_values = false; - { - const char *s = Coords; - while (*s != '\0') { - double val = strtod(s, nullptr); - if (val > 100.0) { - has_pixel_values = true; - break; - } - // Skip to next number: find comma then space (x,y pairs separated by spaces) - const char *comma = strchr(s, ','); - if (!comma) break; - val = strtod(comma + 1, nullptr); - if (val > 100.0) { - has_pixel_values = true; - break; - } - const char *space = strchr(comma + 1, ' '); - if (space) { - s = space + 1; - } else { - break; - } - } - } - - if (has_pixel_values) { - Debug(1, "Zone %d/%s has Units=Percent but Coords contain pixel values (>100), " - "parsing as pixels instead", Id, Name); - if (!ParsePolygonString(Coords, polygon)) { - Error("Unable to parse polygon string '%s' for zone %d/%s for monitor %s, ignoring", - Coords, Id, Name, monitor->Name()); - continue; - } - } else if (!ParsePercentagePolygon(Coords, monitor->Width(), monitor->Height(), polygon)) { + // Integer-only coordinates — treat as pixel values + if (!ParsePolygonString(Coords, polygon)) { Error("Unable to parse polygon string '%s' for zone %d/%s for monitor %s, ignoring", Coords, Id, Name, monitor->Name()); continue; } } + // Convert threshold values from DB format to pixel counts for runtime use. + // Percentage coordinates: thresholds are stored as % of zone area, convert to pixels. + // Legacy pixel coordinates: thresholds are already pixel counts. + int MinAlarmPixels, MaxAlarmPixels, MinFilterPixels, MaxFilterPixels, MinBlobPixels, MaxBlobPixels; + if (strchr(Coords, '.') && polygon.Area() > 0) { + int zpa = polygon.Area(); + MinAlarmPixels = MinAlarmPixels_pct > 0 ? static_cast(MinAlarmPixels_pct * zpa / 100.0 + 0.5) : 0; + MaxAlarmPixels = MaxAlarmPixels_pct > 0 ? static_cast(MaxAlarmPixels_pct * zpa / 100.0 + 0.5) : 0; + MinFilterPixels = MinFilterPixels_pct > 0 ? static_cast(MinFilterPixels_pct * zpa / 100.0 + 0.5) : 0; + MaxFilterPixels = MaxFilterPixels_pct > 0 ? static_cast(MaxFilterPixels_pct * zpa / 100.0 + 0.5) : 0; + MinBlobPixels = MinBlobPixels_pct > 0 ? static_cast(MinBlobPixels_pct * zpa / 100.0 + 0.5) : 0; + MaxBlobPixels = MaxBlobPixels_pct > 0 ? static_cast(MaxBlobPixels_pct * zpa / 100.0 + 0.5) : 0; + } else { + MinAlarmPixels = static_cast(MinAlarmPixels_pct); + MaxAlarmPixels = static_cast(MaxAlarmPixels_pct); + MinFilterPixels = static_cast(MinFilterPixels_pct); + MaxFilterPixels = static_cast(MaxFilterPixels_pct); + MinBlobPixels = static_cast(MinBlobPixels_pct); + MaxBlobPixels = static_cast(MaxBlobPixels_pct); + } + if (atoi(dbrow[2]) == Zone::INACTIVE) { zones.emplace_back(monitor, Id, Name, polygon); } else if (atoi(dbrow[2]) == Zone::PRIVACY) { diff --git a/tests/zm_zone.cpp b/tests/zm_zone.cpp index ac8fc3cf6..a56d0cd45 100644 --- a/tests/zm_zone.cpp +++ b/tests/zm_zone.cpp @@ -220,3 +220,106 @@ TEST_CASE("Zone: pixel values through ParsePercentagePolygon produce wrong resul REQUIRE(verts[1] == Vector2(static_cast(width), 0)); REQUIRE(verts[2] == Vector2(static_cast(width), static_cast(height))); } + +// --- Auto-detect format tests --- +// The zone loader uses strchr(Coords, '.') to decide format: +// decimal point present -> ParsePercentagePolygon +// no decimal point -> ParsePolygonString (legacy pixels) +// These tests verify both parsers handle the inputs they'll receive +// under auto-detection, and document the broken case that auto-detection prevents. + +TEST_CASE("Zone: ParsePolygonString truncates decimal coords via atoi", "[Zone]") { + // This is the bug that broke motion detection: percentage coords like + // "0.00,0.00 99.96,0.00 99.96,99.93 0.00,99.93" parsed by + // ParsePolygonString (which uses atoi) get truncated to a 99x99 pixel zone + Polygon polygon; + bool ok = Zone::ParsePolygonString("0.00,0.00 99.96,0.00 99.96,99.93 0.00,99.93", polygon); + REQUIRE(ok); + + auto const &verts = polygon.GetVertices(); + REQUIRE(verts.size() == 4); + // atoi("99.96") = 99, atoi("99.93") = 99 + // On a 2560x1440 monitor this would be a 99x99 pixel zone — essentially no coverage + REQUIRE(verts[1] == Vector2(99, 0)); + REQUIRE(verts[2] == Vector2(99, 99)); +} + +TEST_CASE("Zone: decimal coords through ParsePercentagePolygon give correct pixels", "[Zone]") { + // Same coords as above, but correctly routed to ParsePercentagePolygon + // by the auto-detect logic (decimal point present) + Polygon polygon; + unsigned int width = 2560; + unsigned int height = 1440; + + bool ok = Zone::ParsePercentagePolygon( + "0.00,0.00 99.96,0.00 99.96,99.93 0.00,99.93", width, height, polygon); + REQUIRE(ok); + + auto const &verts = polygon.GetVertices(); + REQUIRE(verts.size() == 4); + // 99.96% of 2560 = 2558.976 -> 2559 + REQUIRE(verts[1].x_ == 2559); + REQUIRE(verts[1].y_ == 0); + // 99.93% of 1440 = 1438.992 -> 1439 + REQUIRE(verts[2].x_ == 2559); + REQUIRE(verts[2].y_ == 1439); +} + +TEST_CASE("Zone: integer pixel coords stay as pixels", "[Zone]") { + // Legacy integer-only coords should be parsed as raw pixel values + // Auto-detect: no decimal point -> ParsePolygonString + Polygon polygon; + bool ok = Zone::ParsePolygonString("0,0 2559,0 2559,1439 0,1439", polygon); + REQUIRE(ok); + + auto const &verts = polygon.GetVertices(); + REQUIRE(verts.size() == 4); + REQUIRE(verts[0] == Vector2(0, 0)); + REQUIRE(verts[1] == Vector2(2559, 0)); + REQUIRE(verts[2] == Vector2(2559, 1439)); + REQUIRE(verts[3] == Vector2(0, 1439)); +} + +TEST_CASE("Zone: auto-detect heuristic — strchr for decimal point", "[Zone]") { + // Verify the heuristic used by the zone loader: + // strchr(coords, '.') distinguishes percentage from pixel coords + + // Percentage coords always have decimal points from round(..., 2) + const char *pct_coords = "0.00,0.00 99.96,0.00 99.96,99.93 0.00,99.93"; + REQUIRE(strchr(pct_coords, '.') != nullptr); + + // Legacy pixel coords are always integers + const char *px_coords = "0,0 2559,0 2559,1439 0,1439"; + REQUIRE(strchr(px_coords, '.') == nullptr); + + // Edge case: small pixel zone that looks like it could be percentages + // but has no decimal points — correctly detected as pixels + const char *small_px = "0,0 50,0 50,50 0,50"; + REQUIRE(strchr(small_px, '.') == nullptr); +} + +TEST_CASE("Zone: percentage coords at various resolutions", "[Zone]") { + Polygon polygon; + + // The same percentage zone should produce proportional pixel coords + // regardless of monitor resolution + const char *coords = "10.00,20.00 90.00,20.00 90.00,80.00 10.00,80.00"; + + SECTION("640x480") { + bool ok = Zone::ParsePercentagePolygon(coords, 640, 480, polygon); + REQUIRE(ok); + auto const &v = polygon.GetVertices(); + REQUIRE(v[0] == Vector2(64, 96)); // 10% of 640, 20% of 480 + REQUIRE(v[1] == Vector2(576, 96)); // 90% of 640 + REQUIRE(v[2] == Vector2(576, 384)); // 80% of 480 + } + + SECTION("3840x2160 (4K)") { + bool ok = Zone::ParsePercentagePolygon(coords, 3840, 2160, polygon); + REQUIRE(ok); + auto const &v = polygon.GetVertices(); + REQUIRE(v[0] == Vector2(384, 432)); // 10% of 3840, 20% of 2160 + REQUIRE(v[1] == Vector2(3456, 432)); // 90% of 3840 + REQUIRE(v[2] == Vector2(3456, 1728)); // 80% of 2160 + } +} diff --git a/utils/do_debian_package.sh b/utils/do_debian_package.sh index b1cd6922d..207f244f9 100755 --- a/utils/do_debian_package.sh +++ b/utils/do_debian_package.sh @@ -315,7 +315,7 @@ EOF sudo apt-get install devscripts equivs sudo mk-build-deps -ir $DIRECTORY.orig/debian/control echo "Status: $?" - DEBUILD=debuild + DEBUILD=debuild -b -uc -us else if [ $TYPE == "local" ]; then # Auto-install all ZoneMinder's dependencies using the Debian control file diff --git a/version.txt b/version.txt index 0c11aad2f..d707557d2 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.39.1 +1.39.3 diff --git a/web/ajax/log.php b/web/ajax/log.php index 6d0d974ec..117cc82d9 100644 --- a/web/ajax/log.php +++ b/web/ajax/log.php @@ -22,6 +22,17 @@ if (!isset($_REQUEST['task'])) { } else { createRequest(); } +} else if ($_REQUEST['task'] == 'delete') { + global $user; + if (!canEdit('System')) { + $message = 'Insufficient permissions to delete log entries for user '.$user->Username(); + } else { + if (!empty($_REQUEST['ids'])) { + $ids = array_map('intval', (array)$_REQUEST['ids']); + $placeholders = implode(',', array_fill(0, count($ids), '?')); + dbQuery('DELETE FROM Logs WHERE Id IN (' . $placeholders . ')', $ids); + } + } } else { // Only the query and create tasks are supported at the moment $message = 'Unrecognised task '.$_REQUEST['task']; @@ -80,8 +91,7 @@ function queryRequest() { $table = 'Logs'; // The names of the dB columns in the log table we are interested in - $columns = array('TimeKey', 'Component', 'ServerId', 'Pid', 'Code', 'Message', 'File', 'Line'); - + $columns = array('Id', 'TimeKey', 'Component', 'ServerId', 'Pid', 'Code', 'Message', 'File', 'Line'); // The names of columns shown in the log view that are NOT dB columns in the database $col_alt = array('DateTime', 'Server'); diff --git a/web/ajax/modals/clearlogsconfirm.php b/web/ajax/modals/clearlogsconfirm.php new file mode 100644 index 000000000..571aff0cd --- /dev/null +++ b/web/ajax/modals/clearlogsconfirm.php @@ -0,0 +1,23 @@ + + diff --git a/web/ajax/modals/filterdebug.php b/web/ajax/modals/filterdebug.php index ec8022a10..f0dd63a1e 100644 --- a/web/ajax/modals/filterdebug.php +++ b/web/ajax/modals/filterdebug.php @@ -16,7 +16,7 @@ if ($fid) { $filter = new ZM\Filter($fid); if (!$filter->Id()) { - echo '
Filter not found for id '.$_REQUEST['fid'].'
'; + echo '
Filter not found for id '.$fid.'
'; } } else { $filter = new ZM\Filter(); diff --git a/web/ajax/stream.php b/web/ajax/stream.php index fd4ffb1d3..6f8c77593 100644 --- a/web/ajax/stream.php +++ b/web/ajax/stream.php @@ -151,7 +151,7 @@ default : $data = unpack('ltype', $msg); switch ( $data['type'] ) { case MSG_DATA_WATCH : - $data = unpack('ltype/imonitor/istate/dfps/dcapturefps/danalysisfps/ilevel/irate/ddelay/izoom/iscale/Cdelayed/Cpaused/Cenabled/Cforced/iscore/ianalysing', $msg); + $data = unpack('ltype/imonitor/istate/dfps/dcapturefps/danalysisfps/ilevel/irate/ddelay/izoom/iscale/Cdelayed/Cpaused/Cenabled/Cforced/iscore/ianalysing/Canalysisimage', $msg); $data['fps'] = round( $data['fps'], 2 ); $data['capturefps'] = round( $data['capturefps'], 2 ); $data['analysisfps'] = round( $data['analysisfps'], 2 ); diff --git a/web/api/app/Controller/EventsController.php b/web/api/app/Controller/EventsController.php index e302ca5cc..cf81de629 100644 --- a/web/api/app/Controller/EventsController.php +++ b/web/api/app/Controller/EventsController.php @@ -396,7 +396,7 @@ class EventsController extends AppController { } $matches = NULL; $value = preg_replace('/^\s?interval\s?/i', '', $value); - if (preg_match('/^(?P[ -.:0-9\']+)\s+(?P[_a-z]+)$/i', trim($value), $matches) !== 1) { + if (preg_match('/^(?P[ \-.:0-9]+)\s+(?P[_a-z]+)$/i', trim($value), $matches) !== 1) { throw new Exception('Invalid interval: ' . $value); } $expr = trim($matches['expr']); @@ -429,7 +429,7 @@ class EventsController extends AppController { $matches = NULL; // https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals // Examples: `'1-1' YEAR_MONTH`, `'-1 10' DAY_HOUR`, `'1.999999' SECOND_MICROSECOND` - if (preg_match('/^(?P[ -.:0-9\']+)\s+(?P[_a-z]+)$/i', trim($interval), $matches) !== 1) { + if (preg_match('/^(?P[ \-.:0-9]+)\s+(?P[_a-z]+)$/i', trim($interval), $matches) !== 1) { throw new Exception('Invalid interval: ' . $interval); } $expr = trim($matches['expr']); diff --git a/web/api/app/Controller/HostController.php b/web/api/app/Controller/HostController.php index 58653e8d5..7e469f810 100644 --- a/web/api/app/Controller/HostController.php +++ b/web/api/app/Controller/HostController.php @@ -44,7 +44,7 @@ class HostController extends AppController { return; } # To try to prevent abuse here, we are only going to allow certain characters in the daemon and args. - $safe_daemon = preg_replace('/[^A-Za-z0-9\- \.]/', '', $daemon, -1, $count); + $safe_daemon = preg_replace('/[^A-Za-z0-9\-\.]/', '', $daemon, -1, $count); if ($count) Error("Invalid characters found in daemon string ($daemon). Potential attack?"); $safe_command = preg_replace('/[^a-z]/', '', $command, -1, $count); if ($count) Error("Invalid characters found in command string ($command). Potential attack?"); @@ -240,8 +240,8 @@ class HostController extends AppController { if ( $mid ) { // Get disk usage for $mid - ZM\Debug("Executing du -s0 $zm_dir_events/$mid | awk '{print $1}'"); - $usage = shell_exec("du -s0 $zm_dir_events/$mid | awk '{print $1}'"); + ZM\Debug("Executing du -s0 $zm_dir_events/$mid | awk '{print \$1}'"); + $usage = shell_exec("du -s0 ".escapeshellarg($zm_dir_events.'/'.$mid)." | awk '{print \$1}'"); } else { $monitors = $this->Monitor->find('all', array( 'fields' => array('Id', 'Name', 'WebColour') diff --git a/web/api/app/Controller/MonitorsController.php b/web/api/app/Controller/MonitorsController.php index 1feb901a0..660fd8c70 100644 --- a/web/api/app/Controller/MonitorsController.php +++ b/web/api/app/Controller/MonitorsController.php @@ -259,7 +259,7 @@ class MonitorsController extends AppController { global $user; $mToken = $this->request->query('token') ? $this->request->query('token') : $this->request->data('token');; if ($mToken) { - $auth = ' -T '.$mToken; + $auth = ' -T '.escapeshellarg($mToken); } else if (ZM_AUTH_RELAY == 'hashed') { $auth = ' -A '.calculateAuthHash(''); # Can't do REMOTE_IP because zmu doesn't normally have access to it. } else if (ZM_AUTH_RELAY == 'plain') { @@ -278,13 +278,17 @@ class MonitorsController extends AppController { $password = $_SESSION['password']; } - $auth = ' -U ' .$user->Username().' -P '.$password; + $auth = ' -U '.escapeshellarg($user->Username()).' -P '.escapeshellarg($password); } else if (ZM_AUTH_RELAY == 'none') { - $auth = ' -U ' .$user->Username(); + $auth = ' -U '.escapeshellarg($user->Username()); } } - - $shellcmd = escapeshellcmd(ZM_PATH_BIN."/zmu $verbose -m$id $q $auth"); + + $shellcmd = ZM_PATH_BIN.'/zmu' + .($verbose ? " $verbose" : '') + .' -m'.escapeshellarg($id) + ." $q" + .$auth; $status = exec($shellcmd, $output, $rc); ZM\Debug("Command: $shellcmd output: ".implode(PHP_EOL, $output)." rc: $rc"); if ($rc) { @@ -342,9 +346,9 @@ class MonitorsController extends AppController { // Pass -d for local, otherwise -m if ( $monitor[0]['Type'] == 'Local' ) { - $args = '-d '. $monitor[0]['Device']; + $args = '-d '. escapeshellarg($monitor[0]['Device']); } else { - $args = '-m '. $monitor[0]['Id']; + $args = '-m '. escapeshellarg($monitor[0]['Id']); } // Build the command, and execute it diff --git a/web/api/app/Model/Monitor.php b/web/api/app/Model/Monitor.php index 98a874904..8fdfb88a7 100644 --- a/web/api/app/Model/Monitor.php +++ b/web/api/app/Model/Monitor.php @@ -60,6 +60,14 @@ class Monitor extends AppModel { 'OutputCodec' => array ( 'rule' => array('inList', array (0,27,173,167,226)), 'message'=>'Invalid value. Should be one of these integer values: 0(auto), 27(h264), 173(h265/hvec), 167(vp9), 226(av1)' + ), + 'Device' => array( + 'validPath' => array( + 'rule' => array('custom', '#^(/dev/[\w/.\-]+)?$#'), + 'message' => 'Invalid device path. Must be a valid /dev/ path (e.g. /dev/video0).', + 'allowEmpty' => true, + 'required' => false, + ), ) ); @@ -183,11 +191,11 @@ class Monitor extends AppModel { foreach ($daemons as $daemon) { $args = ''; if ($daemon == 'zmc' and $monitor['Type'] == 'Local') { - $args = '-d ' . $monitor['Device']; + $args = '-d ' . escapeshellarg($monitor['Device']); } else if ($daemon == 'zmcontrol.pl') { - $args = '--id '.$monitor['Id']; + $args = '--id '.escapeshellarg($monitor['Id']); } else { - $args = '-m ' . $monitor['Id']; + $args = '-m ' . escapeshellarg($monitor['Id']); } $shellcmd = escapeshellcmd(ZM_PATH_BIN.'/zmdc.pl '.$command.' '.$daemon.' '.$args); diff --git a/web/includes/Event.php b/web/includes/Event.php index 3379b88d1..7b154f705 100644 --- a/web/includes/Event.php +++ b/web/includes/Event.php @@ -700,22 +700,20 @@ class Event extends ZM_Object { } function createVideo($format, $rate, $scale, $transform, $overwrite=false) { - $command = ZM_PATH_BIN.'/zmvideo.pl -e '.$this->{'Id'}.' -f '.$format.' -r '.sprintf('%.2F', ($rate/RATE_BASE)); - if (preg_match('/\d+x\d+/', $scale)) { - $command .= ' -S '.$scale; + $command = ZM_PATH_BIN.'/zmvideo.pl -e '.escapeshellarg($this->{'Id'}) + .' -f '.escapeshellarg(preg_replace('/[^\w]/', '', $format)) + .' -r '.escapeshellarg(sprintf('%.2F', ($rate/RATE_BASE))); + if (preg_match('/^\d+x\d+$/', $scale)) { + $command .= ' -S '.escapeshellarg($scale); } else { - if ( version_compare(phpversion(), '4.3.10', '>=') ) - $command .= ' -s '.sprintf('%.2F', ($scale/SCALE_BASE)); - else - $command .= ' -s '.sprintf('%.2f', ($scale/SCALE_BASE)); + $command .= ' -s '.escapeshellarg(sprintf('%.2F', ($scale/SCALE_BASE))); } if ($transform != '') { $transform = preg_replace('/[^\w=]/', '', $transform); - $command .= ' -t '.$transform; + $command .= ' -t '.escapeshellarg($transform); } if ($overwrite) $command .= ' -o'; - $command = escapeshellcmd($command); $result = exec($command, $output, $status); Debug("generating Video $command: result($result outptu:(".implode("\n", $output )." status($status"); return $status ? '' : rtrim($result); diff --git a/web/includes/FilterTerm.php b/web/includes/FilterTerm.php index c06beb3b2..7fe248b40 100644 --- a/web/includes/FilterTerm.php +++ b/web/includes/FilterTerm.php @@ -40,6 +40,12 @@ class FilterTerm { $this->attr = preg_replace('/[^A-Za-z0-9\.]/', '', $this->attr, -1, $count); if ($count) Error("Invalid characters removed from filter attr {$term['attr']}, possible hacking attempt."); $this->op = isset($term['op']) ? $term['op'] : '='; + $valid_ops = array('=', '!=', '>=', '<=', '>', '<', 'LIKE', 'NOT LIKE', '=~', '!~', + '=[]', '![]', 'IN', 'NOT IN', 'EXISTS', 'IS', 'IS NOT'); + if (!in_array($this->op, $valid_ops)) { + Warning('Invalid operator in filter term: ' . $this->op); + $this->op = '='; + } $this->val = isset($term['val']) ? $term['val'] : ''; if (is_array($this->val)) $this->val = implode(',', $this->val); if ( isset($term['cnj']) ) { @@ -71,7 +77,7 @@ class FilterTerm { } $this->cookie = isset($term['cookie']) ? $term['cookie'] : ''; $this->placeholder = isset($term['placeholder']) ? $term['placeholder'] : null; - $this->collate = isset($term['collate']) ? $term['collate'] : ''; + $this->collate = isset($term['collate']) ? preg_replace('/[^a-zA-Z0-9_]/', '', $term['collate']) : ''; $this->multiple = isset($term['multiple']) ? $term['multiple'] : ''; $this->chosen = isset($term['chosen']) ? $term['chosen'] : ''; @@ -80,6 +86,21 @@ class FilterTerm { } } # end function __construct + private function compare($left, $op, $right) { + $right = floatval($right); + switch ($op) { + case '=': return $left == $right; + case '!=': return $left != $right; + case '>': return $left > $right; + case '>=': return $left >= $right; + case '<': return $left < $right; + case '<=': return $left <= $right; + default: + Warning("Invalid operator '$op' in compare"); + return false; + } + } + # Returns an array of values. AS term->value can be a list, we will break it apart, remove quotes etc public function sql_values() { $values = array(); @@ -97,7 +118,7 @@ class FilterTerm { $value = $group->MonitorIds(); break; case 'AlarmedZoneId': - $value = '(SELECT * FROM Stats WHERE EventId=E.Id AND ZoneId='.$value.' AND Score > 0 LIMIT 1)'; + $value = '(SELECT * FROM Stats WHERE EventId=E.Id AND ZoneId='.intval($value).' AND Score > 0 LIMIT 1)'; break; case 'ExistsInFileSystem': $value = ''; @@ -433,16 +454,9 @@ class FilterTerm { } } # end foreach Storage Area } else if ( $this->attr == 'SystemLoad' ) { - $string_to_eval = 'return getLoad() '.$this->op.' '.$this->val.';'; - try { - $ret = eval($string_to_eval); - Debug("Evaled $string_to_eval = $ret"); - if ( $ret ) - return true; - } catch ( Throwable $t ) { - Error('Failed evaluating '.$string_to_eval); - return false; - } + $ret = $this->compare(getLoad(), $this->op, $this->val); + Debug("SystemLoad compare: getLoad() {$this->op} {$this->val} = " . ($ret ? 'true' : 'false')); + if ($ret) return true; } else { Error('testing unsupported pre term ' . $this->attr); } @@ -459,27 +473,13 @@ class FilterTerm { return !file_exists($event->Path()); } } else if ( $this->attr == 'DiskPercent' ) { - $string_to_eval = 'return $event->Storage()->disk_usage_percent() '.$this->op.' '.$this->val.';'; - try { - $ret = eval($string_to_eval); - Debug("Evalled $string_to_eval = $ret"); - if ( $ret ) - return true; - } catch ( Throwable $t ) { - Error('Failed evaluating '.$string_to_eval); - return false; - } + $ret = $this->compare($event->Storage()->disk_usage_percent(), $this->op, $this->val); + Debug("DiskPercent compare: " . ($ret ? 'true' : 'false')); + if ($ret) return true; } else if ( $this->attr == 'DiskBlocks' ) { - $string_to_eval = 'return $event->Storage()->disk_usage_blocks() '.$this->op.' '.$this->val.';'; - try { - $ret = eval($string_to_eval); - Debug("Evalled $string_to_eval = $ret"); - if ( $ret ) - return true; - } catch ( Throwable $t ) { - Error('Failed evaluating '.$string_to_eval); - return false; - } + $ret = $this->compare($event->Storage()->disk_usage_blocks(), $this->op, $this->val); + Debug("DiskBlocks compare: " . ($ret ? 'true' : 'false')); + if ($ret) return true; } else if ( $this->attr == 'Tags' ) { // Debug('TODO: Complete this post_sql_condition for Tags val: ' . $this->val . ' op: ' . $this->op . ' id: ' . $this->id); // Debug(print_r($this, true)); diff --git a/web/includes/MenuItem.php b/web/includes/MenuItem.php new file mode 100644 index 000000000..290664ea6 --- /dev/null +++ b/web/includes/MenuItem.php @@ -0,0 +1,68 @@ + null, + 'MenuKey' => '', + 'Enabled' => 1, + 'Label' => null, + 'SortOrder' => 0, + 'Icon' => null, + 'IconType' => 'material', + ); + + // Default material icons for each menu key + public static $defaultIcons = array( + 'Console' => 'dashboard', + 'Montage' => 'live_tv', + 'MontageReview' => 'movie', + 'Events' => 'event', + 'Options' => 'settings', + 'Log' => 'notification_important', + 'Devices' => 'devices_other', + 'IntelGpu' => 'memory', + 'Groups' => 'group', + 'Filters' => 'filter_alt', + 'Snapshots' => 'preview', + 'Reports' => 'report', + 'ReportEventAudit' => 'shield', + 'Map' => 'language', + ); + + public function effectiveIcon() { + if ($this->{'Icon'} !== null && $this->{'Icon'} !== '') { + return $this->{'Icon'}; + } + return isset(self::$defaultIcons[$this->{'MenuKey'}]) ? self::$defaultIcons[$this->{'MenuKey'}] : 'menu'; + } + + public function effectiveIconType() { + if ($this->{'IconType'} == 'none') { + return 'none'; + } + if ($this->{'Icon'} !== null && $this->{'Icon'} !== '') { + return $this->{'IconType'}; + } + return 'material'; + } + + public static function find($parameters = array(), $options = array()) { + return ZM_Object::_find(self::class, $parameters, $options); + } + + public static function find_one($parameters = array(), $options = array()) { + return ZM_Object::_find_one(self::class, $parameters, $options); + } + + public function displayLabel() { + if ($this->{'Label'} !== null && $this->{'Label'} !== '') { + return $this->{'Label'}; + } + return translate($this->{'MenuKey'}); + } +} diff --git a/web/includes/Monitor.php b/web/includes/Monitor.php index 47bd8be79..3275099bb 100644 --- a/web/includes/Monitor.php +++ b/web/includes/Monitor.php @@ -646,9 +646,9 @@ class Monitor extends ZM_Object { } if ((!defined('ZM_SERVER_ID')) or ( property_exists($this, 'ServerId') and (ZM_SERVER_ID==$this->{'ServerId'}) )) { if ($this->Type() == 'Local') { - $zmcArgs = '-d '.$this->{'Device'}; + $zmcArgs = '-d '.escapeshellarg($this->{'Device'}); } else { - $zmcArgs = '-m '.$this->{'Id'}; + $zmcArgs = '-m '.escapeshellarg($this->{'Id'}); } if ($mode == 'stop') { @@ -939,7 +939,40 @@ class Monitor extends ZM_Object { $group_permission_value = $value; } } - if ($group_permission_value != 'Inherit') return true; + if ($group_permission_value != 'Inherit') return true; + + # Check role permissions if user has a role + $role = $u->Role(); + if ($role) { + $role_monitor_permissions = $role->Monitor_Permissions(); + foreach ($role_monitor_permissions as $rmp) { + if ($rmp->MonitorId() == $this->Id()) { + $permission = $rmp->Permission(); + if ($permission != 'Inherit') { + return ($permission != 'None'); + } + } + } + + $role_group_permissions = $role->Group_Permissions(); + $role_group_permission_value = 'Inherit'; + foreach ($role_group_permissions as $permission) { + $value = $permission->MonitorPermission($this->Id()); + if ($value == 'None') { + Debug('Can\'t view monitor '.$this->{'Id'}.' because of role group '.$permission->Group()->Name().' '.$permission->Permission()); + return false; + } + if ($value == 'Edit' or $value == 'View') { + $role_group_permission_value = $value; + } + } + if ($role_group_permission_value != 'Inherit') return true; + + if ($u->Monitors() == 'None' and $role->Monitors() != 'None') { + return true; + } + } + return ($u->Monitors() != 'None'); } # end function canView diff --git a/web/includes/actions/login.php b/web/includes/actions/login.php index d25d19437..b03c7b33d 100644 --- a/web/includes/actions/login.php +++ b/web/includes/actions/login.php @@ -26,6 +26,16 @@ if ( ('login' == $action) && isset($_REQUEST['username']) && ( ZM_AUTH_TYPE == ' // if captcha existed, it was passed + if (defined('ZM_OPT_USE_REMEMBER_ME') && ZM_OPT_USE_REMEMBER_ME) { + if (!empty($_REQUEST['remember_me'])) { + zm_setcookie('ZM_REMEMBER_ME', '1', array('expires' => time() + ZM_COOKIE_LIFETIME)); + $_COOKIE['ZM_REMEMBER_ME'] = '1'; + } else { + zm_setcookie('ZM_REMEMBER_ME', '', array('expires' => time() - 31536000)); + unset($_COOKIE['ZM_REMEMBER_ME']); + } + } + zm_session_start(); if (!isset($user) ) { $_SESSION['loginFailed'] = true; diff --git a/web/includes/actions/monitor.php b/web/includes/actions/monitor.php index 706637c82..0ef133d41 100644 --- a/web/includes/actions/monitor.php +++ b/web/includes/actions/monitor.php @@ -58,6 +58,15 @@ if ($action == 'save') { # For convenience $newMonitor = $_REQUEST['newMonitor']; + # Validate Device path to prevent command injection (CVE-worthy) + if (!empty($newMonitor['Device'])) { + $newMonitor['Device'] = validDevicePath($newMonitor['Device']); + if ($newMonitor['Device'] === '') { + $error_message .= 'Invalid device path. Must be a valid /dev/ path (e.g. /dev/video0).
'; + return; + } + } + if (!$newMonitor['ManufacturerId'] and ($newMonitor['Manufacturer'] != '')) { # Need to add a new Manufacturer entry $newManufacturer = ZM\Manufacturer::find_one(array('Name'=>$newMonitor['Manufacturer'])); diff --git a/web/includes/actions/options.php b/web/includes/actions/options.php index e90d3ed1c..600dfc68f 100644 --- a/web/includes/actions/options.php +++ b/web/includes/actions/options.php @@ -189,5 +189,95 @@ if ( $action == 'delete' ) { } } } +} else if ($action == 'menuitems') { + if (!canEdit('System')) { + ZM\Warning('Need System permission to edit menu items'); + } else if (isset($_REQUEST['items'])) { + require_once('includes/MenuItem.php'); + $allItems = ZM\MenuItem::find(); + foreach ($allItems as $item) { + $id = $item->Id(); + $enabled = isset($_REQUEST['items'][$id]['Enabled']) ? 1 : 0; + $label = isset($_REQUEST['items'][$id]['Label']) ? trim($_REQUEST['items'][$id]['Label']) : null; + $sortOrder = isset($_REQUEST['items'][$id]['SortOrder']) ? intval($_REQUEST['items'][$id]['SortOrder']) : $item->SortOrder(); + if ($label === '') $label = null; + + $iconType = isset($_REQUEST['items'][$id]['IconType']) ? $_REQUEST['items'][$id]['IconType'] : $item->IconType(); + if (!in_array($iconType, ['material', 'fontawesome', 'image', 'none'])) $iconType = 'material'; + $icon = isset($_REQUEST['items'][$id]['Icon']) ? trim($_REQUEST['items'][$id]['Icon']) : $item->Icon(); + if ($icon === '') $icon = null; + + // Handle image upload + if (isset($_FILES['items']['name'][$id]['IconFile']) + && $_FILES['items']['error'][$id]['IconFile'] == UPLOAD_ERR_OK) { + $uploadDir = ZM_PATH_WEB.'/graphics/menu/'; + if (!is_dir($uploadDir)) mkdir($uploadDir, 0755, true); + + $tmpName = $_FILES['items']['tmp_name'][$id]['IconFile']; + $origName = basename($_FILES['items']['name'][$id]['IconFile']); + $ext = strtolower(pathinfo($origName, PATHINFO_EXTENSION)); + $allowedExts = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp', 'ico']; + if (in_array($ext, $allowedExts)) { + // Validate it's actually an image (except SVG/ICO) + if ($ext == 'svg' || $ext == 'ico' || getimagesize($tmpName) !== false) { + $safeName = 'menu_'.$id.'_'.time().'.'.$ext; + $destPath = $uploadDir.$safeName; + if (move_uploaded_file($tmpName, $destPath)) { + // Remove old uploaded icon if it exists + if ($item->IconType() == 'image' && $item->Icon() && file_exists(ZM_PATH_WEB.'/'.$item->Icon())) { + unlink(ZM_PATH_WEB.'/'.$item->Icon()); + } + $icon = 'graphics/menu/'.$safeName; + $iconType = 'image'; + } + } + } + } + + // If user cleared icon, reset to default + if ($iconType != 'image' && ($icon === null || $icon === '')) { + $icon = null; + } + + $item->save([ + 'Enabled' => $enabled, + 'Label' => $label, + 'SortOrder' => $sortOrder, + 'Icon' => $icon, + 'IconType' => $iconType, + ]); + } + } + $redirect = '?view=options&tab=menu'; +} else if ($action == 'resetmenu') { + if (!canEdit('System')) { + ZM\Warning('Need System permission to reset menu items'); + } else { + // Clean up any uploaded icon files + require_once('includes/MenuItem.php'); + $oldItems = ZM\MenuItem::find(); + foreach ($oldItems as $item) { + if ($item->IconType() == 'image' && $item->Icon() && file_exists(ZM_PATH_WEB.'/'.$item->Icon())) { + unlink(ZM_PATH_WEB.'/'.$item->Icon()); + } + } + dbQuery('DELETE FROM Menu_Items'); + dbQuery("INSERT INTO `Menu_Items` (`MenuKey`, `Enabled`, `SortOrder`) VALUES + ('Console', 1, 10), + ('Montage', 1, 20), + ('MontageReview', 1, 30), + ('Events', 1, 40), + ('Options', 1, 50), + ('Log', 1, 60), + ('Devices', 1, 70), + ('IntelGpu', 1, 80), + ('Groups', 1, 90), + ('Filters', 1, 100), + ('Snapshots', 1, 110), + ('Reports', 1, 120), + ('ReportEventAudit', 1, 130), + ('Map', 1, 140)"); + } + $redirect = '?view=options&tab=menu'; } // end if object vs action ?> diff --git a/web/includes/actions/zone.php b/web/includes/actions/zone.php index 07621aadf..69eabbe48 100644 --- a/web/includes/actions/zone.php +++ b/web/includes/actions/zone.php @@ -31,18 +31,9 @@ if ( !empty($_REQUEST['mid']) && canEdit('Monitors', $_REQUEST['mid']) ) { $zone = array(); } - if ( $_REQUEST['newZone']['Units'] == 'Percent' ) { - // Convert percentage thresholds to pixel counts using actual monitor pixel area - $pixelArea = $monitor->ViewWidth() * $monitor->ViewHeight(); - foreach (array( - 'MinAlarmPixels','MaxAlarmPixels', - 'MinFilterPixels','MaxFilterPixels', - 'MinBlobPixels','MaxBlobPixels' - ) as $field ) { - if ( isset($_REQUEST['newZone'][$field]) and $_REQUEST['newZone'][$field] ) - $_REQUEST['newZone'][$field] = intval(($_REQUEST['newZone'][$field]*$pixelArea)/100); - } - } + // Threshold fields (MinAlarmPixels, etc.) are always submitted as percentages + // of zone area by the JavaScript submitForm() function. If displaying in Pixels + // mode, submitForm() converts back to percentages before submitting. unset($_REQUEST['newZone']['Points']); diff --git a/web/includes/auth.php b/web/includes/auth.php index f22fbe19d..456600a5f 100644 --- a/web/includes/auth.php +++ b/web/includes/auth.php @@ -116,6 +116,7 @@ function userLogout() { global $user; ZM\Info('User "'.($user?$user->Username():'no one').'" logged out'); $user = null;// unset only clears the local variable + zm_setcookie('ZM_REMEMBER_ME', '', array('expires' => time() - 31536000)); zm_session_clear(); } diff --git a/web/includes/download_functions.php b/web/includes/download_functions.php index 4998d85e9..d369a92a3 100644 --- a/web/includes/download_functions.php +++ b/web/includes/download_functions.php @@ -123,7 +123,7 @@ function downloadEvents( } else { ZM\Error("Can't open event images export file 'event_files.txt'"); } - $cmd = ZM_PATH_FFMPEG.' -f concat -safe 0 -i event_files.txt -c copy \''.$export_dir.'/'.$mergedFileName. '\' 2>&1'; + $cmd = ZM_PATH_FFMPEG.' -f concat -safe 0 -i event_files.txt -c copy '.escapeshellarg($export_dir.'/'.$mergedFileName). ' 2>&1'; exec($cmd, $output, $return); ZM\Debug($cmd.' return code: '.$return.' output: '.print_r($output,true)); $exportFileList[] = $mergedFileName; @@ -147,7 +147,7 @@ function downloadEvents( } if ($command) { - $command .= ' \''.$mergedFileName.'\''; # Name of the file to be added + $command .= ' -- '.escapeshellarg($mergedFileName); # Name of the file to be added if (executeShelCommand($command, $deleteFile = $mergedFileName) === false) return false; } } # end foreach monitor @@ -160,7 +160,7 @@ function downloadEvents( # Create an archive if necessary //$exportCompressed = true; // For debugging if ($exportCompressed) { - $command = 'gzip '.escapeshellarg($archive_path); # Name of the file to be archived + $command = 'gzip -- '.escapeshellarg($archive_path); # Name of the file to be archived if (executeShelCommand($command) === false) return false; $archiveFileName .= '.gz'; } @@ -208,7 +208,7 @@ function generateFileList ($exportFormat, $exportStructure, $archive_path, $expo $command = 'zip -j '.escapeshellarg($archive_path); $command .= $exportCompressed ? ' -9' : ' -0'; } - $command .= ' \''.$export_listFile.'\''; # Name of the file to be added + $command .= ' '.escapeshellarg($export_listFile); # Name of the file to be added if (executeShelCommand($command, $deleteFile = $export_listFile) === false) return false; # Let's delete the directory, it should already be empty. diff --git a/web/includes/functions.php b/web/includes/functions.php index 5b4eb9cf7..97df2ea75 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -321,8 +321,8 @@ function deletePath( $path ) { if (is_link($path)) { if (!unlink($path)) ZM\Debug("Failed to unlink $path"); } else if (is_dir($path)) { - if (false === ($output = system('rm -rf "'.escapeshellcmd($path).'"'))) { - ZM\Warning('Failed doing rm -rf "'.escapeshellcmd($path).'"'); + if (false === ($output = system('rm -rf '.escapeshellarg($path)))) { + ZM\Warning('Failed doing rm -rf '.escapeshellarg($path)); } } else if (file_exists($path)) { if (!unlink($path)) ZM\Debug("Failed to delete $path"); @@ -501,6 +501,12 @@ function getFormChanges($values, $newValues, $types=false, $columns=false) { if ( $columns && !isset($columns[$key]) ) continue; + # Validate column name to prevent SQL injection via array keys + if ( !preg_match('/^[a-zA-Z0-9_]+$/', $key) ) { + ZM\Warning("Invalid column name rejected in getFormChanges: $key"); + continue; + } + if ( !isset($types[$key]) ) $types[$key] = false; @@ -517,10 +523,14 @@ function getFormChanges($values, $newValues, $types=false, $columns=false) { case 'image' : if ( is_array( $newValues[$key] ) ) { $imageData = getimagesize( $newValues[$key]['tmp_name'] ); - $changes[$key.'Width'] = $key.'Width = '.$imageData[0]; - $changes[$key.'Height'] = $key.'Height = '.$imageData[1]; - $changes[$key.'Type'] = $key.'Type = \''.$newValues[$key]['type'].'\''; - $changes[$key.'Size'] = $key.'Size = '.$newValues[$key]['size']; + if ( !is_array($imageData) ) { + ZM\Warning("getimagesize failed for uploaded field '$key'; skipping width/height update."); + } else { + $changes[$key.'Width'] = $key.'Width = '.intval($imageData[0]); + $changes[$key.'Height'] = $key.'Height = '.intval($imageData[1]); + } + $changes[$key.'Type'] = $key.'Type = '.dbEscape($newValues[$key]['type']); + $changes[$key.'Size'] = $key.'Size = '.intval($newValues[$key]['size']); ob_start(); readfile( $newValues[$key]['tmp_name'] ); $changes[$key] = $key." = ".dbEscape( ob_get_contents() ); @@ -531,9 +541,8 @@ function getFormChanges($values, $newValues, $types=false, $columns=false) { break; case 'document' : if ( is_array( $newValues[$key] ) ) { - $imageData = getimagesize( $newValues[$key]['tmp_name'] ); - $changes[$key.'Type'] = $key.'Type = \''.$newValues[$key]['type'].'\''; - $changes[$key.'Size'] = $key.'Size = '.$newValues[$key]['size']; + $changes[$key.'Type'] = $key.'Type = '.dbEscape($newValues[$key]['type']); + $changes[$key.'Size'] = $key.'Size = '.intval($newValues[$key]['size']); ob_start(); readfile( $newValues[$key]['tmp_name'] ); $changes[$key] = $key.' = '.dbEscape( ob_get_contents() ); @@ -755,9 +764,9 @@ function daemonStatus($daemon, $args=false) { function zmcStatus($monitor) { if ( $monitor['Type'] == 'Local' ) { - $zmcArgs = '-d '.$monitor['Device']; + $zmcArgs = '-d '.escapeshellarg($monitor['Device']); } else { - $zmcArgs = '-m '.$monitor['Id']; + $zmcArgs = '-m '.escapeshellarg($monitor['Id']); } return daemonStatus('zmc', $zmcArgs); } @@ -776,9 +785,9 @@ function daemonCheck($daemon=false, $args=false) { function zmcCheck($monitor) { if ( $monitor['Type'] == 'Local' ) { - $zmcArgs = '-d '.$monitor['Device']; + $zmcArgs = '-d '.escapeshellarg($monitor['Device']); } else { - $zmcArgs = '-m '.$monitor['Id']; + $zmcArgs = '-m '.escapeshellarg($monitor['Id']); } return daemonCheck('zmc', $zmcArgs); } @@ -1467,7 +1476,7 @@ function limitPoints(&$points, $min_x, $min_y, $max_x, $max_y) { } // end function limitPoints( $points, $min_x, $min_y, $max_x, $max_y ) function convertPixelPointsToPercent(&$points, $width, $height) { - if (!$width || !$height) return; + if (!$width || !$height) return false; $isPixel = false; foreach ($points as $point) { if ($point['x'] > 100 || $point['y'] > 100) { @@ -1482,6 +1491,7 @@ function convertPixelPointsToPercent(&$points, $width, $height) { } unset($point); } + return $isPixel; } function scalePoints(&$points, $scale) { @@ -1880,6 +1890,18 @@ function validNum( $input ) { return preg_replace('/[^\d.-]/', '', $input); } +// For device path strings - must be a valid Unix device path +function validDevicePath($input) { + if (is_null($input) || $input === '') return ''; + // Only allow typical device paths: /dev/video0, /dev/v4l/by-id/..., etc. + // Reject any shell metacharacters + if (!preg_match('#^/dev/[\w/.\-]+$#', $input)) { + ZM\Warning("Invalid device path rejected: ".validHtmlStr($input)); + return ''; + } + return $input; +} + // For general strings function validStr($input) { if (is_null($input)) return ''; diff --git a/web/includes/monitor_probe.php b/web/includes/monitor_probe.php index e2fff5127..3e0610b02 100644 --- a/web/includes/monitor_probe.php +++ b/web/includes/monitor_probe.php @@ -253,7 +253,7 @@ function probeAmcrest($ip, $username='', $password='') { } function wget($method, $url, $username, $password) { - exec("wget --keep-session-cookies -O - $url", $output, $result_code); + exec('wget --keep-session-cookies -O - '.escapeshellarg($url), $output, $result_code); return implode("\n", $output); } diff --git a/web/includes/session.php b/web/includes/session.php index 89ebc136b..2258e02d0 100644 --- a/web/includes/session.php +++ b/web/includes/session.php @@ -26,8 +26,12 @@ function zm_session_start() { // use_strict_mode is mandatory for security reasons. ini_set('session.use_strict_mode', 1); - $currentCookieParams = session_get_cookie_params(); - $currentCookieParams['lifetime'] = ZM_COOKIE_LIFETIME; + $currentCookieParams = session_get_cookie_params(); + if (defined('ZM_OPT_USE_REMEMBER_ME') && ZM_OPT_USE_REMEMBER_ME && empty($_COOKIE['ZM_REMEMBER_ME'])) { + $currentCookieParams['lifetime'] = 0; + } else { + $currentCookieParams['lifetime'] = ZM_COOKIE_LIFETIME; + } $currentCookieParams['httponly'] = true; if ( version_compare(phpversion(), '7.3.0', '<') ) { session_set_cookie_params( diff --git a/web/js/MonitorStream.js b/web/js/MonitorStream.js index 91259a701..2aedcba99 100644 --- a/web/js/MonitorStream.js +++ b/web/js/MonitorStream.js @@ -30,6 +30,7 @@ function MonitorStream(monitorData) { this.wsMSE = null; this.streamStartTime = 0; // Initial point of flow start time. Used for flow lag time analysis. this.waitingStart; + this.handlerEventListener = {}; this.mseListenerSourceopenBind = null; this.streamListenerBind = null; this.mseSourceBufferListenerUpdateendBind = null; @@ -441,7 +442,7 @@ function MonitorStream(monitorData) { clearInterval(this.statusCmdTimer); // Fix for issues in Chromium when quickly hiding/showing a page. Doesn't clear statusCmdTimer when minimizing a page https://stackoverflow.com/questions/9501813/clearinterval-not-working this.statusCmdTimer = setInterval(this.statusCmdQuery.bind(this), statusRefreshTimeout); this.started = true; - this.streamListenerBind(); + this.handlerEventListener['killStream'] = this.streamListenerBind(); if (typeof observerMontage !== 'undefined') observerMontage.observe(stream); this.activePlayer = 'go2rtc'; @@ -482,7 +483,7 @@ function MonitorStream(monitorData) { attachVideo(this); this.statusCmdTimer = setInterval(this.statusCmdQuery.bind(this), statusRefreshTimeout); this.started = true; - this.streamListenerBind(); + this.handlerEventListener['killStream'] = this.streamListenerBind(); this.activePlayer = 'janus'; this.updateStreamInfo('Janus', 'loading'); return; @@ -554,7 +555,7 @@ function MonitorStream(monitorData) { clearInterval(this.statusCmdTimer); // Fix for issues in Chromium when quickly hiding/showing a page. Doesn't clear statusCmdTimer when minimizing a page https://stackoverflow.com/questions/9501813/clearinterval-not-working this.statusCmdTimer = setInterval(this.statusCmdQuery.bind(this), statusRefreshTimeout); this.started = true; - this.streamListenerBind(); + this.handlerEventListener['killStream'] = this.streamListenerBind(); this.updateStreamInfo((typeof players !== "undefined" && players) ? players[this.activePlayer] : 'RTSP2Web ' + this.RTSP2WebType, 'loading'); return; } else { @@ -618,12 +619,14 @@ function MonitorStream(monitorData) { } } // end if paused or not this.started = true; - this.streamListenerBind(); + this.handlerEventListener['killStream'] = this.streamListenerBind(); this.activePlayer = 'zms'; this.updateStreamInfo('ZMS MJPEG'); }; // this.start this.stop = function() { + manageEventListener.removeEventListener(this.handlerEventListener['killStream']); + /* Stop should stop the stream (killing zms) but NOT set src=''; This leaves the last jpeg up on screen instead of a broken image */ const stream = this.getElement(); if (!stream) { @@ -1334,6 +1337,30 @@ function MonitorStream(monitorData) { } } // end if canEdit.Monitors + // Update analyse_frames and button to reflect what zms is actually sending + if (streamStatus.analysisimage !== undefined) { + const got_analysis = !!streamStatus.analysisimage; + if (this.analyse_frames != got_analysis) { + console.log('Analysis image state changed: requested=' + this.analyse_frames + ' actual=' + got_analysis); + this.analyse_frames = got_analysis; + if ('analyseBtn' in this.buttons) { + if (got_analysis) { + this.buttons.analyseBtn.addClass('btn-primary'); + this.buttons.analyseBtn.removeClass('btn-secondary'); + if (typeof translate !== 'undefined') { + this.buttons.analyseBtn.prop('title', translate['Showing Analysis']); + } + } else { + this.buttons.analyseBtn.removeClass('btn-primary'); + this.buttons.analyseBtn.addClass('btn-secondary'); + if (typeof translate !== 'undefined') { + this.buttons.analyseBtn.prop('title', translate['Not Showing Analysis']); + } + } + } + } + } + if (this.status.auth) { if (this.status.auth != auth_hash) { // Don't reload the stream because it causes annoying flickering. Wait until the stream breaks. @@ -1779,17 +1806,17 @@ async function attachVideo(monitorStream) { Janus.debug(" ::: Got a remote track :::"); Janus.debug(track); if (track.kind ==="audio") { - stream = new MediaStream(); + const stream = new MediaStream(); stream.addTrack(track.clone()); if (document.getElementById("liveAudio" + id) == null) { - audioElement = document.createElement('audio'); + const audioElement = document.createElement('audio'); audioElement.setAttribute("id", "liveAudio" + id); audioElement.controls = true; document.getElementById("imageFeed" + id).append(audioElement); } Janus.attachMediaStream(document.getElementById("liveAudio" + id), stream); } else { - stream = new MediaStream(); + const stream = new MediaStream(); stream.addTrack(track.clone()); Janus.attachMediaStream(document.getElementById("liveStream" + id), stream); } @@ -1976,10 +2003,10 @@ function startRTSP2WebPlay(videoEl, url, stream) { } function streamListener(stream) { - window.addEventListener('beforeunload', function(event) { + return manageEventListener.addEventListener(window, 'beforeunload', function() { console.log('streamListener'); stream.kill(); - }); + }, {capture: false}); } function mseListenerSourceopen(context, videoEl, url) { diff --git a/web/js/Server.js b/web/js/Server.js index aff4d7331..6bb9ba9e3 100644 --- a/web/js/Server.js +++ b/web/js/Server.js @@ -31,21 +31,21 @@ var Server = function() { value: function url() { const port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - return location.protocol + '//' + this.Hostname + (port ? ':' + port : '') + (this.PathPrefix && this.PathPrefix != 'null' ? this.PathPrefix : ''); + return location.protocol + '//' + this.Hostname + (port ? ':' + port : (this.Port ? ':' + this.Port : (location.port ? ':' + location.port : ''))) + (this.PathPrefix && this.PathPrefix != 'null' ? this.PathPrefix : ''); } }, { key: 'urlToZMS', value: function urlToZMS() { const port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - return this.Protocol + '://' + this.Hostname + (port ? ':' + port : '') + (this.PathToZMS && this.PathToZMS != 'null' ? this.PathToZMS : ''); + return this.Protocol + '://' + this.Hostname + (port ? ':' + port : (this.Port ? ':' + this.Port : (location.port ? ':' + location.port : ''))) + (this.PathToZMS && this.PathToZMS != 'null' ? this.PathToZMS : ''); } }, { key: 'urlToApi', value: function urlToApi() { const port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - return (location.protocol=='https:'? 'https:' : this.Protocol+':') + '//' + this.Hostname + (port ? ':' + port : (this.Port ? ':' + this.Port : '')) + ((this.PathToApi && (this.PathToApi != 'null')) ? this.PathToApi : ''); + return (location.protocol=='https:'? 'https:' : this.Protocol+':') + '//' + this.Hostname + (port ? ':' + port : (this.Port ? ':' + this.Port : (location.port ? ':' + location.port : ''))) + ((this.PathToApi && (this.PathToApi != 'null')) ? this.PathToApi : ''); } }, { @@ -59,7 +59,7 @@ var Server = function() { key: 'urlToJanus', value: function urlToJanus() { const port = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - return (location.protocol=='https:'? 'https:' : this.Protocol+':') + '//' + this.Hostname + (port ? ':' + port : '') + '/janus'; + return (location.protocol=='https:'? 'https:' : this.Protocol+':') + '//' + this.Hostname + (port ? ':' + port : (this.Port ? ':' + this.Port : (location.port ? ':' + location.port : ''))) + '/janus'; } } ]); diff --git a/web/lang/en_gb.php b/web/lang/en_gb.php index 1bc7f57c7..7f1c0cd87 100644 --- a/web/lang/en_gb.php +++ b/web/lang/en_gb.php @@ -218,6 +218,7 @@ $SLANG = array( 'ChooseLogSelection' => 'Choose a log selection', 'ChoosePreset' => 'Choose Preset', 'ClassLabel' => 'Label', + 'ClearLogs' => 'Clear Logs', 'CloneMonitor' => 'Clone', 'ConcurrentFilter' => 'Run filter concurrently', 'ConfigOptions' => 'ConfigOptions', @@ -225,6 +226,8 @@ $SLANG = array( 'ConfiguredFor' => 'Configured for', 'ConfigURL' => 'Config Base URL', 'ConfirmAction' => 'Action Confirmation', + 'ConfirmClearLogs' => 'Are you sure you wish to delete the selected log entries?', + 'ConfirmClearLogsTitle' => 'Clear Logs Confirmation', 'ConfirmDeleteControl' => 'Warning, deleting a control will reset all monitors that use it to be uncontrollable.

Are you sure you wish to delete?', 'ConfirmDeleteDevices' => 'Are you sure you wish to delete the selected devices?', 'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?', @@ -564,6 +567,7 @@ $SLANG = array( 'RecaptchaWarning' => 'Your reCaptcha secret key is invalid. Please correct it, or reCaptcha will not work', // added Sep 24 2015 - PP 'RecordAudio' => 'Whether to store the audio stream when saving an event.', 'RefImageBlendPct' => 'Reference Image Blend %ge', + 'RememberMe' => 'Remember Me', 'RemoteHostName' => 'Host Name', 'RemoteHostPath' => 'Path', 'RemoteHostSubPath' => 'SubPath', diff --git a/web/skins/classic/assets/bootstrap-table b/web/skins/classic/assets/bootstrap-table new file mode 120000 index 000000000..bf503099b --- /dev/null +++ b/web/skins/classic/assets/bootstrap-table @@ -0,0 +1 @@ +bootstrap-table-1.27.0/ \ No newline at end of file diff --git a/web/skins/classic/assets/bootstrap-table-1.24.1/bootstrap-table-locale-all.min.js b/web/skins/classic/assets/bootstrap-table-1.24.1/bootstrap-table-locale-all.min.js deleted file mode 100644 index 360703695..000000000 --- a/web/skins/classic/assets/bootstrap-table-1.24.1/bootstrap-table-locale-all.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * bootstrap-table - An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation) - * - * @version v1.24.1 - * @homepage https://bootstrap-table.com - * @author wenzhixin (http://wenzhixin.net.cn/) - * @license MIT - */ - -!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self).jQuery)}(this,(function(t){"use strict";var n,r,o="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},e={};function a(){if(r)return n;r=1;var t=function(t){return t&&t.Math===Math&&t};return n=t("object"==typeof globalThis&&globalThis)||t("object"==typeof window&&window)||t("object"==typeof self&&self)||t("object"==typeof o&&o)||t("object"==typeof n&&n)||function(){return this}()||Function("return this")()}var i,u,c,f,l,s,m,g,d={};function h(){return u?i:(u=1,i=function(t){try{return!!t()}catch(t){return!0}})}function p(){if(f)return c;f=1;var t=h();return c=!t((function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))}function S(){if(s)return l;s=1;var t=h();return l=!t((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))}function w(){if(g)return m;g=1;var t=S(),n=Function.prototype.call;return m=t?n.bind(n):function(){return n.apply(n,arguments)},m}var P,T,b,v,C,R,A,x,y,O,k,F,M,j,D,N,E,H,z,L,B,U,V,G,J,Z,I,K,q,W,Y,_,X,Q,$,tt,nt,rt,ot,et,at,it={};function ut(){if(P)return it;P=1;var t={}.propertyIsEnumerable,n=Object.getOwnPropertyDescriptor,r=n&&!t.call({1:2},1);return it.f=r?function(t){var r=n(this,t);return!!r&&r.enumerable}:t,it}function ct(){return b?T:(b=1,T=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}})}function ft(){if(C)return v;C=1;var t=S(),n=Function.prototype,r=n.call,o=t&&n.bind.bind(r,r);return v=t?o:function(t){return function(){return r.apply(t,arguments)}},v}function lt(){if(A)return R;A=1;var t=ft(),n=t({}.toString),r=t("".slice);return R=function(t){return r(n(t),8,-1)}}function st(){if(y)return x;y=1;var t=ft(),n=h(),r=lt(),o=Object,e=t("".split);return x=n((function(){return!o("z").propertyIsEnumerable(0)}))?function(t){return"String"===r(t)?e(t,""):o(t)}:o}function mt(){return k?O:(k=1,O=function(t){return null==t})}function gt(){if(M)return F;M=1;var t=mt(),n=TypeError;return F=function(r){if(t(r))throw new n("Can't call method on "+r);return r}}function dt(){if(D)return j;D=1;var t=st(),n=gt();return j=function(r){return t(n(r))}}function ht(){if(E)return N;E=1;var t="object"==typeof document&&document.all;return N=void 0===t&&void 0!==t?function(n){return"function"==typeof n||n===t}:function(t){return"function"==typeof t}}function pt(){if(z)return H;z=1;var t=ht();return H=function(n){return"object"==typeof n?null!==n:t(n)}}function St(){if(B)return L;B=1;var t=a(),n=ht();return L=function(r,o){return arguments.length<2?(e=t[r],n(e)?e:void 0):t[r]&&t[r][o];var e},L}function wt(){if(I)return Z;I=1;var t,n,r=a(),o=function(){if(J)return G;J=1;var t=a().navigator,n=t&&t.userAgent;return G=n?String(n):""}(),e=r.process,i=r.Deno,u=e&&e.versions||i&&i.version,c=u&&u.v8;return c&&(n=(t=c.split("."))[0]>0&&t[0]<4?1:+(t[0]+t[1])),!n&&o&&(!(t=o.match(/Edge\/(\d+)/))||t[1]>=74)&&(t=o.match(/Chrome\/(\d+)/))&&(n=+t[1]),Z=n}function Pt(){if(q)return K;q=1;var t=wt(),n=h(),r=a().String;return K=!!Object.getOwnPropertySymbols&&!n((function(){var n=Symbol("symbol detection");return!r(n)||!(Object(n)instanceof Symbol)||!Symbol.sham&&t&&t<41}))}function Tt(){if(Y)return W;Y=1;var t=Pt();return W=t&&!Symbol.sham&&"symbol"==typeof Symbol.iterator}function bt(){if(X)return _;X=1;var t=St(),n=ht(),r=function(){if(V)return U;V=1;var t=ft();return U=t({}.isPrototypeOf)}(),o=Tt(),e=Object;return _=o?function(t){return"symbol"==typeof t}:function(o){var a=t("Symbol");return n(a)&&r(a.prototype,e(o))}}function vt(){if($)return Q;$=1;var t=String;return Q=function(n){try{return t(n)}catch(t){return"Object"}}}function Ct(){if(nt)return tt;nt=1;var t=ht(),n=vt(),r=TypeError;return tt=function(o){if(t(o))return o;throw new r(n(o)+" is not a function")}}function Rt(){if(ot)return rt;ot=1;var t=Ct(),n=mt();return rt=function(r,o){var e=r[o];return n(e)?void 0:t(e)}}function At(){if(at)return et;at=1;var t=w(),n=ht(),r=pt(),o=TypeError;return et=function(e,a){var i,u;if("string"===a&&n(i=e.toString)&&!r(u=t(i,e)))return u;if(n(i=e.valueOf)&&!r(u=t(i,e)))return u;if("string"!==a&&n(i=e.toString)&&!r(u=t(i,e)))return u;throw new o("Can't convert object to primitive value")}}var xt,yt,Ot,kt,Ft,Mt,jt,Dt,Nt,Et,Ht,zt,Lt,Bt,Ut,Vt,Gt,Jt,Zt,It,Kt,qt,Wt,Yt,_t={exports:{}};function Xt(){if(kt)return Ot;kt=1;var t=a(),n=Object.defineProperty;return Ot=function(r,o){try{n(t,r,{value:o,configurable:!0,writable:!0})}catch(n){t[r]=o}return o}}function Qt(){if(Ft)return _t.exports;Ft=1;var t=yt?xt:(yt=1,xt=!1),n=a(),r=Xt(),o="__core-js_shared__",e=_t.exports=n[o]||r(o,{});return(e.versions||(e.versions=[])).push({version:"3.39.0",mode:t?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.39.0/LICENSE",source:"https://github.com/zloirock/core-js"}),_t.exports}function $t(){if(jt)return Mt;jt=1;var t=Qt();return Mt=function(n,r){return t[n]||(t[n]=r||{})}}function tn(){if(Nt)return Dt;Nt=1;var t=gt(),n=Object;return Dt=function(r){return n(t(r))}}function nn(){if(Ht)return Et;Ht=1;var t=ft(),n=tn(),r=t({}.hasOwnProperty);return Et=Object.hasOwn||function(t,o){return r(n(t),o)}}function rn(){if(Lt)return zt;Lt=1;var t=ft(),n=0,r=Math.random(),o=t(1..toString);return zt=function(t){return"Symbol("+(void 0===t?"":t)+")_"+o(++n+r,36)}}function on(){if(Ut)return Bt;Ut=1;var t=a(),n=$t(),r=nn(),o=rn(),e=Pt(),i=Tt(),u=t.Symbol,c=n("wks"),f=i?u.for||u:u&&u.withoutSetter||o;return Bt=function(t){return r(c,t)||(c[t]=e&&r(u,t)?u[t]:f("Symbol."+t)),c[t]}}function en(){if(Gt)return Vt;Gt=1;var t=w(),n=pt(),r=bt(),o=Rt(),e=At(),a=on(),i=TypeError,u=a("toPrimitive");return Vt=function(a,c){if(!n(a)||r(a))return a;var f,l=o(a,u);if(l){if(void 0===c&&(c="default"),f=t(l,a,c),!n(f)||r(f))return f;throw new i("Can't convert object to primitive value")}return void 0===c&&(c="number"),e(a,c)}}function an(){if(Zt)return Jt;Zt=1;var t=en(),n=bt();return Jt=function(r){var o=t(r,"string");return n(o)?o:o+""}}function un(){if(Wt)return qt;Wt=1;var t=p(),n=h(),r=function(){if(Kt)return It;Kt=1;var t=a(),n=pt(),r=t.document,o=n(r)&&n(r.createElement);return It=function(t){return o?r.createElement(t):{}}}();return qt=!t&&!n((function(){return 7!==Object.defineProperty(r("div"),"a",{get:function(){return 7}}).a}))}function cn(){if(Yt)return d;Yt=1;var t=p(),n=w(),r=ut(),o=ct(),e=dt(),a=an(),i=nn(),u=un(),c=Object.getOwnPropertyDescriptor;return d.f=t?c:function(t,f){if(t=e(t),f=a(f),u)try{return c(t,f)}catch(t){}if(i(t,f))return o(!n(r.f,t,f),t[f])},d}var fn,ln,sn,mn,gn,dn,hn,pn={};function Sn(){if(mn)return sn;mn=1;var t=pt(),n=String,r=TypeError;return sn=function(o){if(t(o))return o;throw new r(n(o)+" is not an object")}}function wn(){if(gn)return pn;gn=1;var t=p(),n=un(),r=function(){if(ln)return fn;ln=1;var t=p(),n=h();return fn=t&&n((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))}(),o=Sn(),e=an(),a=TypeError,i=Object.defineProperty,u=Object.getOwnPropertyDescriptor,c="enumerable",f="configurable",l="writable";return pn.f=t?r?function(t,n,r){if(o(t),n=e(n),o(r),"function"==typeof t&&"prototype"===n&&"value"in r&&l in r&&!r[l]){var a=u(t,n);a&&a[l]&&(t[n]=r.value,r={configurable:f in r?r[f]:a[f],enumerable:c in r?r[c]:a[c],writable:!1})}return i(t,n,r)}:i:function(t,r,u){if(o(t),r=e(r),o(u),n)try{return i(t,r,u)}catch(t){}if("get"in u||"set"in u)throw new a("Accessors not supported");return"value"in u&&(t[r]=u.value),t},pn}function Pn(){if(hn)return dn;hn=1;var t=p(),n=wn(),r=ct();return dn=t?function(t,o,e){return n.f(t,o,r(1,e))}:function(t,n,r){return t[n]=r,t}}var Tn,bn,vn,Cn,Rn,An,xn,yn,On,kn,Fn,Mn,jn,Dn,Nn,En={exports:{}};function Hn(){if(Cn)return vn;Cn=1;var t=ft(),n=ht(),r=Qt(),o=t(Function.toString);return n(r.inspectSource)||(r.inspectSource=function(t){return o(t)}),vn=r.inspectSource}function zn(){if(yn)return xn;yn=1;var t=$t(),n=rn(),r=t("keys");return xn=function(t){return r[t]||(r[t]=n(t))}}function Ln(){return kn?On:(kn=1,On={})}function Bn(){if(Mn)return Fn;Mn=1;var t,n,r,o=function(){if(An)return Rn;An=1;var t=a(),n=ht(),r=t.WeakMap;return Rn=n(r)&&/native code/.test(String(r))}(),e=a(),i=pt(),u=Pn(),c=nn(),f=Qt(),l=zn(),s=Ln(),m="Object already initialized",g=e.TypeError,d=e.WeakMap;if(o||f.state){var h=f.state||(f.state=new d);h.get=h.get,h.has=h.has,h.set=h.set,t=function(t,n){if(h.has(t))throw new g(m);return n.facade=t,h.set(t,n),n},n=function(t){return h.get(t)||{}},r=function(t){return h.has(t)}}else{var p=l("state");s[p]=!0,t=function(t,n){if(c(t,p))throw new g(m);return n.facade=t,u(t,p,n),n},n=function(t){return c(t,p)?t[p]:{}},r=function(t){return c(t,p)}}return Fn={set:t,get:n,has:r,enforce:function(o){return r(o)?n(o):t(o,{})},getterFor:function(t){return function(r){var o;if(!i(r)||(o=n(r)).type!==t)throw new g("Incompatible receiver, "+t+" required");return o}}}}function Un(){if(jn)return En.exports;jn=1;var t=ft(),n=h(),r=ht(),o=nn(),e=p(),a=function(){if(bn)return Tn;bn=1;var t=p(),n=nn(),r=Function.prototype,o=t&&Object.getOwnPropertyDescriptor,e=n(r,"name"),a=e&&"something"===function(){}.name,i=e&&(!t||t&&o(r,"name").configurable);return Tn={EXISTS:e,PROPER:a,CONFIGURABLE:i}}().CONFIGURABLE,i=Hn(),u=Bn(),c=u.enforce,f=u.get,l=String,s=Object.defineProperty,m=t("".slice),g=t("".replace),d=t([].join),S=e&&!n((function(){return 8!==s((function(){}),"length",{value:8}).length})),w=String(String).split("String"),P=En.exports=function(t,n,r){"Symbol("===m(l(n),0,7)&&(n="["+g(l(n),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),r&&r.getter&&(n="get "+n),r&&r.setter&&(n="set "+n),(!o(t,"name")||a&&t.name!==n)&&(e?s(t,"name",{value:n,configurable:!0}):t.name=n),S&&r&&o(r,"arity")&&t.length!==r.arity&&s(t,"length",{value:r.arity});try{r&&o(r,"constructor")&&r.constructor?e&&s(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var i=c(t);return o(i,"source")||(i.source=d(w,"string"==typeof n?n:"")),t};return Function.prototype.toString=P((function(){return r(this)&&f(this).source||i(this)}),"toString"),En.exports}function Vn(){if(Nn)return Dn;Nn=1;var t=ht(),n=wn(),r=Un(),o=Xt();return Dn=function(e,a,i,u){u||(u={});var c=u.enumerable,f=void 0!==u.name?u.name:a;if(t(i)&&r(i,f,u),u.global)c?e[a]=i:o(a,i);else{try{u.unsafe?e[a]&&(c=!0):delete e[a]}catch(t){}c?e[a]=i:n.f(e,a,{value:i,enumerable:!1,configurable:!u.nonConfigurable,writable:!u.nonWritable})}return e}}var Gn,Jn,Zn,In,Kn,qn,Wn,Yn,_n,Xn,Qn,$n,tr,nr,rr,or,er,ar={};function ir(){if(In)return Zn;In=1;var t=function(){if(Jn)return Gn;Jn=1;var t=Math.ceil,n=Math.floor;return Gn=Math.trunc||function(r){var o=+r;return(o>0?n:t)(o)}}();return Zn=function(n){var r=+n;return r!=r||0===r?0:t(r)}}function ur(){if(qn)return Kn;qn=1;var t=ir(),n=Math.max,r=Math.min;return Kn=function(o,e){var a=t(o);return a<0?n(a+e,0):r(a,e)}}function cr(){if(Yn)return Wn;Yn=1;var t=ir(),n=Math.min;return Wn=function(r){var o=t(r);return o>0?n(o,9007199254740991):0}}function fr(){if(Xn)return _n;Xn=1;var t=cr();return _n=function(n){return t(n.length)}}function lr(){if(nr)return tr;nr=1;var t=ft(),n=nn(),r=dt(),o=function(){if($n)return Qn;$n=1;var t=dt(),n=ur(),r=fr(),o=function(o){return function(e,a,i){var u=t(e),c=r(u);if(0===c)return!o&&-1;var f,l=n(i,c);if(o&&a!=a){for(;c>l;)if((f=u[l++])!=f)return!0}else for(;c>l;l++)if((o||l in u)&&u[l]===a)return o||l||0;return!o&&-1}};return Qn={includes:o(!0),indexOf:o(!1)}}().indexOf,e=Ln(),a=t([].push);return tr=function(t,i){var u,c=r(t),f=0,l=[];for(u in c)!n(e,u)&&n(c,u)&&a(l,u);for(;i.length>f;)n(c,u=i[f++])&&(~o(l,u)||a(l,u));return l}}function sr(){return or?rr:(or=1,rr=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"])}var mr,gr,dr,hr,pr,Sr,wr,Pr,Tr,br,vr,Cr,Rr,Ar,xr,yr,Or,kr,Fr,Mr,jr,Dr,Nr,Er,Hr,zr,Lr,Br,Ur={};function Vr(){return mr||(mr=1,Ur.f=Object.getOwnPropertySymbols),Ur}function Gr(){if(dr)return gr;dr=1;var t=St(),n=ft(),r=function(){if(er)return ar;er=1;var t=lr(),n=sr().concat("length","prototype");return ar.f=Object.getOwnPropertyNames||function(r){return t(r,n)},ar}(),o=Vr(),e=Sn(),a=n([].concat);return gr=t("Reflect","ownKeys")||function(t){var n=r.f(e(t)),i=o.f;return i?a(n,i(t)):n}}function Jr(){if(pr)return hr;pr=1;var t=nn(),n=Gr(),r=cn(),o=wn();return hr=function(e,a,i){for(var u=n(a),c=o.f,f=r.f,l=0;l9007199254740991)throw t("Maximum allowed index exceeded");return n}}function qr(){if(xr)return Ar;xr=1;var t=p(),n=wn(),r=ct();return Ar=function(o,e,a){t?n.f(o,e,r(0,a)):o[e]=a}}function Wr(){if(Fr)return kr;Fr=1;var t=function(){if(Or)return yr;Or=1;var t={};return t[on()("toStringTag")]="z",yr="[object z]"===String(t)}(),n=ht(),r=lt(),o=on()("toStringTag"),e=Object,a="Arguments"===r(function(){return arguments}());return kr=t?r:function(t){var i,u,c;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(u=function(t,n){try{return t[n]}catch(t){}}(i=e(t),o))?u:a?r(i):"Object"===(c=r(i))&&n(i.callee)?"Arguments":c}}function Yr(){if(jr)return Mr;jr=1;var t=ft(),n=h(),r=ht(),o=Wr(),e=St(),a=Hn(),i=function(){},u=e("Reflect","construct"),c=/^\s*(?:class|function)\b/,f=t(c.exec),l=!c.test(i),s=function(t){if(!r(t))return!1;try{return u(i,[],t),!0}catch(t){return!1}},m=function(t){if(!r(t))return!1;switch(o(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return l||!!f(c,a(t))}catch(t){return!0}};return m.sham=!0,Mr=!u||n((function(){var t;return s(s.call)||!s(Object)||!s((function(){t=!0}))||t}))?m:s}function _r(){if(Nr)return Dr;Nr=1;var t=Ir(),n=Yr(),r=pt(),o=on()("species"),e=Array;return Dr=function(a){var i;return t(a)&&(i=a.constructor,(n(i)&&(i===e||t(i.prototype))||r(i)&&null===(i=i[o]))&&(i=void 0)),void 0===i?e:i}}function Xr(){if(Hr)return Er;Hr=1;var t=_r();return Er=function(n,r){return new(t(n))(0===r?0:r)}}function Qr(){if(Lr)return zr;Lr=1;var t=h(),n=on(),r=wt(),o=n("species");return zr=function(n){return r>=51||!t((function(){var t=[];return(t.constructor={})[o]=function(){return{foo:1}},1!==t[n](Boolean).foo}))}}!function(){if(Br)return e;Br=1;var t=Zr(),n=h(),r=Ir(),o=pt(),a=tn(),i=fr(),u=Kr(),c=qr(),f=Xr(),l=Qr(),s=on(),m=wt(),g=s("isConcatSpreadable"),d=m>=51||!n((function(){var t=[];return t[g]=!1,t.concat()[0]!==t})),p=function(t){if(!o(t))return!1;var n=t[g];return void 0!==n?!!n:r(t)};t({target:"Array",proto:!0,arity:1,forced:!d||!l("concat")},{concat:function(t){var n,r,o,e,l,s=a(this),m=f(s,0),g=0;for(n=-1,o=arguments.length;nm;)for(var h,p=c(arguments[m++]),S=g?s(e(p),g(p)):e(p),w=S.length,P=0;w>P;)h=S[P++],t&&!r(d,p,h)||(f[h]=p[h]);return f}:f,no}();t({target:"Object",stat:!0,arity:2,forced:Object.assign!==n},{assign:n})}(),t.fn.bootstrapTable.locales["af-ZA"]=t.fn.bootstrapTable.locales.af={formatCopyRows:function(){return"Kopieer lyne"},formatPrint:function(){return"Druk uit"},formatLoadingMessage:function(){return"Laai tans"},formatRecordsPerPage:function(t){return"".concat(t," reëls per bladsy")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Wys ".concat(t," tot ").concat(n," van ").concat(r," lyne (gefiltreer vanaf ").concat(o," lyne)"):"Wys ".concat(t," tot ").concat(n," van ").concat(r," lyne")},formatSRPaginationPreText:function(){return"vorige bladsy"},formatSRPaginationPageText:function(t){return"na bladsy ".concat(t)},formatSRPaginationNextText:function(){return"volgende bladsy"},formatDetailPagination:function(t){return"".concat(t,"-reël vertoon")},formatClearSearch:function(){return"Duidelike soektog"},formatSearch:function(){return"Navorsing"},formatNoMatches:function(){return"Geen resultate nie"},formatPaginationSwitch:function(){return"Versteek/Wys paginasie"},formatPaginationSwitchDown:function(){return"Wys paginasie"},formatPaginationSwitchUp:function(){return"Versteek paginasie"},formatRefresh:function(){return"Verfris"},formatToggleOn:function(){return"Wys kaartaansig"},formatToggleOff:function(){return"Versteek kaartaansig"},formatColumns:function(){return"Kolomme"},formatColumnsToggleAll:function(){return"Wys alles"},formatFullscreen:function(){return"Volskerm"},formatAllRows:function(){return"Alles"},formatAutoRefresh:function(){return"Verfris outomaties"},formatExport:function(){return"Voer data uit"},formatJumpTo:function(){return"Gaan na"},formatAdvancedSearch:function(){return"Gevorderde soektog"},formatAdvancedCloseButton:function(){return"Maak"},formatFilterControlSwitch:function(){return"Versteek/Wys kontroles"},formatFilterControlSwitchHide:function(){return"Versteek kontroles"},formatFilterControlSwitchShow:function(){return"Wys kontroles"},formatToggleCustomViewOn:function(){return"Wys pasgemaakte aansig"},formatToggleCustomViewOff:function(){return"Versteek pasgemaakte aansig"},formatClearFilters:function(){return"Verwyder filters"},formatAddLevel:function(){return"Voeg 'n vlak by"},formatCancel:function(){return"Kanselleer"},formatColumn:function(){return"Kolom"},formatDeleteLevel:function(){return"Vee 'n vlak uit"},formatDuplicateAlertTitle:function(){return"Duplikaatinskrywings is gevind!"},formatDuplicateAlertDescription:function(){return"Verwyder of wysig asseblief duplikaatinskrywings"},formatMultipleSort:function(){return"Multi-sorteer"},formatOrder:function(){return"Bestelling"},formatSort:function(){return"Rangskik"},formatSortBy:function(){return"Sorteer volgens"},formatSortOrders:function(){return{asc:"Stygende",desc:"Dalende"}},formatThenBy:function(){return"Dan deur"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["af-ZA"]),t.fn.bootstrapTable.locales["ca-ES"]=t.fn.bootstrapTable.locales.ca={formatCopyRows:function(){return"Copia resultats"},formatPrint:function(){return"Imprimeix"},formatLoadingMessage:function(){return"Espereu, si us plau"},formatRecordsPerPage:function(t){return"".concat(t," resultats per pàgina")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Mostrant resultats ".concat(t," fins ").concat(n," - ").concat(r," resultats (filtrats d'un total de ").concat(o," resultats)"):"Mostrant resultats ".concat(t," fins ").concat(n," - ").concat(r," resultats en total")},formatSRPaginationPreText:function(){return"Pàgina anterior"},formatSRPaginationPageText:function(t){return"A la pàgina ".concat(t)},formatSRPaginationNextText:function(){return"Pàgina següent"},formatDetailPagination:function(t){return"Mostrant ".concat(t," resultats")},formatClearSearch:function(){return"Neteja cerca"},formatSearch:function(){return"Cerca"},formatNoMatches:function(){return"No s'han trobat resultats"},formatPaginationSwitch:function(){return"Amaga/Mostra paginació"},formatPaginationSwitchDown:function(){return"Mostra paginació"},formatPaginationSwitchUp:function(){return"Amaga paginació"},formatRefresh:function(){return"Refresca"},formatToggleOn:function(){return"Mostra vista de tarjeta"},formatToggleOff:function(){return"Amaga vista de tarjeta"},formatColumns:function(){return"Columnes"},formatColumnsToggleAll:function(){return"Alterna totes"},formatFullscreen:function(){return"Pantalla completa"},formatAllRows:function(){return"Tots"},formatAutoRefresh:function(){return"Auto Refresca"},formatExport:function(){return"Exporta dades"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Cerca avançada"},formatAdvancedCloseButton:function(){return"Tanca"},formatFilterControlSwitch:function(){return"Mostra/Amaga controls"},formatFilterControlSwitchHide:function(){return"Mostra controls"},formatFilterControlSwitchShow:function(){return"Amaga controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ca-ES"]),t.fn.bootstrapTable.locales["ar-SA"]=t.fn.bootstrapTable.locales.ar={formatCopyRows:function(){return"نسخ الصفوف"},formatPrint:function(){return"طباعة"},formatLoadingMessage:function(){return"جارٍ التحميل، يرجى الانتظار..."},formatRecordsPerPage:function(t){return"".concat(t," صف لكل صفحة")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"الظاهر ".concat(t," إلى ").concat(n," من ").concat(r," سجل ").concat(o," إجمالي الصفوف)"):"الظاهر ".concat(t," إلى ").concat(n," من ").concat(r," سجل")},formatSRPaginationPreText:function(){return"الصفحة السابقة"},formatSRPaginationPageText:function(t){return"إلى الصفحة ".concat(t)},formatSRPaginationNextText:function(){return"الصفحة التالية"},formatDetailPagination:function(t){return"عرض ".concat(t," أعمدة")},formatClearSearch:function(){return"مسح مربع البحث"},formatSearch:function(){return"بحث"},formatNoMatches:function(){return"لا توجد نتائج مطابقة للبحث"},formatPaginationSwitch:function(){return"إخفاء/إظهار ترقيم الصفحات"},formatPaginationSwitchDown:function(){return"إظهار ترقيم الصفحات"},formatPaginationSwitchUp:function(){return"إخفاء ترقيم الصفحات"},formatRefresh:function(){return"تحديث"},formatToggleOn:function(){return"إظهار كبطاقات"},formatToggleOff:function(){return"إلغاء البطاقات"},formatColumns:function(){return"أعمدة"},formatColumnsToggleAll:function(){return"تبديل الكل"},formatFullscreen:function(){return"الشاشة كاملة"},formatAllRows:function(){return"الكل"},formatAutoRefresh:function(){return"تحديث تلقائي"},formatExport:function(){return"تصدير البيانات"},formatJumpTo:function(){return"قفز"},formatAdvancedSearch:function(){return"بحث متقدم"},formatAdvancedCloseButton:function(){return"إغلاق"},formatFilterControlSwitch:function(){return"عرض/إخفاء عناصر التصفية"},formatFilterControlSwitchHide:function(){return"إخفاء عناصر التصفية"},formatFilterControlSwitchShow:function(){return"عرض عناصر التصفية"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ar-SA"]),t.fn.bootstrapTable.locales["da-DK"]=t.fn.bootstrapTable.locales.da={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Indlæser, vent venligst"},formatRecordsPerPage:function(t){return"".concat(t," poster pr side")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Viser ".concat(t," til ").concat(n," af ").concat(r," række").concat(r>1?"r":""," (filtered from ").concat(o," total rows)"):"Viser ".concat(t," til ").concat(n," af ").concat(r," række").concat(r>1?"r":"")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Viser ".concat(t," række").concat(t>1?"r":"")},formatClearSearch:function(){return"Ryd filtre"},formatSearch:function(){return"Søg"},formatNoMatches:function(){return"Ingen poster fundet"},formatPaginationSwitch:function(){return"Skjul/vis nummerering"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Opdater"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Kolonner"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Alle"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Eksporter"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["da-DK"]),t.fn.bootstrapTable.locales["bg-BG"]=t.fn.bootstrapTable.locales.bg={formatCopyRows:function(){return"Копиране на редове"},formatPrint:function(){return"Печат"},formatLoadingMessage:function(){return"Зареждане, моля изчакайте"},formatRecordsPerPage:function(t){return"".concat(t," реда на страница")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Показани редове от ".concat(t," до ").concat(n," от ").concat(r," (филтрирани от общо ").concat(o,")"):"Показани редове от ".concat(t," до ").concat(n," от общо ").concat(r)},formatSRPaginationPreText:function(){return"предишна страница"},formatSRPaginationPageText:function(t){return"до страница ".concat(t)},formatSRPaginationNextText:function(){return"следваща страница"},formatDetailPagination:function(t){return"Показани ".concat(t," реда")},formatClearSearch:function(){return"Изчистване на търсенето"},formatSearch:function(){return"Търсене"},formatNoMatches:function(){return"Не са намерени съвпадащи записи"},formatPaginationSwitch:function(){return"Скриване/Показване на странициране"},formatPaginationSwitchDown:function(){return"Показване на странициране"},formatPaginationSwitchUp:function(){return"Скриване на странициране"},formatRefresh:function(){return"Обновяване"},formatToggleOn:function(){return"Показване на изглед карта"},formatToggleOff:function(){return"Скриване на изглед карта"},formatColumns:function(){return"Колони"},formatColumnsToggleAll:function(){return"Превключване на всички"},formatFullscreen:function(){return"Цял екран"},formatAllRows:function(){return"Всички"},formatAutoRefresh:function(){return"Автоматично обновяване"},formatExport:function(){return"Експорт на данни"},formatJumpTo:function(){return"ОТИДИ"},formatAdvancedSearch:function(){return"Разширено търсене"},formatAdvancedCloseButton:function(){return"Затваряне"},formatFilterControlSwitch:function(){return"Скрива/показва контроли"},formatFilterControlSwitchHide:function(){return"Скрива контроли"},formatFilterControlSwitchShow:function(){return"Показва контроли"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["bg-BG"]),t.fn.bootstrapTable.locales["de-DE"]=t.fn.bootstrapTable.locales.de={formatCopyRows:function(){return"Zeilen kopieren"},formatPrint:function(){return"Drucken"},formatLoadingMessage:function(){return"Lade, bitte warten"},formatRecordsPerPage:function(t){return"".concat(t," Zeilen pro Seite.")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Zeige Zeile ".concat(t," bis ").concat(n," von ").concat(r," Zeile").concat(r>1?"n":""," (Gefiltert von ").concat(o," Zeile").concat(o>1?"n":"",")"):"Zeige Zeile ".concat(t," bis ").concat(n," von ").concat(r," Zeile").concat(r>1?"n":"",".")},formatSRPaginationPreText:function(){return"Vorherige Seite"},formatSRPaginationPageText:function(t){return"Zu Seite ".concat(t)},formatSRPaginationNextText:function(){return"Nächste Seite"},formatDetailPagination:function(t){return"Zeige ".concat(t," Zeile").concat(t>1?"n":"",".")},formatClearSearch:function(){return"Lösche Filter"},formatSearch:function(){return"Suchen"},formatNoMatches:function(){return"Keine passenden Ergebnisse gefunden"},formatPaginationSwitch:function(){return"Verstecke/Zeige Nummerierung"},formatPaginationSwitchDown:function(){return"Zeige Nummerierung"},formatPaginationSwitchUp:function(){return"Verstecke Nummerierung"},formatRefresh:function(){return"Neu laden"},formatToggleOn:function(){return"Normale Ansicht"},formatToggleOff:function(){return"Kartenansicht"},formatColumns:function(){return"Spalten"},formatColumnsToggleAll:function(){return"Alle umschalten"},formatFullscreen:function(){return"Vollbild"},formatAllRows:function(){return"Alle"},formatAutoRefresh:function(){return"Automatisches Neuladen"},formatExport:function(){return"Datenexport"},formatJumpTo:function(){return"Springen"},formatAdvancedSearch:function(){return"Erweiterte Suche"},formatAdvancedCloseButton:function(){return"Schließen"},formatFilterControlSwitch:function(){return"Verstecke/Zeige Filter"},formatFilterControlSwitchHide:function(){return"Verstecke Filter"},formatFilterControlSwitchShow:function(){return"Zeige Filter"},formatAddLevel:function(){return"Ebene hinzufügen"},formatCancel:function(){return"Abbrechen"},formatColumn:function(){return"Spalte"},formatDeleteLevel:function(){return"Ebene entfernen"},formatDuplicateAlertTitle:function(){return"Doppelte Einträge gefunden!"},formatDuplicateAlertDescription:function(){return"Bitte doppelte Spalten entfenen oder ändern"},formatMultipleSort:function(){return"Mehrfachsortierung"},formatOrder:function(){return"Reihenfolge"},formatSort:function(){return"Sortieren"},formatSortBy:function(){return"Sortieren nach"},formatThenBy:function(){return"anschließend"},formatSortOrders:function(){return{asc:"Aufsteigend",desc:"Absteigend"}}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["de-DE"]),t.fn.bootstrapTable.locales["el-GR"]=t.fn.bootstrapTable.locales.el={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Φορτώνει, παρακαλώ περιμένετε"},formatRecordsPerPage:function(t){return"".concat(t," αποτελέσματα ανά σελίδα")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Εμφανίζονται από την ".concat(t," ως την ").concat(n," από σύνολο ").concat(r," σειρών (filtered from ").concat(o," total rows)"):"Εμφανίζονται από την ".concat(t," ως την ").concat(n," από σύνολο ").concat(r," σειρών")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Αναζητήστε"},formatNoMatches:function(){return"Δεν βρέθηκαν αποτελέσματα"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Refresh"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Columns"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["el-GR"]),t.fn.bootstrapTable.locales["es-CR"]={formatCopyRows:function(){return"Copiar filas"},formatPrint:function(){return"Imprimir"},formatLoadingMessage:function(){return"Cargando, por favor espere"},formatRecordsPerPage:function(t){return"".concat(t," filas por página")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Mostrando ".concat(t," a ").concat(n," de ").concat(r," filas (filtrado de un total de ").concat(o," filas)"):"Mostrando ".concat(t," a ").concat(n," de ").concat(r," filas")},formatSRPaginationPreText:function(){return"página anterior"},formatSRPaginationPageText:function(t){return"ir a la página ".concat(t)},formatSRPaginationNextText:function(){return"página siguiente"},formatDetailPagination:function(t){return"Mostrando ".concat(t," filas")},formatClearSearch:function(){return"Limpiar búsqueda"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron resultados"},formatPaginationSwitch:function(){return"Mostrar/ocultar paginación"},formatPaginationSwitchDown:function(){return"Mostrar paginación"},formatPaginationSwitchUp:function(){return"Ocultar paginación"},formatRefresh:function(){return"Actualizar"},formatToggleOn:function(){return"Mostrar vista en tarjetas"},formatToggleOff:function(){return"Ocultar vista en tarjetas"},formatColumns:function(){return"Columnas"},formatColumnsToggleAll:function(){return"Alternar todo"},formatFullscreen:function(){return"Pantalla completa"},formatAllRows:function(){return"Todas las filas"},formatAutoRefresh:function(){return"Actualización automática"},formatExport:function(){return"Exportar"},formatJumpTo:function(){return"Ver"},formatAdvancedSearch:function(){return"Búsqueda avanzada"},formatAdvancedCloseButton:function(){return"Cerrar"},formatFilterControlSwitch:function(){return"Mostrar/ocultar controles"},formatFilterControlSwitchHide:function(){return"Ocultar controles"},formatFilterControlSwitchShow:function(){return"Mostrar controles"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["es-CR"]),t.fn.bootstrapTable.locales["en-US"]=t.fn.bootstrapTable.locales.en={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Loading, please wait"},formatRecordsPerPage:function(t){return"".concat(t," rows per page")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Showing ".concat(t," to ").concat(n," of ").concat(r," rows (filtered from ").concat(o," total rows)"):"Showing ".concat(t," to ").concat(n," of ").concat(r," rows")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Search"},formatNoMatches:function(){return"No matching records found"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Refresh"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Columns"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["en-US"]),t.fn.bootstrapTable.locales["es-CL"]={formatCopyRows:function(){return"Copiar Filas"},formatPrint:function(){return"Imprimir"},formatLoadingMessage:function(){return"Cargando, espere por favor"},formatRecordsPerPage:function(t){return"".concat(t," filas por página")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Mostrando ".concat(t," a ").concat(n," de ").concat(r," filas (filtrado de ").concat(o," filas totales)"):"Mostrando ".concat(t," a ").concat(n," de ").concat(r," filas")},formatSRPaginationPreText:function(){return"página anterior"},formatSRPaginationPageText:function(t){return"a la página ".concat(t)},formatSRPaginationNextText:function(){return"siguiente página"},formatDetailPagination:function(t){return"Mostrando ".concat(t," filas")},formatClearSearch:function(){return"Limpiar búsqueda"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros"},formatPaginationSwitch:function(){return"Ocultar/Mostrar paginación"},formatPaginationSwitchDown:function(){return"Mostrar paginación"},formatPaginationSwitchUp:function(){return"Ocultar paginación"},formatRefresh:function(){return"Refrescar"},formatToggleOn:function(){return"Mostrar vista de carta"},formatToggleOff:function(){return"Ocultar vista de carta"},formatColumns:function(){return"Columnas"},formatColumnsToggleAll:function(){return"Cambiar todo"},formatFullscreen:function(){return"Pantalla completa"},formatAllRows:function(){return"Todo"},formatAutoRefresh:function(){return"Auto Recargar"},formatExport:function(){return"Exportar datos"},formatJumpTo:function(){return"IR"},formatAdvancedSearch:function(){return"Búsqueda avanzada"},formatAdvancedCloseButton:function(){return"Cerrar"},formatFilterControlSwitch:function(){return"Ocultar/Mostrar controles"},formatFilterControlSwitchHide:function(){return"Ocultar controles"},formatFilterControlSwitchShow:function(){return"Mostrar controles"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["es-CL"]),t.fn.bootstrapTable.locales["es-ES"]=t.fn.bootstrapTable.locales.es={formatCopyRows:function(){return"Copiar filas"},formatPrint:function(){return"Imprimir"},formatLoadingMessage:function(){return"Cargando, por favor espere"},formatRecordsPerPage:function(t){return"".concat(t," resultados por página")},formatShowingRows:function(t,n,r,o){var e=r>1?"s":"";return void 0!==o&&o>0&&o>r?"Mostrando desde ".concat(t," hasta ").concat(n," - En total ").concat(r," resultado").concat(e," (filtrado de un total de ").concat(o," fila").concat(e,")"):"Mostrando desde ".concat(t," hasta ").concat(n," - En total ").concat(r," resultado").concat(e)},formatSRPaginationPreText:function(){return"página anterior"},formatSRPaginationPageText:function(t){return"a la página ".concat(t)},formatSRPaginationNextText:function(){return"siguiente página"},formatDetailPagination:function(t){return"Mostrando ".concat(t," fila").concat(t>1?"s":"")},formatClearSearch:function(){return"Limpiar búsqueda"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron resultados coincidentes"},formatPaginationSwitch:function(){return"Ocultar/Mostrar paginación"},formatPaginationSwitchDown:function(){return"Mostrar paginación"},formatPaginationSwitchUp:function(){return"Ocultar paginación"},formatRefresh:function(){return"Recargar"},formatToggleOn:function(){return"Mostrar vista de carta"},formatToggleOff:function(){return"Ocultar vista de carta"},formatColumns:function(){return"Columnas"},formatColumnsToggleAll:function(){return"Cambiar todo"},formatFullscreen:function(){return"Pantalla completa"},formatAllRows:function(){return"Todos"},formatAutoRefresh:function(){return"Auto Recargar"},formatExport:function(){return"Exportar los datos"},formatJumpTo:function(){return"IR"},formatAdvancedSearch:function(){return"Búsqueda avanzada"},formatAdvancedCloseButton:function(){return"Cerrar"},formatFilterControlSwitch:function(){return"Ocultar/Exibir controles"},formatFilterControlSwitchHide:function(){return"Ocultar controles"},formatFilterControlSwitchShow:function(){return"Mostrar controles"},formatAddLevel:function(){return"Agregar nivel"},formatCancel:function(){return"Cancelar"},formatColumn:function(){return"Columna"},formatDeleteLevel:function(){return"Eliminar nivel"},formatDuplicateAlertTitle:function(){return"¡Se encontraron entradas duplicadas!"},formatDuplicateAlertDescription:function(){return"Por favor, elimine o modifique las columnas duplicadas"},formatMultipleSort:function(){return"Ordenación múltiple"},formatOrder:function(){return"Orden"},formatSort:function(){return"Ordenar"},formatSortBy:function(){return"Ordenar por"},formatThenBy:function(){return"a continuación"},formatSortOrders:function(){return{asc:"Ascendente",desc:"Descendente"}}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["es-ES"]),t.fn.bootstrapTable.locales["es-MX"]={formatCopyRows:function(){return"Copiar Filas"},formatPrint:function(){return"Imprimir"},formatLoadingMessage:function(){return"Cargando, espere por favor"},formatRecordsPerPage:function(t){return"".concat(t," resultados por página")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Mostrando ".concat(t," a ").concat(n," de ").concat(r," filas (filtrado de ").concat(o," filas totales)"):"Mostrando ".concat(t," a ").concat(n," de ").concat(r," filas")},formatSRPaginationPreText:function(){return"página anterior"},formatSRPaginationPageText:function(t){return"ir a la página ".concat(t)},formatSRPaginationNextText:function(){return"página siguiente"},formatDetailPagination:function(t){return"Mostrando ".concat(t," filas")},formatClearSearch:function(){return"Limpiar búsqueda"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros que coincidan"},formatPaginationSwitch:function(){return"Mostrar/ocultar paginación"},formatPaginationSwitchDown:function(){return"Mostrar paginación"},formatPaginationSwitchUp:function(){return"Ocultar paginación"},formatRefresh:function(){return"Actualizar"},formatToggleOn:function(){return"Mostrar vista"},formatToggleOff:function(){return"Ocultar vista"},formatColumns:function(){return"Columnas"},formatColumnsToggleAll:function(){return"Alternar todo"},formatFullscreen:function(){return"Pantalla completa"},formatAllRows:function(){return"Todo"},formatAutoRefresh:function(){return"Auto actualizar"},formatExport:function(){return"Exportar datos"},formatJumpTo:function(){return"IR"},formatAdvancedSearch:function(){return"Búsqueda avanzada"},formatAdvancedCloseButton:function(){return"Cerrar"},formatFilterControlSwitch:function(){return"Ocultar/Mostrar controles"},formatFilterControlSwitchHide:function(){return"Ocultar controles"},formatFilterControlSwitchShow:function(){return"Mostrar controles"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["es-MX"]),t.fn.bootstrapTable.locales["es-NI"]={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Cargando, por favor espere"},formatRecordsPerPage:function(t){return"".concat(t," registros por página")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Mostrando de ".concat(t," a ").concat(n," registros de ").concat(r," registros en total (filtered from ").concat(o," total rows)"):"Mostrando de ".concat(t," a ").concat(n," registros de ").concat(r," registros en total")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Limpiar búsqueda"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Refrescar"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Columnas"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Todo"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Ocultar/Mostrar controles"},formatFilterControlSwitchHide:function(){return"Ocultar controles"},formatFilterControlSwitchShow:function(){return"Mostrar controles"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["es-NI"]),t.fn.bootstrapTable.locales["es-SP"]={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Cargando, por favor espera"},formatRecordsPerPage:function(t){return"".concat(t," registros por página.")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"".concat(t," - ").concat(n," de ").concat(r," registros (filtered from ").concat(o," total rows)"):"".concat(t," - ").concat(n," de ").concat(r," registros.")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Limpiar búsqueda"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se han encontrado registros."},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Actualizar"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Columnas"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Todo"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Ocultar/Mostrar controles"},formatFilterControlSwitchHide:function(){return"Ocultar controles"},formatFilterControlSwitchShow:function(){return"Mostrar controles"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["es-SP"]),t.fn.bootstrapTable.locales["eu-EU"]=t.fn.bootstrapTable.locales.eu={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Itxaron mesedez"},formatRecordsPerPage:function(t){return"".concat(t," emaitza orriko.")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"".concat(r," erregistroetatik ").concat(t,"etik ").concat(n,"erakoak erakusten (filtered from ").concat(o," total rows)"):"".concat(r," erregistroetatik ").concat(t,"etik ").concat(n,"erakoak erakusten.")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Bilatu"},formatNoMatches:function(){return"Ez da emaitzarik aurkitu"},formatPaginationSwitch:function(){return"Ezkutatu/Erakutsi orrikatzea"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Eguneratu"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Zutabeak"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Guztiak"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["eu-EU"]),t.fn.bootstrapTable.locales["cs-CZ"]=t.fn.bootstrapTable.locales.cs={formatCopyRows:function(){return"Kopírovat řádky"},formatPrint:function(){return"Tisk"},formatLoadingMessage:function(){return"Čekejte, prosím"},formatRecordsPerPage:function(t){return"".concat(t," položek na stránku")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Zobrazena ".concat(t,". - ").concat(n," . položka z celkových ").concat(r," (filtered from ").concat(o," total rows)"):"Zobrazena ".concat(t,". - ").concat(n," . položka z celkových ").concat(r)},formatSRPaginationPreText:function(){return"předchozí strana"},formatSRPaginationPageText:function(t){return"na stranu ".concat(t)},formatSRPaginationNextText:function(){return"další strana"},formatDetailPagination:function(t){return"Zobrazuji ".concat(t," řádek")},formatClearSearch:function(){return"Smazat hledání"},formatSearch:function(){return"Vyhledávání"},formatNoMatches:function(){return"Nenalezena žádná vyhovující položka"},formatPaginationSwitch:function(){return"Skrýt/Zobrazit stránkování"},formatPaginationSwitchDown:function(){return"Zobrazit stránkování"},formatPaginationSwitchUp:function(){return"Skrýt stránkování"},formatRefresh:function(){return"Aktualizovat"},formatToggleOn:function(){return"Zobrazit karty"},formatToggleOff:function(){return"Zobrazit tabulku"},formatColumns:function(){return"Sloupce"},formatColumnsToggleAll:function(){return"Zobrazit/Skrýt vše"},formatFullscreen:function(){return"Zapnout/Vypnout fullscreen"},formatAllRows:function(){return"Vše"},formatAutoRefresh:function(){return"Automatické obnovení"},formatExport:function(){return"Export dat"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Pokročilé hledání"},formatAdvancedCloseButton:function(){return"Zavřít"},formatFilterControlSwitch:function(){return"Skrýt/Zobrazit ovladače"},formatFilterControlSwitchHide:function(){return"Skrýt ovladače"},formatFilterControlSwitchShow:function(){return"Zobrazit ovladače"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["cs-CZ"]),t.fn.bootstrapTable.locales["et-EE"]=t.fn.bootstrapTable.locales.et={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Päring käib, palun oota"},formatRecordsPerPage:function(t){return"".concat(t," rida lehe kohta")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Näitan tulemusi ".concat(t," kuni ").concat(n," - kokku ").concat(r," tulemust (filtered from ").concat(o," total rows)"):"Näitan tulemusi ".concat(t," kuni ").concat(n," - kokku ").concat(r," tulemust")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Otsi"},formatNoMatches:function(){return"Päringu tingimustele ei vastanud ühtegi tulemust"},formatPaginationSwitch:function(){return"Näita/Peida lehtedeks jagamine"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Värskenda"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Veerud"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Kõik"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["et-EE"]),t.fn.bootstrapTable.locales["fi-FI"]=t.fn.bootstrapTable.locales.fi={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Ladataan, ole hyvä ja odota"},formatRecordsPerPage:function(t){return"".concat(t," riviä sivulla")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Näytetään rivit ".concat(t," - ").concat(n," / ").concat(r," (filtered from ").concat(o," total rows)"):"Näytetään rivit ".concat(t," - ").concat(n," / ").concat(r)},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Poista suodattimet"},formatSearch:function(){return"Hae"},formatNoMatches:function(){return"Hakuehtoja vastaavia tuloksia ei löytynyt"},formatPaginationSwitch:function(){return"Näytä/Piilota sivutus"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Päivitä"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Sarakkeet"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Kaikki"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Vie tiedot"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["fi-FI"]),t.fn.bootstrapTable.locales["fa-IR"]=t.fn.bootstrapTable.locales.fa={formatCopyRows:function(){return"کپی ردیف ها"},formatPrint:function(){return"پرینت"},formatLoadingMessage:function(){return"در حال بارگذاری, لطفا صبر کنید"},formatRecordsPerPage:function(t){return"".concat(t," رکورد در صفحه")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"نمایش ".concat(t," تا ").concat(n," از ").concat(r," ردیف (filtered from ").concat(o," total rows)"):"نمایش ".concat(t," تا ").concat(n," از ").concat(r," ردیف")},formatSRPaginationPreText:function(){return"صفحه قبلی"},formatSRPaginationPageText:function(t){return"به صفحه ".concat(t)},formatSRPaginationNextText:function(){return"صفحه بعدی"},formatDetailPagination:function(t){return"نمایش ".concat(t," سطرها")},formatClearSearch:function(){return"پاک کردن جستجو"},formatSearch:function(){return"جستجو"},formatNoMatches:function(){return"رکوردی یافت نشد."},formatPaginationSwitch:function(){return"نمایش/مخفی صفحه بندی"},formatPaginationSwitchDown:function(){return"نمایش صفحه بندی"},formatPaginationSwitchUp:function(){return"پنهان کردن صفحه بندی"},formatRefresh:function(){return"به روز رسانی"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"سطر ها"},formatColumnsToggleAll:function(){return"تغییر وضعیت همه"},formatFullscreen:function(){return"تمام صفحه"},formatAllRows:function(){return"همه"},formatAutoRefresh:function(){return"رفرش اتوماتیک"},formatExport:function(){return"خروجی دیتا"},formatJumpTo:function(){return"برو"},formatAdvancedSearch:function(){return"جستجوی پیشرفته"},formatAdvancedCloseButton:function(){return"بستن"},formatFilterControlSwitch:function(){return"پنهان/نمایش دادن کنترل ها"},formatFilterControlSwitchHide:function(){return"پنهان کردن کنترل ها"},formatFilterControlSwitchShow:function(){return"نمایش کنترل ها"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["fa-IR"]),t.fn.bootstrapTable.locales["fr-BE"]={formatCopyRows:function(){return"Copier les lignes"},formatPrint:function(){return"Imprimer"},formatLoadingMessage:function(){return"Chargement en cours"},formatRecordsPerPage:function(t){return"".concat(t," lignes par page")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Affichage de ".concat(t," à ").concat(n," sur ").concat(r," lignes (filtrées à partir de ").concat(o," lignes)"):"Affichage de ".concat(t," à ").concat(n," sur ").concat(r," lignes")},formatSRPaginationPreText:function(){return"page précédente"},formatSRPaginationPageText:function(t){return"vers la page ".concat(t)},formatSRPaginationNextText:function(){return"page suivante"},formatDetailPagination:function(t){return"Affichage de ".concat(t," lignes")},formatClearSearch:function(){return"Effacer la recherche"},formatSearch:function(){return"Rechercher"},formatNoMatches:function(){return"Aucun résultat"},formatPaginationSwitch:function(){return"Masquer/Afficher la pagination"},formatPaginationSwitchDown:function(){return"Afficher la pagination"},formatPaginationSwitchUp:function(){return"Masquer la pagination"},formatRefresh:function(){return"Actualiser"},formatToggleOn:function(){return"Afficher la vue en cartes"},formatToggleOff:function(){return"Cacher la vue en cartes"},formatColumns:function(){return"Colonnes"},formatColumnsToggleAll:function(){return"Tout afficher"},formatFullscreen:function(){return"Plein écran"},formatAllRows:function(){return"Tout"},formatAutoRefresh:function(){return"Actualiser automatiquement"},formatExport:function(){return"Exporter"},formatJumpTo:function(){return"Aller à"},formatAdvancedSearch:function(){return"Recherche avancée"},formatAdvancedCloseButton:function(){return"Fermer"},formatFilterControlSwitch:function(){return"Masquer/Afficher les contrôles"},formatFilterControlSwitchHide:function(){return"Masquer les contrôles"},formatFilterControlSwitchShow:function(){return"Afficher les contrôles"},formatToggleCustomViewOn:function(){return"Afficher la vue personnalisée"},formatToggleCustomViewOff:function(){return"Cacher la vue personnalisée"},formatClearFilters:function(){return"Retirer les filtres"},formatAddLevel:function(){return"Ajouter un niveau"},formatCancel:function(){return"Annuler"},formatColumn:function(){return"Colonne"},formatDeleteLevel:function(){return"Supprimer un niveau"},formatDuplicateAlertTitle:function(){return"Des entrées en double ont été trouvées !"},formatDuplicateAlertDescription:function(){return"Veuillez supprimer ou modifier les entrées en double"},formatMultipleSort:function(){return"Tri multiple"},formatOrder:function(){return"Ordre"},formatSort:function(){return"Trier"},formatSortBy:function(){return"Trier par"},formatSortOrders:function(){return{asc:"Ascendant",desc:"Descendant"}},formatThenBy:function(){return"Puis par"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["fr-BE"]),t.fn.bootstrapTable.locales["fr-CH"]={formatCopyRows:function(){return"Copier les lignes"},formatPrint:function(){return"Imprimer"},formatLoadingMessage:function(){return"Chargement en cours"},formatRecordsPerPage:function(t){return"".concat(t," lignes par page")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Affichage de ".concat(t," à ").concat(n," sur ").concat(r," lignes (filtrées à partir de ").concat(o," lignes)"):"Affichage de ".concat(t," à ").concat(n," sur ").concat(r," lignes")},formatSRPaginationPreText:function(){return"page précédente"},formatSRPaginationPageText:function(t){return"vers la page ".concat(t)},formatSRPaginationNextText:function(){return"page suivante"},formatDetailPagination:function(t){return"Affichage de ".concat(t," lignes")},formatClearSearch:function(){return"Effacer la recherche"},formatSearch:function(){return"Rechercher"},formatNoMatches:function(){return"Aucun résultat"},formatPaginationSwitch:function(){return"Masquer/Afficher la pagination"},formatPaginationSwitchDown:function(){return"Afficher la pagination"},formatPaginationSwitchUp:function(){return"Masquer la pagination"},formatRefresh:function(){return"Actualiser"},formatToggleOn:function(){return"Afficher la vue en cartes"},formatToggleOff:function(){return"Cacher la vue en cartes"},formatColumns:function(){return"Colonnes"},formatColumnsToggleAll:function(){return"Tout afficher"},formatFullscreen:function(){return"Plein écran"},formatAllRows:function(){return"Tout"},formatAutoRefresh:function(){return"Actualiser automatiquement"},formatExport:function(){return"Exporter"},formatJumpTo:function(){return"Aller à"},formatAdvancedSearch:function(){return"Recherche avancée"},formatAdvancedCloseButton:function(){return"Fermer"},formatFilterControlSwitch:function(){return"Masquer/Afficher les contrôles"},formatFilterControlSwitchHide:function(){return"Masquer les contrôles"},formatFilterControlSwitchShow:function(){return"Afficher les contrôles"},formatToggleCustomViewOn:function(){return"Afficher la vue personnalisée"},formatToggleCustomViewOff:function(){return"Cacher la vue personnalisée"},formatClearFilters:function(){return"Retirer les filtres"},formatAddLevel:function(){return"Ajouter un niveau"},formatCancel:function(){return"Annuler"},formatColumn:function(){return"Colonne"},formatDeleteLevel:function(){return"Supprimer un niveau"},formatDuplicateAlertTitle:function(){return"Des entrées en double ont été trouvées !"},formatDuplicateAlertDescription:function(){return"Veuillez supprimer ou modifier les entrées en double"},formatMultipleSort:function(){return"Tri multiple"},formatOrder:function(){return"Ordre"},formatSort:function(){return"Trier"},formatSortBy:function(){return"Trier par"},formatSortOrders:function(){return{asc:"Ascendant",desc:"Descendant"}},formatThenBy:function(){return"Puis par"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["fr-CH"]),t.fn.bootstrapTable.locales["fr-FR"]=t.fn.bootstrapTable.locales.fr={formatCopyRows:function(){return"Copier les lignes"},formatPrint:function(){return"Imprimer"},formatLoadingMessage:function(){return"Chargement en cours"},formatRecordsPerPage:function(t){return"".concat(t," lignes par page")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Affichage de ".concat(t," à ").concat(n," sur ").concat(r," lignes (filtrées à partir de ").concat(o," lignes)"):"Affichage de ".concat(t," à ").concat(n," sur ").concat(r," lignes")},formatSRPaginationPreText:function(){return"page précédente"},formatSRPaginationPageText:function(t){return"vers la page ".concat(t)},formatSRPaginationNextText:function(){return"page suivante"},formatDetailPagination:function(t){return"Affichage de ".concat(t," lignes")},formatClearSearch:function(){return"Effacer la recherche"},formatSearch:function(){return"Rechercher"},formatNoMatches:function(){return"Aucun résultat"},formatPaginationSwitch:function(){return"Masquer/Afficher la pagination"},formatPaginationSwitchDown:function(){return"Afficher la pagination"},formatPaginationSwitchUp:function(){return"Masquer la pagination"},formatRefresh:function(){return"Actualiser"},formatToggleOn:function(){return"Afficher la vue en cartes"},formatToggleOff:function(){return"Cacher la vue en cartes"},formatColumns:function(){return"Colonnes"},formatColumnsToggleAll:function(){return"Tout afficher"},formatFullscreen:function(){return"Plein écran"},formatAllRows:function(){return"Tout"},formatAutoRefresh:function(){return"Actualiser automatiquement"},formatExport:function(){return"Exporter"},formatJumpTo:function(){return"Aller à"},formatAdvancedSearch:function(){return"Recherche avancée"},formatAdvancedCloseButton:function(){return"Fermer"},formatFilterControlSwitch:function(){return"Masquer/Afficher les contrôles"},formatFilterControlSwitchHide:function(){return"Masquer les contrôles"},formatFilterControlSwitchShow:function(){return"Afficher les contrôles"},formatToggleCustomViewOn:function(){return"Afficher la vue personnalisée"},formatToggleCustomViewOff:function(){return"Cacher la vue personnalisée"},formatClearFilters:function(){return"Retirer les filtres"},formatAddLevel:function(){return"Ajouter un niveau"},formatCancel:function(){return"Annuler"},formatColumn:function(){return"Colonne"},formatDeleteLevel:function(){return"Supprimer un niveau"},formatDuplicateAlertTitle:function(){return"Des entrées en double ont été trouvées !"},formatDuplicateAlertDescription:function(){return"Veuillez supprimer ou modifier les entrées en double"},formatMultipleSort:function(){return"Tri multiple"},formatOrder:function(){return"Ordre"},formatSort:function(){return"Trier"},formatSortBy:function(){return"Trier par"},formatSortOrders:function(){return{asc:"Ascendant",desc:"Descendant"}},formatThenBy:function(){return"Puis par"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["fr-FR"]),t.fn.bootstrapTable.locales["he-IL"]=t.fn.bootstrapTable.locales.he={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"טוען, נא להמתין"},formatRecordsPerPage:function(t){return"".concat(t," שורות בעמוד")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"מציג ".concat(t," עד ").concat(n," מ-").concat(r,"שורות").concat(o," total rows)"):"מציג ".concat(t," עד ").concat(n," מ-").concat(r," שורות")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"חיפוש"},formatNoMatches:function(){return"לא נמצאו רשומות תואמות"},formatPaginationSwitch:function(){return"הסתר/הצג מספור דפים"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"רענן"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"עמודות"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"הכל"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["he-IL"]),t.fn.bootstrapTable.locales["hi-IN"]={formatCopyRows:function(){return"पंक्तियों की कॉपी करें"},formatPrint:function(){return"प्रिंट"},formatLoadingMessage:function(){return"लोड हो रहा है कृपया प्रतीक्षा करें"},formatRecordsPerPage:function(t){return"".concat(t," प्रति पृष्ठ पंक्तियाँ")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"".concat(t," - ").concat(n," पक्तिया ").concat(r," में से ( ").concat(o," पक्तिया)"):"".concat(t," - ").concat(n," पक्तिया ").concat(r," में से")},formatSRPaginationPreText:function(){return"पिछला पृष्ठ"},formatSRPaginationPageText:function(t){return"".concat(t," पृष्ठ पर")},formatSRPaginationNextText:function(){return"अगला पृष्ठ"},formatDetailPagination:function(t){return"".concat(t," पंक्तियां")},formatClearSearch:function(){return"सर्च क्लिअर करें"},formatSearch:function(){return"सर्च"},formatNoMatches:function(){return"मेल खाते रिकॉर्ड नही मिले"},formatPaginationSwitch:function(){return"छुपाओ/दिखाओ पृष्ठ संख्या"},formatPaginationSwitchDown:function(){return"दिखाओ पृष्ठ संख्या"},formatPaginationSwitchUp:function(){return"छुपाओ पृष्ठ संख्या"},formatRefresh:function(){return"रिफ्रेश"},formatToggleOn:function(){return"कार्ड दृश्य दिखाएं"},formatToggleOff:function(){return"कार्ड दृश्य छुपाएं"},formatColumns:function(){return"कॉलम"},formatColumnsToggleAll:function(){return"टॉगल आल"},formatFullscreen:function(){return"पूर्ण स्क्रीन"},formatAllRows:function(){return"सब"},formatAutoRefresh:function(){return"ऑटो रिफ्रेश"},formatExport:function(){return"एक्सपोर्ट डाटा"},formatJumpTo:function(){return"जाओ"},formatAdvancedSearch:function(){return"एडवांस सर्च"},formatAdvancedCloseButton:function(){return"बंद करे"},formatFilterControlSwitch:function(){return"छुपाओ/दिखाओ कंट्रोल्स"},formatFilterControlSwitchHide:function(){return"छुपाओ कंट्रोल्स"},formatFilterControlSwitchShow:function(){return"दिखाओ कंट्रोल्स"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["hi-IN"]),t.fn.bootstrapTable.locales["hr-HR"]=t.fn.bootstrapTable.locales.hr={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Molimo pričekajte"},formatRecordsPerPage:function(t){return"".concat(t," broj zapisa po stranici")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Prikazujem ".concat(t,". - ").concat(n,". od ukupnog broja zapisa ").concat(r," (filtered from ").concat(o," total rows)"):"Prikazujem ".concat(t,". - ").concat(n,". od ukupnog broja zapisa ").concat(r)},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Pretraži"},formatNoMatches:function(){return"Nije pronađen niti jedan zapis"},formatPaginationSwitch:function(){return"Prikaži/sakrij stranice"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Osvježi"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Kolone"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Sve"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["hr-HR"]),t.fn.bootstrapTable.locales["hu-HU"]=t.fn.bootstrapTable.locales.hu={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Betöltés, kérem várjon"},formatRecordsPerPage:function(t){return"".concat(t," rekord per oldal")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Megjelenítve ".concat(t," - ").concat(n," / ").concat(r," összesen (filtered from ").concat(o," total rows)"):"Megjelenítve ".concat(t," - ").concat(n," / ").concat(r," összesen")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Keresés"},formatNoMatches:function(){return"Nincs találat"},formatPaginationSwitch:function(){return"Lapozó elrejtése/megjelenítése"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Frissítés"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Oszlopok"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Összes"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["hu-HU"]),t.fn.bootstrapTable.locales["it-IT"]=t.fn.bootstrapTable.locales.it={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Caricamento in corso"},formatRecordsPerPage:function(t){return"".concat(t," elementi per pagina")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Visualizzazione da ".concat(t," a ").concat(n," di ").concat(r," elementi (filtrati da ").concat(o," elementi totali)"):"Visualizzazione da ".concat(t," a ").concat(n," di ").concat(r," elementi")},formatSRPaginationPreText:function(){return"pagina precedente"},formatSRPaginationPageText:function(t){return"alla pagina ".concat(t)},formatSRPaginationNextText:function(){return"pagina successiva"},formatDetailPagination:function(t){return"Mostrando ".concat(t," elementi")},formatClearSearch:function(){return"Pulisci filtri"},formatSearch:function(){return"Cerca"},formatNoMatches:function(){return"Nessun elemento trovato"},formatPaginationSwitch:function(){return"Nascondi/Mostra paginazione"},formatPaginationSwitchDown:function(){return"Mostra paginazione"},formatPaginationSwitchUp:function(){return"Nascondi paginazione"},formatRefresh:function(){return"Aggiorna"},formatToggleOn:function(){return"Mostra visuale a scheda"},formatToggleOff:function(){return"Nascondi visuale a scheda"},formatColumns:function(){return"Colonne"},formatColumnsToggleAll:function(){return"Mostra tutte"},formatFullscreen:function(){return"Schermo intero"},formatAllRows:function(){return"Tutto"},formatAutoRefresh:function(){return"Auto Aggiornamento"},formatExport:function(){return"Esporta dati"},formatJumpTo:function(){return"VAI"},formatAdvancedSearch:function(){return"Filtri avanzati"},formatAdvancedCloseButton:function(){return"Chiudi"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["it-IT"]),t.fn.bootstrapTable.locales["fr-LU"]={formatCopyRows:function(){return"Copier les lignes"},formatPrint:function(){return"Imprimer"},formatLoadingMessage:function(){return"Chargement en cours"},formatRecordsPerPage:function(t){return"".concat(t," lignes par page")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Affichage de ".concat(t," à ").concat(n," sur ").concat(r," lignes (filtrées à partir de ").concat(o," lignes)"):"Affichage de ".concat(t," à ").concat(n," sur ").concat(r," lignes")},formatSRPaginationPreText:function(){return"page précédente"},formatSRPaginationPageText:function(t){return"vers la page ".concat(t)},formatSRPaginationNextText:function(){return"page suivante"},formatDetailPagination:function(t){return"Affichage de ".concat(t," lignes")},formatClearSearch:function(){return"Effacer la recherche"},formatSearch:function(){return"Rechercher"},formatNoMatches:function(){return"Aucun résultat"},formatPaginationSwitch:function(){return"Masquer/Afficher la pagination"},formatPaginationSwitchDown:function(){return"Afficher la pagination"},formatPaginationSwitchUp:function(){return"Masquer la pagination"},formatRefresh:function(){return"Actualiser"},formatToggleOn:function(){return"Afficher la vue en cartes"},formatToggleOff:function(){return"Cacher la vue en cartes"},formatColumns:function(){return"Colonnes"},formatColumnsToggleAll:function(){return"Tout afficher"},formatFullscreen:function(){return"Plein écran"},formatAllRows:function(){return"Tout"},formatAutoRefresh:function(){return"Actualiser automatiquement"},formatExport:function(){return"Exporter"},formatJumpTo:function(){return"Aller à"},formatAdvancedSearch:function(){return"Recherche avancée"},formatAdvancedCloseButton:function(){return"Fermer"},formatFilterControlSwitch:function(){return"Masquer/Afficher les contrôles"},formatFilterControlSwitchHide:function(){return"Masquer les contrôles"},formatFilterControlSwitchShow:function(){return"Afficher les contrôles"},formatToggleCustomViewOn:function(){return"Afficher la vue personnalisée"},formatToggleCustomViewOff:function(){return"Cacher la vue personnalisée"},formatClearFilters:function(){return"Retirer les filtres"},formatAddLevel:function(){return"Ajouter un niveau"},formatCancel:function(){return"Annuler"},formatColumn:function(){return"Colonne"},formatDeleteLevel:function(){return"Supprimer un niveau"},formatDuplicateAlertTitle:function(){return"Des entrées en double ont été trouvées !"},formatDuplicateAlertDescription:function(){return"Veuillez supprimer ou modifier les entrées en double"},formatMultipleSort:function(){return"Tri multiple"},formatOrder:function(){return"Ordre"},formatSort:function(){return"Trier"},formatSortBy:function(){return"Trier par"},formatSortOrders:function(){return{asc:"Ascendant",desc:"Descendant"}},formatThenBy:function(){return"Puis par"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["fr-LU"]),t.fn.bootstrapTable.locales["id-ID"]=t.fn.bootstrapTable.locales.id={formatCopyRows:function(){return"Salin baris"},formatPrint:function(){return"Mencetak"},formatLoadingMessage:function(){return"Pemuatan sedang berlangsung"},formatRecordsPerPage:function(t){return"".concat(t," baris per halaman")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Menampilkan dari ".concat(t," hingga ").concat(n," pada ").concat(r," baris (difilter dari ").concat(o," baris)"):"Menampilkan dari ".concat(t," hingga ").concat(n," pada ").concat(r," baris")},formatSRPaginationPreText:function(){return"halaman sebelumnya"},formatSRPaginationPageText:function(t){return"ke halaman ".concat(t)},formatSRPaginationNextText:function(){return"halaman berikutnya"},formatDetailPagination:function(t){return"Tampilan ".concat(t," baris")},formatClearSearch:function(){return"Menghapus pencarian"},formatSearch:function(){return"Pencarian"},formatNoMatches:function(){return"Tidak ada hasil"},formatPaginationSwitch:function(){return"Sembunyikan/Tampilkan penomoran halaman"},formatPaginationSwitchDown:function(){return"Tampilkan penomoran halaman"},formatPaginationSwitchUp:function(){return"Sembunyikan penomoran halaman"},formatRefresh:function(){return"Segarkan"},formatToggleOn:function(){return"Menampilkan tampilan peta"},formatToggleOff:function(){return"Menyembunyikan tampilan peta"},formatColumns:function(){return"Kolom"},formatColumnsToggleAll:function(){return"Tampilkan semua"},formatFullscreen:function(){return"Layar penuh"},formatAllRows:function(){return"Semua"},formatAutoRefresh:function(){return"Penyegaran otomatis"},formatExport:function(){return"Mengekspor data"},formatJumpTo:function(){return"Pergi ke"},formatAdvancedSearch:function(){return"Pencarian lanjutan"},formatAdvancedCloseButton:function(){return"Tutup"},formatFilterControlSwitch:function(){return"Menyembunyikan/Menampilkan kontrol"},formatFilterControlSwitchHide:function(){return"Menyembunyikan kontrol"},formatFilterControlSwitchShow:function(){return"Menampilkan kontrol"},formatToggleCustomViewOn:function(){return"Menampilkan tampilan khusus"},formatToggleCustomViewOff:function(){return"Menyembunyikan tampilan khusus"},formatClearFilters:function(){return"Menghapus filter"},formatAddLevel:function(){return"Menambahkan level"},formatCancel:function(){return"Batal"},formatColumn:function(){return"Kolom"},formatDeleteLevel:function(){return"Menghapus level"},formatDuplicateAlertTitle:function(){return"Entri duplikat telah ditemukan!"},formatDuplicateAlertDescription:function(){return"Harap hapus atau ubah entri duplikat"},formatMultipleSort:function(){return"Penyortiran ganda"},formatOrder:function(){return"Urutan"},formatSort:function(){return"Penyortiran"},formatSortBy:function(){return"Urutkan berdasarkan"},formatSortOrders:function(){return{asc:"Menaik",desc:"Menurun"}},formatThenBy:function(){return"Kemudian oleh"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["id-ID"]),t.fn.bootstrapTable.locales["ja-JP"]=t.fn.bootstrapTable.locales.ja={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"読み込み中です。少々お待ちください。"},formatRecordsPerPage:function(t){return"ページ当たり最大".concat(t,"件")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"全".concat(r,"件から、").concat(t,"から").concat(n,"件目まで表示しています (filtered from ").concat(o," total rows)"):"全".concat(r,"件から、").concat(t,"から").concat(n,"件目まで表示しています")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"検索"},formatNoMatches:function(){return"該当するレコードが見つかりません"},formatPaginationSwitch:function(){return"ページ数を表示・非表示"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"更新"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"列"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"すべて"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ja-JP"]),t.fn.bootstrapTable.locales["lb-LU"]=t.fn.bootstrapTable.locales.lb={formatCopyRows:function(){return"Zeilen kopéieren"},formatPrint:function(){return"Drécken"},formatLoadingMessage:function(){return"Gëtt gelueden, gedellëgt Iech wannechgelift ee Moment"},formatRecordsPerPage:function(t){return"".concat(t," Zeilen per Säit")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Weist Zeil ".concat(t," bis ").concat(n," vun ").concat(r," Zeil").concat(r>1?"en":""," (gefiltert vun insgesamt ").concat(o," Zeil").concat(r>1?"en":"",")"):"Weist Zeil ".concat(t," bis ").concat(n," vun ").concat(r," Zeil").concat(r>1?"en":"")},formatSRPaginationPreText:function(){return"viregt Säit"},formatSRPaginationPageText:function(t){return"op Säit ".concat(t)},formatSRPaginationNextText:function(){return"nächst Säit"},formatDetailPagination:function(t){return"Weist ".concat(t," Zeilen")},formatClearSearch:function(){return"Sich réckgängeg maachen"},formatSearch:function(){return"Sich"},formatNoMatches:function(){return"Keng passend Anträg fonnt"},formatPaginationSwitch:function(){return"Paginatioun uweisen/verstoppen"},formatPaginationSwitchDown:function(){return"Paginatioun uweisen"},formatPaginationSwitchUp:function(){return"Paginatioun verstoppen"},formatRefresh:function(){return"Nei lueden"},formatToggleOn:function(){return"Kaartenusiicht uweisen"},formatToggleOff:function(){return"Kaartenusiicht verstoppen"},formatColumns:function(){return"Kolonnen"},formatColumnsToggleAll:function(){return"All ëmschalten"},formatFullscreen:function(){return"Vollbild"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Automatescht neilueden"},formatExport:function(){return"Daten exportéieren"},formatJumpTo:function(){return"Sprangen"},formatAdvancedSearch:function(){return"Erweidert Sich"},formatAdvancedCloseButton:function(){return"Zoumaachen"},formatFilterControlSwitch:function(){return"Schaltelementer uweisen/verstoppen"},formatFilterControlSwitchHide:function(){return"Schaltelementer verstoppen"},formatFilterControlSwitchShow:function(){return"Schaltelementer uweisen"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["lb-LU"]),t.fn.bootstrapTable.locales["ko-KR"]=t.fn.bootstrapTable.locales.ko={formatCopyRows:function(){return"행 복사"},formatPrint:function(){return"프린트"},formatLoadingMessage:function(){return"데이터를 불러오는 중입니다"},formatRecordsPerPage:function(t){return"페이지 당 ".concat(t,"개 데이터 출력")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"전체 ".concat(r,"개 중 ").concat(t,"~").concat(n,"번째 데이터 출력, (전체 ").concat(o," 행에서 필터됨)"):"전체 ".concat(r,"개 중 ").concat(t,"~").concat(n,"번째 데이터 출력,")},formatSRPaginationPreText:function(){return"이전 페이지"},formatSRPaginationPageText:function(t){return"".concat(t," 페이지로 이동")},formatSRPaginationNextText:function(){return"다음 페이지"},formatDetailPagination:function(t){return"".concat(t," 행들 표시 중")},formatClearSearch:function(){return"검색 초기화"},formatSearch:function(){return"검색"},formatNoMatches:function(){return"조회된 데이터가 없습니다."},formatPaginationSwitch:function(){return"페이지 넘버 보기/숨기기"},formatPaginationSwitchDown:function(){return"페이지 넘버 보기"},formatPaginationSwitchUp:function(){return"페이지 넘버 숨기기"},formatRefresh:function(){return"새로 고침"},formatToggleOn:function(){return"카드뷰 보기"},formatToggleOff:function(){return"카드뷰 숨기기"},formatColumns:function(){return"컬럼 필터링"},formatColumnsToggleAll:function(){return"전체 토글"},formatFullscreen:function(){return"전체 화면"},formatAllRows:function(){return"전체"},formatAutoRefresh:function(){return"자동 갱신"},formatExport:function(){return"데이터 추출"},formatJumpTo:function(){return"이동"},formatAdvancedSearch:function(){return"심화 검색"},formatAdvancedCloseButton:function(){return"닫기"},formatFilterControlSwitch:function(){return"컨트롤 보기/숨기기"},formatFilterControlSwitchHide:function(){return"컨트롤 숨기기"},formatFilterControlSwitchShow:function(){return"컨트롤 보기"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ko-KR"]),t.fn.bootstrapTable.locales["lt-LT"]=t.fn.bootstrapTable.locales.lt={formatCopyRows:function(){return"Kopijuoti eilutes"},formatPrint:function(){return"Spausdinti"},formatLoadingMessage:function(){return"Įkeliama, palaukite"},formatRecordsPerPage:function(t){return"".concat(t," eilučių puslapyje")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Rodomos eilutės nuo ".concat(t," iki ").concat(n," iš ").concat(r," eilučių (atrinktos iš visų ").concat(o," eilučių)"):"Rodomos eilutės nuo ".concat(t," iki ").concat(n," iš ").concat(r," eilučių")},formatSRPaginationPreText:function(){return"ankstesnis puslapis"},formatSRPaginationPageText:function(t){return"į puslapį ".concat(t)},formatSRPaginationNextText:function(){return"sekantis puslapis"},formatDetailPagination:function(t){return"Rodomos ".concat(t," eilutės (-čių)")},formatClearSearch:function(){return"Išvalyti paiešką"},formatSearch:function(){return"Ieškoti"},formatNoMatches:function(){return"Atitinkančių įrašų nerasta"},formatPaginationSwitch:function(){return"Slėpti/rodyti puslapių rūšiavimą"},formatPaginationSwitchDown:function(){return"Rodyti puslapių rūšiavimą"},formatPaginationSwitchUp:function(){return"Slėpti puslapių rūšiavimą"},formatRefresh:function(){return"Atnaujinti"},formatToggleOn:function(){return"Rodyti kortelių rodinį"},formatToggleOff:function(){return"Slėpti kortelių rodinį"},formatColumns:function(){return"Stulpeliai"},formatColumnsToggleAll:function(){return"Perjungti viską"},formatFullscreen:function(){return"Visame ekrane"},formatAllRows:function(){return"Viskas"},formatAutoRefresh:function(){return"Automatinis atnaujinimas"},formatExport:function(){return"Eksportuoti duomenis"},formatJumpTo:function(){return"Eiti"},formatAdvancedSearch:function(){return"Išplėstinė paieška"},formatAdvancedCloseButton:function(){return"Uždaryti"},formatFilterControlSwitch:function(){return"Slėpti/rodyti valdiklius"},formatFilterControlSwitchHide:function(){return"Slėpti valdiklius"},formatFilterControlSwitchShow:function(){return"Rodyti valdiklius"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["lt-LT"]),t.fn.bootstrapTable.locales["ms-MY"]=t.fn.bootstrapTable.locales.ms={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Permintaan sedang dimuatkan. Sila tunggu sebentar"},formatRecordsPerPage:function(t){return"".concat(t," rekod setiap muka surat")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Sedang memaparkan rekod ".concat(t," hingga ").concat(n," daripada jumlah ").concat(r," rekod (filtered from ").concat(o," total rows)"):"Sedang memaparkan rekod ".concat(t," hingga ").concat(n," daripada jumlah ").concat(r," rekod")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Cari"},formatNoMatches:function(){return"Tiada rekod yang menyamai permintaan"},formatPaginationSwitch:function(){return"Tunjuk/sembunyi muka surat"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Muatsemula"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Lajur"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Semua"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ms-MY"]),t.fn.bootstrapTable.locales["nb-NO"]=t.fn.bootstrapTable.locales.nb={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Oppdaterer, vennligst vent"},formatRecordsPerPage:function(t){return"".concat(t," poster pr side")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Viser ".concat(t," til ").concat(n," av ").concat(r," rekker (filtered from ").concat(o," total rows)"):"Viser ".concat(t," til ").concat(n," av ").concat(r," rekker")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Søk"},formatNoMatches:function(){return"Ingen poster funnet"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Oppdater"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Kolonner"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["nb-NO"]),t.fn.bootstrapTable.locales["nl-BE"]={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Laden, even geduld"},formatRecordsPerPage:function(t){return"".concat(t," records per pagina")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Toon ".concat(t," tot ").concat(n," van ").concat(r," record").concat(r>1?"s":""," (gefilterd van ").concat(o," records in totaal)"):"Toon ".concat(t," tot ").concat(n," van ").concat(r," record").concat(r>1?"s":"")},formatSRPaginationPreText:function(){return"vorige pagina"},formatSRPaginationPageText:function(t){return"tot pagina ".concat(t)},formatSRPaginationNextText:function(){return"volgende pagina"},formatDetailPagination:function(t){return"Toon ".concat(t," record").concat(t>1?"s":"")},formatClearSearch:function(){return"Verwijder filters"},formatSearch:function(){return"Zoeken"},formatNoMatches:function(){return"Geen resultaten gevonden"},formatPaginationSwitch:function(){return"Verberg/Toon paginering"},formatPaginationSwitchDown:function(){return"Toon paginering"},formatPaginationSwitchUp:function(){return"Verberg paginering"},formatRefresh:function(){return"Vernieuwen"},formatToggleOn:function(){return"Toon kaartweergave"},formatToggleOff:function(){return"Verberg kaartweergave"},formatColumns:function(){return"Kolommen"},formatColumnsToggleAll:function(){return"Allen omschakelen"},formatFullscreen:function(){return"Volledig scherm"},formatAllRows:function(){return"Alle"},formatAutoRefresh:function(){return"Automatisch vernieuwen"},formatExport:function(){return"Exporteer gegevens"},formatJumpTo:function(){return"GA"},formatAdvancedSearch:function(){return"Geavanceerd zoeken"},formatAdvancedCloseButton:function(){return"Sluiten"},formatFilterControlSwitch:function(){return"Verberg/Toon controls"},formatFilterControlSwitchHide:function(){return"Verberg controls"},formatFilterControlSwitchShow:function(){return"Toon controls"},formatAddLevel:function(){return"Niveau toevoegen"},formatCancel:function(){return"Annuleren"},formatColumn:function(){return"Kolom"},formatDeleteLevel:function(){return"Niveau verwijderen"},formatDuplicateAlertTitle:function(){return"Duplicaten gevonden!"},formatDuplicateAlertDescription:function(){return"Gelieve dubbele kolommen te verwijderen of wijzigen"},formatMultipleSort:function(){return"Meervoudige sortering"},formatOrder:function(){return"Volgorde"},formatSort:function(){return"Sorteren"},formatSortBy:function(){return"Sorteren op"},formatThenBy:function(){return"vervolgens"},formatSortOrders:function(){return{asc:"Oplopend",desc:"Aflopend"}}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["nl-BE"]),t.fn.bootstrapTable.locales["nl-NL"]=t.fn.bootstrapTable.locales.nl={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Laden, even geduld"},formatRecordsPerPage:function(t){return"".concat(t," records per pagina")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Toon ".concat(t," tot ").concat(n," van ").concat(r," record").concat(r>1?"s":""," (gefilterd van ").concat(o," records in totaal)"):"Toon ".concat(t," tot ").concat(n," van ").concat(r," record").concat(r>1?"s":"")},formatSRPaginationPreText:function(){return"vorige pagina"},formatSRPaginationPageText:function(t){return"tot pagina ".concat(t)},formatSRPaginationNextText:function(){return"volgende pagina"},formatDetailPagination:function(t){return"Toon ".concat(t," record").concat(t>1?"s":"")},formatClearSearch:function(){return"Verwijder filters"},formatSearch:function(){return"Zoeken"},formatNoMatches:function(){return"Geen resultaten gevonden"},formatPaginationSwitch:function(){return"Verberg/Toon paginering"},formatPaginationSwitchDown:function(){return"Toon paginering"},formatPaginationSwitchUp:function(){return"Verberg paginering"},formatRefresh:function(){return"Vernieuwen"},formatToggleOn:function(){return"Toon kaartweergave"},formatToggleOff:function(){return"Verberg kaartweergave"},formatColumns:function(){return"Kolommen"},formatColumnsToggleAll:function(){return"Allen omschakelen"},formatFullscreen:function(){return"Volledig scherm"},formatAllRows:function(){return"Alle"},formatAutoRefresh:function(){return"Automatisch vernieuwen"},formatExport:function(){return"Exporteer gegevens"},formatJumpTo:function(){return"GA"},formatAdvancedSearch:function(){return"Geavanceerd zoeken"},formatAdvancedCloseButton:function(){return"Sluiten"},formatFilterControlSwitch:function(){return"Verberg/Toon controls"},formatFilterControlSwitchHide:function(){return"Verberg controls"},formatFilterControlSwitchShow:function(){return"Toon controls"},formatAddLevel:function(){return"Niveau toevoegen"},formatCancel:function(){return"Annuleren"},formatColumn:function(){return"Kolom"},formatDeleteLevel:function(){return"Niveau verwijderen"},formatDuplicateAlertTitle:function(){return"Duplicaten gevonden!"},formatDuplicateAlertDescription:function(){return"Gelieve dubbele kolommen te verwijderen of wijzigen"},formatMultipleSort:function(){return"Meervoudige sortering"},formatOrder:function(){return"Volgorde"},formatSort:function(){return"Sorteren"},formatSortBy:function(){return"Sorteren op"},formatThenBy:function(){return"vervolgens"},formatSortOrders:function(){return{asc:"Oplopend",desc:"Aflopend"}}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["nl-NL"]),t.fn.bootstrapTable.locales["pl-PL"]=t.fn.bootstrapTable.locales.pl={formatCopyRows:function(){return"Kopiuj wiersze"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Ładowanie, proszę czekać"},formatRecordsPerPage:function(t){return"".concat(t," rekordów na stronę")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Wyświetlanie rekordów od ".concat(t," do ").concat(n," z ").concat(r," (filtered from ").concat(o," total rows)"):"Wyświetlanie rekordów od ".concat(t," do ").concat(n," z ").concat(r)},formatSRPaginationPreText:function(){return"poprzednia strona"},formatSRPaginationPageText:function(t){return"z ".concat(t)},formatSRPaginationNextText:function(){return"następna strona"},formatDetailPagination:function(t){return"Wyświetla ".concat(t," wierszy")},formatClearSearch:function(){return"Wyczyść wyszukiwanie"},formatSearch:function(){return"Szukaj"},formatNoMatches:function(){return"Niestety, nic nie znaleziono"},formatPaginationSwitch:function(){return"Pokaż/ukryj stronicowanie"},formatPaginationSwitchDown:function(){return"Pokaż stronicowanie"},formatPaginationSwitchUp:function(){return"Ukryj stronicowanie"},formatRefresh:function(){return"Odśwież"},formatToggleOn:function(){return"Pokaż układ karty"},formatToggleOff:function(){return"Ukryj układ karty"},formatColumns:function(){return"Kolumny"},formatColumnsToggleAll:function(){return"Zaznacz wszystko"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Wszystkie"},formatAutoRefresh:function(){return"Auto odświeżanie"},formatExport:function(){return"Eksport danych"},formatJumpTo:function(){return"Przejdź"},formatAdvancedSearch:function(){return"Wyszukiwanie zaawansowane"},formatAdvancedCloseButton:function(){return"Zamknij"},formatFilterControlSwitch:function(){return"Pokaż/Ukryj"},formatFilterControlSwitchHide:function(){return"Pokaż"},formatFilterControlSwitchShow:function(){return"Ukryj"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["pl-PL"]),t.fn.bootstrapTable.locales["pt-BR"]=t.fn.bootstrapTable.locales.br={formatCopyRows:function(){return"Copiar linhas"},formatPrint:function(){return"Imprimir"},formatLoadingMessage:function(){return"Carregando, aguarde"},formatRecordsPerPage:function(t){return"".concat(t," registros por página")},formatShowingRows:function(t,n,r,o){var e=r>1?"s":"";return void 0!==o&&o>0&&o>r?"Exibindo ".concat(t," até ").concat(n," de ").concat(r," linha").concat(e," (filtrado de um total de ").concat(o," linha").concat(e,")"):"Exibindo ".concat(t," até ").concat(n," de ").concat(r," linha").concat(e)},formatSRPaginationPreText:function(){return"página anterior"},formatSRPaginationPageText:function(t){return"ir para a página ".concat(t)},formatSRPaginationNextText:function(){return"próxima página"},formatDetailPagination:function(t){return"Mostrando ".concat(t," linha").concat(t>1?"s":"")},formatClearSearch:function(){return"Limpar Pesquisa"},formatSearch:function(){return"Pesquisar"},formatNoMatches:function(){return"Nenhum registro encontrado"},formatPaginationSwitch:function(){return"Ocultar/Exibir paginação"},formatPaginationSwitchDown:function(){return"Mostrar Paginação"},formatPaginationSwitchUp:function(){return"Esconder Paginação"},formatRefresh:function(){return"Recarregar"},formatToggleOn:function(){return"Mostrar visualização de cartão"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Colunas"},formatColumnsToggleAll:function(){return"Alternar tudo"},formatFullscreen:function(){return"Tela cheia"},formatAllRows:function(){return"Tudo"},formatAutoRefresh:function(){return"Atualização Automática"},formatExport:function(){return"Exportar dados"},formatJumpTo:function(){return"Ir"},formatAdvancedSearch:function(){return"Pesquisa Avançada"},formatAdvancedCloseButton:function(){return"Fechar"},formatFilterControlSwitch:function(){return"Ocultar/Exibir controles"},formatFilterControlSwitchHide:function(){return"Ocultar controles"},formatFilterControlSwitchShow:function(){return"Exibir controles"},formatAddLevel:function(){return"Adicionar nível"},formatCancel:function(){return"Cancelar"},formatColumn:function(){return"Coluna"},formatDeleteLevel:function(){return"Remover nível"},formatDuplicateAlertTitle:function(){return"Encontradas entradas duplicadas!"},formatDuplicateAlertDescription:function(){return"Por favor, remova ou altere as colunas duplicadas"},formatMultipleSort:function(){return"Ordenação múltipla"},formatOrder:function(){return"Ordem"},formatSort:function(){return"Ordenar"},formatSortBy:function(){return"Ordenar por"},formatThenBy:function(){return"em seguida"},formatSortOrders:function(){return{asc:"Crescente",desc:"Decrescente"}}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["pt-BR"]),t.fn.bootstrapTable.locales["pt-PT"]=t.fn.bootstrapTable.locales.pt={formatCopyRows:function(){return"Copiar Linhas"},formatPrint:function(){return"Imprimir"},formatLoadingMessage:function(){return"A carregar, por favor aguarde"},formatRecordsPerPage:function(t){return"".concat(t," registos por página")},formatShowingRows:function(t,n,r,o){var e=r>1?"s":"";return void 0!==o&&o>0&&o>r?"A mostrar ".concat(t," até ").concat(n," de ").concat(r," linha").concat(e," (filtrado de um total de ").concat(o," linha").concat(e,")"):"A mostrar ".concat(t," até ").concat(n," de ").concat(r," linha").concat(e)},formatSRPaginationPreText:function(){return"página anterior"},formatSRPaginationPageText:function(t){return"ir para página ".concat(t)},formatSRPaginationNextText:function(){return"próxima página"},formatDetailPagination:function(t){return"Mostrando ".concat(t," linha").concat(t>1?"s":"")},formatClearSearch:function(){return"Limpar Pesquisa"},formatSearch:function(){return"Pesquisa"},formatNoMatches:function(){return"Nenhum registo encontrado"},formatPaginationSwitch:function(){return"Esconder/Mostrar paginação"},formatPaginationSwitchDown:function(){return"Mostrar página"},formatPaginationSwitchUp:function(){return"Esconder página"},formatRefresh:function(){return"Actualizar"},formatToggleOn:function(){return"Mostrar vista em forma de cartão"},formatToggleOff:function(){return"Esconder vista em forma de cartão"},formatColumns:function(){return"Colunas"},formatColumnsToggleAll:function(){return"Activar tudo"},formatFullscreen:function(){return"Ecrã completo"},formatAllRows:function(){return"Tudo"},formatAutoRefresh:function(){return"Actualização autmática"},formatExport:function(){return"Exportar dados"},formatJumpTo:function(){return"Avançar"},formatAdvancedSearch:function(){return"Pesquisa avançada"},formatAdvancedCloseButton:function(){return"Fechar"},formatFilterControlSwitch:function(){return"Ocultar/Exibir controles"},formatFilterControlSwitchHide:function(){return"Esconder controlos"},formatFilterControlSwitchShow:function(){return"Exibir controlos"},formatAddLevel:function(){return"Adicionar nível"},formatCancel:function(){return"Cancelar"},formatColumn:function(){return"Coluna"},formatDeleteLevel:function(){return"Remover nível"},formatDuplicateAlertTitle:function(){return"Foram encontradas entradas duplicadas!"},formatDuplicateAlertDescription:function(){return"Por favor, remova ou altere as colunas duplicadas"},formatMultipleSort:function(){return"Ordenação múltipla"},formatOrder:function(){return"Ordem"},formatSort:function(){return"Ordenar"},formatSortBy:function(){return"Ordenar por"},formatThenBy:function(){return"em seguida"},formatSortOrders:function(){return{asc:"Ascendente",desc:"Descendente"}}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["pt-PT"]),t.fn.bootstrapTable.locales["ro-RO"]=t.fn.bootstrapTable.locales.ro={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Se incarca, va rugam asteptati"},formatRecordsPerPage:function(t){return"".concat(t," inregistrari pe pagina")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Arata de la ".concat(t," pana la ").concat(n," din ").concat(r," randuri (filtered from ").concat(o," total rows)"):"Arata de la ".concat(t," pana la ").concat(n," din ").concat(r," randuri")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Cauta"},formatNoMatches:function(){return"Nu au fost gasite inregistrari"},formatPaginationSwitch:function(){return"Ascunde/Arata paginatia"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Reincarca"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Coloane"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Toate"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ro-RO"]),t.fn.bootstrapTable.locales["ka-GE"]=t.fn.bootstrapTable.locales.ka={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"იტვირთება, გთხოვთ მოიცადოთ"},formatRecordsPerPage:function(t){return"".concat(t," ჩანაწერი თითო გვერდზე")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"ნაჩვენებია ".concat(t,"-დან ").concat(n,"-მდე ჩანაწერი ჯამური ").concat(r,"-დან (filtered from ").concat(o," total rows)"):"ნაჩვენებია ".concat(t,"-დან ").concat(n,"-მდე ჩანაწერი ჯამური ").concat(r,"-დან")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"ძებნა"},formatNoMatches:function(){return"მონაცემები არ არის"},formatPaginationSwitch:function(){return"გვერდების გადამრთველის დამალვა/გამოჩენა"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"განახლება"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"სვეტები"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ka-GE"]),t.fn.bootstrapTable.locales["ru-RU"]=t.fn.bootstrapTable.locales.ru={formatCopyRows:function(){return"Скопировать строки"},formatPrint:function(){return"Печать"},formatLoadingMessage:function(){return"Пожалуйста, подождите, идёт загрузка"},formatRecordsPerPage:function(t){return"".concat(t," записей на страницу")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Записи с ".concat(t," по ").concat(n," из ").concat(r," (отфильтровано, всего на сервере ").concat(o," записей)"):"Записи с ".concat(t," по ").concat(n," из ").concat(r)},formatSRPaginationPreText:function(){return"предыдущая страница"},formatSRPaginationPageText:function(t){return"перейти к странице ".concat(t)},formatSRPaginationNextText:function(){return"следующая страница"},formatDetailPagination:function(t){return"Загружено ".concat(t," строк")},formatClearSearch:function(){return"Очистить фильтры"},formatSearch:function(){return"Поиск"},formatNoMatches:function(){return"Ничего не найдено"},formatPaginationSwitch:function(){return"Скрыть/Показать постраничную навигацию"},formatPaginationSwitchDown:function(){return"Показать постраничную навигацию"},formatPaginationSwitchUp:function(){return"Скрыть постраничную навигацию"},formatRefresh:function(){return"Обновить"},formatToggleOn:function(){return"Показать записи в виде карточек"},formatToggleOff:function(){return"Табличный режим просмотра"},formatColumns:function(){return"Колонки"},formatColumnsToggleAll:function(){return"Выбрать все"},formatFullscreen:function(){return"Полноэкранный режим"},formatAllRows:function(){return"Все"},formatAutoRefresh:function(){return"Автоматическое обновление"},formatExport:function(){return"Экспортировать данные"},formatJumpTo:function(){return"Стр."},formatAdvancedSearch:function(){return"Расширенный поиск"},formatAdvancedCloseButton:function(){return"Закрыть"},formatFilterControlSwitch:function(){return"Скрыть/Показать панель инструментов"},formatFilterControlSwitchHide:function(){return"Скрыть панель инструментов"},formatFilterControlSwitchShow:function(){return"Показать панель инструментов"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ru-RU"]),t.fn.bootstrapTable.locales["sk-SK"]=t.fn.bootstrapTable.locales.sk={formatCopyRows:function(){return"Skopírovať riadky"},formatPrint:function(){return"Vytlačiť"},formatLoadingMessage:function(){return"Prosím čakajte"},formatRecordsPerPage:function(t){return"".concat(t," záznamov na stranu")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Zobrazená ".concat(t,". - ").concat(n,". položka z celkových ").concat(r," (filtered from ").concat(o," total rows)"):"Zobrazená ".concat(t,". - ").concat(n,". položka z celkových ").concat(r)},formatSRPaginationPreText:function(){return"Predchádzajúca strana"},formatSRPaginationPageText:function(t){return"na stranu ".concat(t)},formatSRPaginationNextText:function(){return"Nasledujúca strana"},formatDetailPagination:function(t){return"Zobrazuje sa ".concat(t," riadkov")},formatClearSearch:function(){return"Odstráň filtre"},formatSearch:function(){return"Vyhľadávanie"},formatNoMatches:function(){return"Nenájdená žiadna vyhovujúca položka"},formatPaginationSwitch:function(){return"Skry/Zobraz stránkovanie"},formatPaginationSwitchDown:function(){return"Zobraziť stránkovanie"},formatPaginationSwitchUp:function(){return"Skryť stránkovanie"},formatRefresh:function(){return"Obnoviť"},formatToggleOn:function(){return"Zobraziť kartové zobrazenie"},formatToggleOff:function(){return"skryť kartové zobrazenie"},formatColumns:function(){return"Stĺpce"},formatColumnsToggleAll:function(){return"Prepnúť všetky"},formatFullscreen:function(){return"Celá obrazovka"},formatAllRows:function(){return"Všetky"},formatAutoRefresh:function(){return"Automatické obnovenie"},formatExport:function(){return"Exportuj dáta"},formatJumpTo:function(){return"Ísť"},formatAdvancedSearch:function(){return"Pokročilé vyhľadávanie"},formatAdvancedCloseButton:function(){return"Zatvoriť"},formatFilterControlSwitch:function(){return"Zobraziť/Skryť tlačidlá"},formatFilterControlSwitchHide:function(){return"Skryť tlačidlá"},formatFilterControlSwitchShow:function(){return"Zobraziť tlačidlá"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["sk-SK"]),t.fn.bootstrapTable.locales["sl-SI"]=t.fn.bootstrapTable.locales.sl={formatCopyRows:function(){return"Kopiraj vrstice"},formatPrint:function(){return"Natisni"},formatLoadingMessage:function(){return"Prosim počakajte..."},formatRecordsPerPage:function(t){return"".concat(t," vrstic na stran")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Prikaz ".concat(t," do ").concat(n," od ").concat(r," vrstic (filtrirano od skupno ").concat(o," vrstic)"):"Prikaz ".concat(t," do ").concat(n," od ").concat(r," vrstic")},formatSRPaginationPreText:function(){return"prejšnja stran"},formatSRPaginationPageText:function(t){return"na stran ".concat(t)},formatSRPaginationNextText:function(){return"na slednja stran"},formatDetailPagination:function(t){return"Prikaz ".concat(t," vrstic")},formatClearSearch:function(){return"Počisti"},formatSearch:function(){return"Iskanje"},formatNoMatches:function(){return"Ni najdenih rezultatov"},formatPaginationSwitch:function(){return"Skrij/Pokaži oštevilčevanje strani"},formatPaginationSwitchDown:function(){return"Pokaži oštevilčevanje strani"},formatPaginationSwitchUp:function(){return"Skrij oštevilčevanje strani"},formatRefresh:function(){return"Osveži"},formatToggleOn:function(){return"Prikaži kartični pogled"},formatToggleOff:function(){return"Skrij kartični pogled"},formatColumns:function(){return"Stolpci"},formatColumnsToggleAll:function(){return"Preklopi vse"},formatFullscreen:function(){return"Celozaslonski prikaz"},formatAllRows:function(){return"Vse"},formatAutoRefresh:function(){return"Samodejna osvežitev"},formatExport:function(){return"Izvoz podatkov"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Napredno iskanje"},formatAdvancedCloseButton:function(){return"Zapri"},formatFilterControlSwitch:function(){return"Skrij/Pokaži kontrole"},formatFilterControlSwitchHide:function(){return"Skrij kontrole"},formatFilterControlSwitchShow:function(){return"Pokaži kontrole"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["sl-SI"]),t.fn.bootstrapTable.locales["sr-Cyrl-RS"]=t.fn.bootstrapTable.locales.sr={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Молим сачекај"},formatRecordsPerPage:function(t){return"".concat(t," редова по страни")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Приказано ".concat(t,". - ").concat(n,". од укупног броја редова ").concat(r," (филтрирано од ").concat(o,")"):"Приказано ".concat(t,". - ").concat(n,". од укупног броја редова ").concat(r)},formatSRPaginationPreText:function(){return"претходна страна"},formatSRPaginationPageText:function(t){return"на страну ".concat(t)},formatSRPaginationNextText:function(){return"следећа страна"},formatDetailPagination:function(t){return"Приказано ".concat(t," редова")},formatClearSearch:function(){return"Обриши претрагу"},formatSearch:function(){return"Пронађи"},formatNoMatches:function(){return"Није пронађен ни један податак"},formatPaginationSwitch:function(){return"Прикажи/сакриј пагинацију"},formatPaginationSwitchDown:function(){return"Прикажи пагинацију"},formatPaginationSwitchUp:function(){return"Сакриј пагинацију"},formatRefresh:function(){return"Освежи"},formatToggleOn:function(){return"Прикажи картице"},formatToggleOff:function(){return"Сакриј картице"},formatColumns:function(){return"Колоне"},formatColumnsToggleAll:function(){return"Прикажи/сакриј све"},formatFullscreen:function(){return"Цео екран"},formatAllRows:function(){return"Све"},formatAutoRefresh:function(){return"Аутоматско освежавање"},formatExport:function(){return"Извези податке"},formatJumpTo:function(){return"Иди"},formatAdvancedSearch:function(){return"Напредна претрага"},formatAdvancedCloseButton:function(){return"Затвори"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["sr-Cyrl-RS"]),t.fn.bootstrapTable.locales["sr-Latn-RS"]={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Molim sačekaj"},formatRecordsPerPage:function(t){return"".concat(t," redova po strani")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Prikazano ".concat(t,". - ").concat(n,". od ukupnog broja redova ").concat(r," (filtrirano od ").concat(o,")"):"Prikazano ".concat(t,". - ").concat(n,". od ukupnog broja redova ").concat(r)},formatSRPaginationPreText:function(){return"prethodna strana"},formatSRPaginationPageText:function(t){return"na stranu ".concat(t)},formatSRPaginationNextText:function(){return"sledeća strana"},formatDetailPagination:function(t){return"Prikazano ".concat(t," redova")},formatClearSearch:function(){return"Obriši pretragu"},formatSearch:function(){return"Pronađi"},formatNoMatches:function(){return"Nije pronađen ni jedan podatak"},formatPaginationSwitch:function(){return"Prikaži/sakrij paginaciju"},formatPaginationSwitchDown:function(){return"Prikaži paginaciju"},formatPaginationSwitchUp:function(){return"Sakrij paginaciju"},formatRefresh:function(){return"Osveži"},formatToggleOn:function(){return"Prikaži kartice"},formatToggleOff:function(){return"Sakrij kartice"},formatColumns:function(){return"Kolone"},formatColumnsToggleAll:function(){return"Prikaži/sakrij sve"},formatFullscreen:function(){return"Ceo ekran"},formatAllRows:function(){return"Sve"},formatAutoRefresh:function(){return"Automatsko osvežavanje"},formatExport:function(){return"Izvezi podatke"},formatJumpTo:function(){return"Idi"},formatAdvancedSearch:function(){return"Napredna pretraga"},formatAdvancedCloseButton:function(){return"Zatvori"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["sr-Latn-RS"]),t.fn.bootstrapTable.locales["sv-SE"]=t.fn.bootstrapTable.locales.sv={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Laddar, vänligen vänta"},formatRecordsPerPage:function(t){return"".concat(t," rader per sida")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Visa ".concat(t," till ").concat(n," av ").concat(r," rader (filtered from ").concat(o," total rows)"):"Visa ".concat(t," till ").concat(n," av ").concat(r," rader")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"Sök"},formatNoMatches:function(){return"Inga matchande resultat funna."},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Uppdatera"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"kolumn"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["sv-SE"]),t.fn.bootstrapTable.locales["th-TH"]=t.fn.bootstrapTable.locales.th={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"กำลังโหลดข้อมูล, กรุณารอสักครู่"},formatRecordsPerPage:function(t){return"".concat(t," รายการต่อหน้า")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"รายการที่ ".concat(t," ถึง ").concat(n," จากทั้งหมด ").concat(r," รายการ (filtered from ").concat(o," total rows)"):"รายการที่ ".concat(t," ถึง ").concat(n," จากทั้งหมด ").concat(r," รายการ")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"ค้นหา"},formatNoMatches:function(){return"ไม่พบรายการที่ค้นหา !"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"รีเฟรส"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"คอลัมน์"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["th-TH"]),t.fn.bootstrapTable.locales["uk-UA"]=t.fn.bootstrapTable.locales.uk={formatCopyRows:function(){return"Скопіювати рядки"},formatPrint:function(){return"Друк"},formatLoadingMessage:function(){return"Завантаження, будь ласка, зачекайте"},formatRecordsPerPage:function(t){return"".concat(t," рядків на сторінку")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Відображено рядки з ".concat(t," по ").concat(n," з ").concat(r," загалом (відфільтровано з ").concat(o," рядків)"):"Відображено рядки з ".concat(t," по ").concat(n," з ").concat(r," загалом")},formatSRPaginationPreText:function(){return"попередня сторінка"},formatSRPaginationPageText:function(t){return"до сторінки ".concat(t)},formatSRPaginationNextText:function(){return"наступна сторінка"},formatDetailPagination:function(t){return"Відображено ".concat(t," рядків")},formatClearSearch:function(){return"Скинути фільтри"},formatSearch:function(){return"Пошук"},formatNoMatches:function(){return"Не знайдено жодного запису"},formatPaginationSwitch:function(){return"Сховати/Відобразити пагінацію"},formatPaginationSwitchDown:function(){return"Відобразити пагінацію"},formatPaginationSwitchUp:function(){return"Сховати пагінацію"},formatRefresh:function(){return"Оновити"},formatToggleOn:function(){return"Відобразити у форматі карток"},formatToggleOff:function(){return"Вимкнути формат карток"},formatColumns:function(){return"Стовпці"},formatColumnsToggleAll:function(){return"Переключити усі"},formatFullscreen:function(){return"Повноекранний режим"},formatAllRows:function(){return"Усі"},formatAutoRefresh:function(){return"Автооновлення"},formatExport:function(){return"Експортувати дані"},formatJumpTo:function(){return"Швидкий перехід до"},formatAdvancedSearch:function(){return"Розширений пошук"},formatAdvancedCloseButton:function(){return"Закрити"},formatFilterControlSwitch:function(){return"Сховати/Відобразити елементи керування"},formatFilterControlSwitchHide:function(){return"Сховати елементи керування"},formatFilterControlSwitchShow:function(){return"Відобразити елементи керування"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["uk-UA"]),t.fn.bootstrapTable.locales["tr-TR"]=t.fn.bootstrapTable.locales.tr={formatCopyRows:function(){return"Satırları Kopyala"},formatPrint:function(){return"Yazdır"},formatLoadingMessage:function(){return"Yükleniyor, lütfen bekleyin"},formatRecordsPerPage:function(t){return"Sayfa başına ".concat(t," kayıt.")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"".concat(r," kayıttan ").concat(t,"-").concat(n," arası gösteriliyor (").concat(o," toplam satır filtrelendi)."):"".concat(r," kayıttan ").concat(t,"-").concat(n," arası gösteriliyor.")},formatSRPaginationPreText:function(){return"önceki sayfa"},formatSRPaginationPageText:function(t){return"sayfa ".concat(t)},formatSRPaginationNextText:function(){return"sonraki sayfa"},formatDetailPagination:function(t){return"".concat(t," satır gösteriliyor")},formatClearSearch:function(){return"Aramayı Temizle"},formatSearch:function(){return"Ara"},formatNoMatches:function(){return"Eşleşen kayıt bulunamadı."},formatPaginationSwitch:function(){return"Sayfalamayı Gizle/Göster"},formatPaginationSwitchDown:function(){return"Sayfalamayı Göster"},formatPaginationSwitchUp:function(){return"Sayfalamayı Gizle"},formatRefresh:function(){return"Yenile"},formatToggleOn:function(){return"Kart Görünümünü Göster"},formatToggleOff:function(){return"Kart Görünümünü Gizle"},formatColumns:function(){return"Sütunlar"},formatColumnsToggleAll:function(){return"Tümünü Kapat"},formatFullscreen:function(){return"Tam Ekran"},formatAllRows:function(){return"Tüm Satırlar"},formatAutoRefresh:function(){return"Otomatik Yenileme"},formatExport:function(){return"Verileri Dışa Aktar"},formatJumpTo:function(){return"Git"},formatAdvancedSearch:function(){return"Gelişmiş Arama"},formatAdvancedCloseButton:function(){return"Kapat"},formatFilterControlSwitch:function(){return"Kontrolleri Gizle/Göster"},formatFilterControlSwitchHide:function(){return"Kontrolleri Gizle"},formatFilterControlSwitchShow:function(){return"Kontrolleri Göster"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["tr-TR"]),t.fn.bootstrapTable.locales["ur-PK"]=t.fn.bootstrapTable.locales.ur={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"براۓ مہربانی انتظار کیجئے"},formatRecordsPerPage:function(t){return"".concat(t," ریکارڈز فی صفہ ")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"دیکھیں ".concat(t," سے ").concat(n," کے ").concat(r,"ریکارڈز (filtered from ").concat(o," total rows)"):"دیکھیں ".concat(t," سے ").concat(n," کے ").concat(r,"ریکارڈز")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Clear Search"},formatSearch:function(){return"تلاش"},formatNoMatches:function(){return"کوئی ریکارڈ نہیں ملا"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"تازہ کریں"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"کالم"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"All"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Export data"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["ur-PK"]),t.fn.bootstrapTable.locales["uz-Latn-UZ"]=t.fn.bootstrapTable.locales.uz={formatCopyRows:function(){return"Copy Rows"},formatPrint:function(){return"Print"},formatLoadingMessage:function(){return"Yuklanyapti, iltimos kuting"},formatRecordsPerPage:function(t){return"".concat(t," qator har sahifada")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Ko'rsatypati ".concat(t," dan ").concat(n," gacha ").concat(r," qatorlarni (filtered from ").concat(o," total rows)"):"Ko'rsatypati ".concat(t," dan ").concat(n," gacha ").concat(r," qatorlarni")},formatSRPaginationPreText:function(){return"previous page"},formatSRPaginationPageText:function(t){return"to page ".concat(t)},formatSRPaginationNextText:function(){return"next page"},formatDetailPagination:function(t){return"Showing ".concat(t," rows")},formatClearSearch:function(){return"Filtrlarni tozalash"},formatSearch:function(){return"Qidirish"},formatNoMatches:function(){return"Hech narsa topilmadi"},formatPaginationSwitch:function(){return"Sahifalashni yashirish/ko'rsatish"},formatPaginationSwitchDown:function(){return"Show pagination"},formatPaginationSwitchUp:function(){return"Hide pagination"},formatRefresh:function(){return"Yangilash"},formatToggleOn:function(){return"Show card view"},formatToggleOff:function(){return"Hide card view"},formatColumns:function(){return"Ustunlar"},formatColumnsToggleAll:function(){return"Toggle all"},formatFullscreen:function(){return"Fullscreen"},formatAllRows:function(){return"Hammasi"},formatAutoRefresh:function(){return"Auto Refresh"},formatExport:function(){return"Eksport"},formatJumpTo:function(){return"GO"},formatAdvancedSearch:function(){return"Advanced search"},formatAdvancedCloseButton:function(){return"Close"},formatFilterControlSwitch:function(){return"Hide/Show controls"},formatFilterControlSwitchHide:function(){return"Hide controls"},formatFilterControlSwitchShow:function(){return"Show controls"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["uz-Latn-UZ"]),t.fn.bootstrapTable.locales["vi-VN"]=t.fn.bootstrapTable.locales.vi={formatCopyRows:function(){return"Sao chép hàng"},formatPrint:function(){return"In"},formatLoadingMessage:function(){return"Đang tải"},formatRecordsPerPage:function(t){return"".concat(t," bản ghi mỗi trang")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Hiển thị từ trang ".concat(t," đến ").concat(n," của ").concat(r," bản ghi (được lọc từ tổng ").concat(o," hàng)"):"Hiển thị từ trang ".concat(t," đến ").concat(n," của ").concat(r," bản ghi")},formatSRPaginationPreText:function(){return"trang trước"},formatSRPaginationPageText:function(t){return"đến trang ".concat(t)},formatSRPaginationNextText:function(){return"trang sau"},formatDetailPagination:function(t){return"Đang hiện ".concat(t," hàng")},formatClearSearch:function(){return"Xoá tìm kiếm"},formatSearch:function(){return"Tìm kiếm"},formatNoMatches:function(){return"Không có dữ liệu"},formatPaginationSwitch:function(){return"Ẩn/Hiện phân trang"},formatPaginationSwitchDown:function(){return"Hiện phân trang"},formatPaginationSwitchUp:function(){return"Ẩn phân trang"},formatRefresh:function(){return"Làm mới"},formatToggleOn:function(){return"Hiển thị các thẻ"},formatToggleOff:function(){return"Ẩn các thẻ"},formatColumns:function(){return"Cột"},formatColumnsToggleAll:function(){return"Hiện tất cả"},formatFullscreen:function(){return"Toàn màn hình"},formatAllRows:function(){return"Tất cả"},formatAutoRefresh:function(){return"Tự động làm mới"},formatExport:function(){return"Xuất dữ liệu"},formatJumpTo:function(){return"Đến"},formatAdvancedSearch:function(){return"Tìm kiếm nâng cao"},formatAdvancedCloseButton:function(){return"Đóng"},formatFilterControlSwitch:function(){return"Ẩn/Hiện điều khiển"},formatFilterControlSwitchHide:function(){return"Ẩn điều khiển"},formatFilterControlSwitchShow:function(){return"Hiện điều khiển"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["vi-VN"]),t.fn.bootstrapTable.locales["zh-CN"]=t.fn.bootstrapTable.locales.zh={formatCopyRows:function(){return"复制行"},formatPrint:function(){return"打印"},formatLoadingMessage:function(){return"正在努力地加载数据中,请稍候"},formatRecordsPerPage:function(t){return"每页显示 ".concat(t," 条记录")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"显示第 ".concat(t," 到第 ").concat(n," 条记录,总共 ").concat(r," 条记录(从 ").concat(o," 总记录中过滤)"):"显示第 ".concat(t," 到第 ").concat(n," 条记录,总共 ").concat(r," 条记录")},formatSRPaginationPreText:function(){return"上一页"},formatSRPaginationPageText:function(t){return"第".concat(t,"页")},formatSRPaginationNextText:function(){return"下一页"},formatDetailPagination:function(t){return"总共 ".concat(t," 条记录")},formatClearSearch:function(){return"清空过滤"},formatSearch:function(){return"搜索"},formatNoMatches:function(){return"没有找到匹配的记录"},formatPaginationSwitch:function(){return"隐藏/显示分页"},formatPaginationSwitchDown:function(){return"显示分页"},formatPaginationSwitchUp:function(){return"隐藏分页"},formatRefresh:function(){return"刷新"},formatToggleOn:function(){return"显示卡片视图"},formatToggleOff:function(){return"隐藏卡片视图"},formatColumns:function(){return"列"},formatColumnsToggleAll:function(){return"切换所有"},formatFullscreen:function(){return"全屏"},formatAllRows:function(){return"所有"},formatAutoRefresh:function(){return"自动刷新"},formatExport:function(){return"导出数据"},formatJumpTo:function(){return"跳转"},formatAdvancedSearch:function(){return"高级搜索"},formatAdvancedCloseButton:function(){return"关闭"},formatFilterControlSwitch:function(){return"隐藏/显示过滤控制"},formatFilterControlSwitchHide:function(){return"隐藏过滤控制"},formatFilterControlSwitchShow:function(){return"显示过滤控制"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["zh-CN"]),t.fn.bootstrapTable.locales["zh-TW"]={formatCopyRows:function(){return"複製行"},formatPrint:function(){return"列印"},formatLoadingMessage:function(){return"正在努力地載入資料,請稍候"},formatRecordsPerPage:function(t){return"每頁顯示 ".concat(t," 項記錄")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"顯示第 ".concat(t," 到第 ").concat(n," 項記錄,總共 ").concat(r," 項記錄(從 ").concat(o," 總記錄中過濾)"):"顯示第 ".concat(t," 到第 ").concat(n," 項記錄,總共 ").concat(r," 項記錄")},formatSRPaginationPreText:function(){return"上一頁"},formatSRPaginationPageText:function(t){return"第".concat(t,"頁")},formatSRPaginationNextText:function(){return"下一頁"},formatDetailPagination:function(t){return"總共 ".concat(t," 項記錄")},formatClearSearch:function(){return"清空過濾"},formatSearch:function(){return"搜尋"},formatNoMatches:function(){return"沒有找到符合的結果"},formatPaginationSwitch:function(){return"隱藏/顯示分頁"},formatPaginationSwitchDown:function(){return"顯示分頁"},formatPaginationSwitchUp:function(){return"隱藏分頁"},formatRefresh:function(){return"重新整理"},formatToggleOn:function(){return"顯示卡片視圖"},formatToggleOff:function(){return"隱藏卡片視圖"},formatColumns:function(){return"列"},formatColumnsToggleAll:function(){return"切換所有"},formatFullscreen:function(){return"全屏"},formatAllRows:function(){return"所有"},formatAutoRefresh:function(){return"自動刷新"},formatExport:function(){return"導出數據"},formatJumpTo:function(){return"跳轉"},formatAdvancedSearch:function(){return"高級搜尋"},formatAdvancedCloseButton:function(){return"關閉"},formatFilterControlSwitch:function(){return"隱藏/顯示過濾控制"},formatFilterControlSwitchHide:function(){return"隱藏過濾控制"},formatFilterControlSwitchShow:function(){return"顯示過濾控制"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["zh-TW"]),t.fn.bootstrapTable.locales["es-AR"]={formatCopyRows:function(){return"Copiar Filas"},formatPrint:function(){return"Imprimir"},formatLoadingMessage:function(){return"Cargando, espere por favor"},formatRecordsPerPage:function(t){return"".concat(t," registros por página")},formatShowingRows:function(t,n,r,o){return void 0!==o&&o>0&&o>r?"Mostrando desde ".concat(t," a ").concat(n," de ").concat(r," filas (filtrado de ").concat(o," columnas totales)"):"Mostrando desde ".concat(t," a ").concat(n," de ").concat(r," filas")},formatSRPaginationPreText:function(){return"página anterior"},formatSRPaginationPageText:function(t){return"a la página ".concat(t)},formatSRPaginationNextText:function(){return"siguiente página"},formatDetailPagination:function(t){return"Mostrando ".concat(t," columnas")},formatClearSearch:function(){return"Limpiar búsqueda"},formatSearch:function(){return"Buscar"},formatNoMatches:function(){return"No se encontraron registros"},formatPaginationSwitch:function(){return"Ocultar/Mostrar paginación"},formatPaginationSwitchDown:function(){return"Mostrar paginación"},formatPaginationSwitchUp:function(){return"Ocultar paginación"},formatRefresh:function(){return"Recargar"},formatToggleOn:function(){return"Mostrar vista de carta"},formatToggleOff:function(){return"Ocultar vista de carta"},formatColumns:function(){return"Columnas"},formatColumnsToggleAll:function(){return"Cambiar todo"},formatFullscreen:function(){return"Pantalla completa"},formatAllRows:function(){return"Todo"},formatAutoRefresh:function(){return"Auto Recargar"},formatExport:function(){return"Exportar datos"},formatJumpTo:function(){return"Ir"},formatAdvancedSearch:function(){return"Búsqueda avanzada"},formatAdvancedCloseButton:function(){return"Cerrar"},formatFilterControlSwitch:function(){return"Ocultar/Mostrar controles"},formatFilterControlSwitchHide:function(){return"Ocultar controles"},formatFilterControlSwitchShow:function(){return"Mostrar controles"}},Object.assign(t.fn.bootstrapTable.defaults,t.fn.bootstrapTable.locales["es-AR"])})); diff --git a/web/skins/classic/assets/bootstrap-table-1.24.1/bootstrap-table-vue.js b/web/skins/classic/assets/bootstrap-table-1.24.1/bootstrap-table-vue.js deleted file mode 100644 index 22cb557b1..000000000 --- a/web/skins/classic/assets/bootstrap-table-1.24.1/bootstrap-table-vue.js +++ /dev/null @@ -1,2001 +0,0 @@ -var wt = {}; -/** -* @vue/shared v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/ -/*! #__NO_SIDE_EFFECTS__ */ -// @__NO_SIDE_EFFECTS__ -function kt(e) { - const t = /* @__PURE__ */ Object.create(null); - for (const n of e.split(",")) t[n] = 1; - return (n) => n in t; -} -const $ = wt.NODE_ENV !== "production" ? Object.freeze({}) : {}, en = wt.NODE_ENV !== "production" ? Object.freeze([]) : [], ie = () => { -}, tn = (e) => e.charCodeAt(0) === 111 && e.charCodeAt(1) === 110 && // uppercase letter -(e.charCodeAt(2) > 122 || e.charCodeAt(2) < 97), R = Object.assign, nn = Object.prototype.hasOwnProperty, N = (e, t) => nn.call(e, t), b = Array.isArray, k = (e) => Ce(e) === "[object Map]", rn = (e) => Ce(e) === "[object Set]", O = (e) => typeof e == "function", F = (e) => typeof e == "string", pe = (e) => typeof e == "symbol", y = (e) => e !== null && typeof e == "object", sn = (e) => (y(e) || O(e)) && O(e.then) && O(e.catch), on = Object.prototype.toString, Ce = (e) => on.call(e), Nt = (e) => Ce(e).slice(8, -1), cn = (e) => Ce(e) === "[object Object]", ke = (e) => F(e) && e !== "NaN" && e[0] !== "-" && "" + parseInt(e, 10) === e, ln = (e) => { - const t = /* @__PURE__ */ Object.create(null); - return (n) => t[n] || (t[n] = e(n)); -}, an = ln((e) => e.charAt(0).toUpperCase() + e.slice(1)), q = (e, t) => !Object.is(e, t), un = (e, t, n, s = !1) => { - Object.defineProperty(e, t, { - configurable: !0, - enumerable: !1, - writable: s, - value: n - }); -}; -let ft; -const Ie = () => ft || (ft = typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : typeof global < "u" ? global : {}); -function et(e) { - if (b(e)) { - const t = {}; - for (let n = 0; n < e.length; n++) { - const s = e[n], r = F(s) ? hn(s) : et(s); - if (r) - for (const i in r) - t[i] = r[i]; - } - return t; - } else if (F(e) || y(e)) - return e; -} -const fn = /;(?![^(]*\))/g, pn = /:([^]+)/, dn = /\/\*[^]*?\*\//g; -function hn(e) { - const t = {}; - return e.replace(dn, "").split(fn).forEach((n) => { - if (n) { - const s = n.split(pn); - s.length > 1 && (t[s[0].trim()] = s[1].trim()); - } - }), t; -} -function tt(e) { - let t = ""; - if (F(e)) - t = e; - else if (b(e)) - for (let n = 0; n < e.length; n++) { - const s = tt(e[n]); - s && (t += s + " "); - } - else if (y(e)) - for (const n in e) - e[n] && (t += n + " "); - return t.trim(); -} -var E = {}; -function z(e, ...t) { - console.warn(`[Vue warn] ${e}`, ...t); -} -let m; -const je = /* @__PURE__ */ new WeakSet(); -class gn { - constructor(t) { - this.fn = t, this.deps = void 0, this.depsTail = void 0, this.flags = 5, this.next = void 0, this.cleanup = void 0, this.scheduler = void 0; - } - pause() { - this.flags |= 64; - } - resume() { - this.flags & 64 && (this.flags &= -65, je.has(this) && (je.delete(this), this.trigger())); - } - /** - * @internal - */ - notify() { - this.flags & 2 && !(this.flags & 32) || this.flags & 8 || _n(this); - } - run() { - if (!(this.flags & 1)) - return this.fn(); - this.flags |= 2, pt(this), Ot(this); - const t = m, n = A; - m = this, A = !0; - try { - return this.fn(); - } finally { - E.NODE_ENV !== "production" && m !== this && z( - "Active effect was not restored correctly - this is likely a Vue internal bug." - ), xt(this), m = t, A = n, this.flags &= -3; - } - } - stop() { - if (this.flags & 1) { - for (let t = this.deps; t; t = t.nextDep) - st(t); - this.deps = this.depsTail = void 0, pt(this), this.onStop && this.onStop(), this.flags &= -2; - } - } - trigger() { - this.flags & 64 ? je.add(this) : this.scheduler ? this.scheduler() : this.runIfDirty(); - } - /** - * @internal - */ - runIfDirty() { - Be(this) && this.run(); - } - get dirty() { - return Be(this); - } -} -let St = 0, oe, ce; -function _n(e, t = !1) { - if (e.flags |= 8, t) { - e.next = ce, ce = e; - return; - } - e.next = oe, oe = e; -} -function nt() { - St++; -} -function rt() { - if (--St > 0) - return; - if (ce) { - let t = ce; - for (ce = void 0; t; ) { - const n = t.next; - t.next = void 0, t.flags &= -9, t = n; - } - } - let e; - for (; oe; ) { - let t = oe; - for (oe = void 0; t; ) { - const n = t.next; - if (t.next = void 0, t.flags &= -9, t.flags & 1) - try { - t.trigger(); - } catch (s) { - e || (e = s); - } - t = n; - } - } - if (e) throw e; -} -function Ot(e) { - for (let t = e.deps; t; t = t.nextDep) - t.version = -1, t.prevActiveLink = t.dep.activeLink, t.dep.activeLink = t; -} -function xt(e) { - let t, n = e.depsTail, s = n; - for (; s; ) { - const r = s.prevDep; - s.version === -1 ? (s === n && (n = r), st(s), bn(s)) : t = s, s.dep.activeLink = s.prevActiveLink, s.prevActiveLink = void 0, s = r; - } - e.deps = t, e.depsTail = n; -} -function Be(e) { - for (let t = e.deps; t; t = t.nextDep) - if (t.dep.version !== t.version || t.dep.computed && (mn(t.dep.computed) || t.dep.version !== t.version)) - return !0; - return !!e._dirty; -} -function mn(e) { - if (e.flags & 4 && !(e.flags & 16) || (e.flags &= -17, e.globalVersion === Oe)) - return; - e.globalVersion = Oe; - const t = e.dep; - if (e.flags |= 2, t.version > 0 && !e.isSSR && e.deps && !Be(e)) { - e.flags &= -3; - return; - } - const n = m, s = A; - m = e, A = !0; - try { - Ot(e); - const r = e.fn(e._value); - (t.version === 0 || q(r, e._value)) && (e._value = r, t.version++); - } catch (r) { - throw t.version++, r; - } finally { - m = n, A = s, xt(e), e.flags &= -3; - } -} -function st(e, t = !1) { - const { dep: n, prevSub: s, nextSub: r } = e; - if (s && (s.nextSub = r, e.prevSub = void 0), r && (r.prevSub = s, e.nextSub = void 0), E.NODE_ENV !== "production" && n.subsHead === e && (n.subsHead = r), n.subs === e && (n.subs = s, !s && n.computed)) { - n.computed.flags &= -5; - for (let i = n.computed.deps; i; i = i.nextDep) - st(i, !0); - } - !t && !--n.sc && n.map && n.map.delete(n.key); -} -function bn(e) { - const { prevDep: t, nextDep: n } = e; - t && (t.nextDep = n, e.prevDep = void 0), n && (n.prevDep = t, e.nextDep = void 0); -} -let A = !0; -const vt = []; -function $e() { - vt.push(A), A = !1; -} -function Pe() { - const e = vt.pop(); - A = e === void 0 ? !0 : e; -} -function pt(e) { - const { cleanup: t } = e; - if (e.cleanup = void 0, t) { - const n = m; - m = void 0; - try { - t(); - } finally { - m = n; - } - } -} -let Oe = 0; -class En { - constructor(t, n) { - this.sub = t, this.dep = n, this.version = n.version, this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; - } -} -class wn { - constructor(t) { - this.computed = t, this.version = 0, this.activeLink = void 0, this.subs = void 0, this.map = void 0, this.key = void 0, this.sc = 0, E.NODE_ENV !== "production" && (this.subsHead = void 0); - } - track(t) { - if (!m || !A || m === this.computed) - return; - let n = this.activeLink; - if (n === void 0 || n.sub !== m) - n = this.activeLink = new En(m, this), m.deps ? (n.prevDep = m.depsTail, m.depsTail.nextDep = n, m.depsTail = n) : m.deps = m.depsTail = n, yt(n); - else if (n.version === -1 && (n.version = this.version, n.nextDep)) { - const s = n.nextDep; - s.prevDep = n.prevDep, n.prevDep && (n.prevDep.nextDep = s), n.prevDep = m.depsTail, n.nextDep = void 0, m.depsTail.nextDep = n, m.depsTail = n, m.deps === n && (m.deps = s); - } - return E.NODE_ENV !== "production" && m.onTrack && m.onTrack( - R( - { - effect: m - }, - t - ) - ), n; - } - trigger(t) { - this.version++, Oe++, this.notify(t); - } - notify(t) { - nt(); - try { - if (E.NODE_ENV !== "production") - for (let n = this.subsHead; n; n = n.nextSub) - n.sub.onTrigger && !(n.sub.flags & 8) && n.sub.onTrigger( - R( - { - effect: n.sub - }, - t - ) - ); - for (let n = this.subs; n; n = n.prevSub) - n.sub.notify() && n.sub.dep.notify(); - } finally { - rt(); - } - } -} -function yt(e) { - if (e.dep.sc++, e.sub.flags & 4) { - const t = e.dep.computed; - if (t && !e.dep.subs) { - t.flags |= 20; - for (let s = t.deps; s; s = s.nextDep) - yt(s); - } - const n = e.dep.subs; - n !== e && (e.prevSub = n, n && (n.nextSub = e)), E.NODE_ENV !== "production" && e.dep.subsHead === void 0 && (e.dep.subsHead = e), e.dep.subs = e; - } -} -const Je = /* @__PURE__ */ new WeakMap(), Y = Symbol( - E.NODE_ENV !== "production" ? "Object iterate" : "" -), qe = Symbol( - E.NODE_ENV !== "production" ? "Map keys iterate" : "" -), ae = Symbol( - E.NODE_ENV !== "production" ? "Array iterate" : "" -); -function x(e, t, n) { - if (A && m) { - let s = Je.get(e); - s || Je.set(e, s = /* @__PURE__ */ new Map()); - let r = s.get(n); - r || (s.set(n, r = new wn()), r.map = s, r.key = n), E.NODE_ENV !== "production" ? r.track({ - target: e, - type: t, - key: n - }) : r.track(); - } -} -function K(e, t, n, s, r, i) { - const o = Je.get(e); - if (!o) { - Oe++; - return; - } - const c = (a) => { - a && (E.NODE_ENV !== "production" ? a.trigger({ - target: e, - type: t, - key: n, - newValue: s, - oldValue: r, - oldTarget: i - }) : a.trigger()); - }; - if (nt(), t === "clear") - o.forEach(c); - else { - const a = b(e), f = a && ke(n); - if (a && n === "length") { - const d = Number(s); - o.forEach((l, u) => { - (u === "length" || u === ae || !pe(u) && u >= d) && c(l); - }); - } else - switch ((n !== void 0 || o.has(void 0)) && c(o.get(n)), f && c(o.get(ae)), t) { - case "add": - a ? f && c(o.get("length")) : (c(o.get(Y)), k(e) && c(o.get(qe))); - break; - case "delete": - a || (c(o.get(Y)), k(e) && c(o.get(qe))); - break; - case "set": - k(e) && c(o.get(Y)); - break; - } - } - rt(); -} -function Z(e) { - const t = h(e); - return t === e ? t : (x(t, "iterate", ae), V(e) ? t : t.map(T)); -} -function it(e) { - return x(e = h(e), "iterate", ae), e; -} -const Nn = { - __proto__: null, - [Symbol.iterator]() { - return He(this, Symbol.iterator, T); - }, - concat(...e) { - return Z(this).concat( - ...e.map((t) => b(t) ? Z(t) : t) - ); - }, - entries() { - return He(this, "entries", (e) => (e[1] = T(e[1]), e)); - }, - every(e, t) { - return j(this, "every", e, t, void 0, arguments); - }, - filter(e, t) { - return j(this, "filter", e, t, (n) => n.map(T), arguments); - }, - find(e, t) { - return j(this, "find", e, t, T, arguments); - }, - findIndex(e, t) { - return j(this, "findIndex", e, t, void 0, arguments); - }, - findLast(e, t) { - return j(this, "findLast", e, t, T, arguments); - }, - findLastIndex(e, t) { - return j(this, "findLastIndex", e, t, void 0, arguments); - }, - // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement - forEach(e, t) { - return j(this, "forEach", e, t, void 0, arguments); - }, - includes(...e) { - return We(this, "includes", e); - }, - indexOf(...e) { - return We(this, "indexOf", e); - }, - join(e) { - return Z(this).join(e); - }, - // keys() iterator only reads `length`, no optimisation required - lastIndexOf(...e) { - return We(this, "lastIndexOf", e); - }, - map(e, t) { - return j(this, "map", e, t, void 0, arguments); - }, - pop() { - return re(this, "pop"); - }, - push(...e) { - return re(this, "push", e); - }, - reduce(e, ...t) { - return dt(this, "reduce", e, t); - }, - reduceRight(e, ...t) { - return dt(this, "reduceRight", e, t); - }, - shift() { - return re(this, "shift"); - }, - // slice could use ARRAY_ITERATE but also seems to beg for range tracking - some(e, t) { - return j(this, "some", e, t, void 0, arguments); - }, - splice(...e) { - return re(this, "splice", e); - }, - toReversed() { - return Z(this).toReversed(); - }, - toSorted(e) { - return Z(this).toSorted(e); - }, - toSpliced(...e) { - return Z(this).toSpliced(...e); - }, - unshift(...e) { - return re(this, "unshift", e); - }, - values() { - return He(this, "values", T); - } -}; -function He(e, t, n) { - const s = it(e), r = s[t](); - return s !== e && !V(e) && (r._next = r.next, r.next = () => { - const i = r._next(); - return i.value && (i.value = n(i.value)), i; - }), r; -} -const Sn = Array.prototype; -function j(e, t, n, s, r, i) { - const o = it(e), c = o !== e && !V(e), a = o[t]; - if (a !== Sn[t]) { - const l = a.apply(e, i); - return c ? T(l) : l; - } - let f = n; - o !== e && (c ? f = function(l, u) { - return n.call(this, T(l), u, e); - } : n.length > 2 && (f = function(l, u) { - return n.call(this, l, u, e); - })); - const d = a.call(o, f, s); - return c && r ? r(d) : d; -} -function dt(e, t, n, s) { - const r = it(e); - let i = n; - return r !== e && (V(e) ? n.length > 3 && (i = function(o, c, a) { - return n.call(this, o, c, a, e); - }) : i = function(o, c, a) { - return n.call(this, o, T(c), a, e); - }), r[t](i, ...s); -} -function We(e, t, n) { - const s = h(e); - x(s, "iterate", ae); - const r = s[t](...n); - return (r === -1 || r === !1) && xe(n[0]) ? (n[0] = h(n[0]), s[t](...n)) : r; -} -function re(e, t, n = []) { - $e(), nt(); - const s = h(e)[t].apply(e, n); - return rt(), Pe(), s; -} -const On = /* @__PURE__ */ kt("__proto__,__v_isRef,__isVue"), Dt = new Set( - /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((e) => e !== "arguments" && e !== "caller").map((e) => Symbol[e]).filter(pe) -); -function xn(e) { - pe(e) || (e = String(e)); - const t = h(this); - return x(t, "has", e), t.hasOwnProperty(e); -} -class Tt { - constructor(t = !1, n = !1) { - this._isReadonly = t, this._isShallow = n; - } - get(t, n, s) { - if (n === "__v_skip") return t.__v_skip; - const r = this._isReadonly, i = this._isShallow; - if (n === "__v_isReactive") - return !r; - if (n === "__v_isReadonly") - return r; - if (n === "__v_isShallow") - return i; - if (n === "__v_raw") - return s === (r ? i ? It : Ct : i ? Pn : Rt).get(t) || // receiver is not the reactive proxy, but has the same prototype - // this means the receiver is a user proxy of the reactive proxy - Object.getPrototypeOf(t) === Object.getPrototypeOf(s) ? t : void 0; - const o = b(t); - if (!r) { - let a; - if (o && (a = Nn[n])) - return a; - if (n === "hasOwnProperty") - return xn; - } - const c = Reflect.get( - t, - n, - // if this is a proxy wrapping a ref, return methods using the raw ref - // as receiver so that we don't have to call `toRaw` on the ref in all - // its class methods - D(t) ? t : s - ); - return (pe(n) ? Dt.has(n) : On(n)) || (r || x(t, "get", n), i) ? c : D(c) ? o && ke(n) ? c : c.value : y(c) ? r ? Pt(c) : $t(c) : c; - } -} -class vn extends Tt { - constructor(t = !1) { - super(!1, t); - } - set(t, n, s, r) { - let i = t[n]; - if (!this._isShallow) { - const a = U(i); - if (!V(s) && !U(s) && (i = h(i), s = h(s)), !b(t) && D(i) && !D(s)) - return a ? !1 : (i.value = s, !0); - } - const o = b(t) && ke(n) ? Number(n) < t.length : N(t, n), c = Reflect.set( - t, - n, - s, - D(t) ? t : r - ); - return t === h(r) && (o ? q(s, i) && K(t, "set", n, s, i) : K(t, "add", n, s)), c; - } - deleteProperty(t, n) { - const s = N(t, n), r = t[n], i = Reflect.deleteProperty(t, n); - return i && s && K(t, "delete", n, void 0, r), i; - } - has(t, n) { - const s = Reflect.has(t, n); - return (!pe(n) || !Dt.has(n)) && x(t, "has", n), s; - } - ownKeys(t) { - return x( - t, - "iterate", - b(t) ? "length" : Y - ), Reflect.ownKeys(t); - } -} -class Vt extends Tt { - constructor(t = !1) { - super(!0, t); - } - set(t, n) { - return E.NODE_ENV !== "production" && z( - `Set operation on key "${String(n)}" failed: target is readonly.`, - t - ), !0; - } - deleteProperty(t, n) { - return E.NODE_ENV !== "production" && z( - `Delete operation on key "${String(n)}" failed: target is readonly.`, - t - ), !0; - } -} -const yn = /* @__PURE__ */ new vn(), Dn = /* @__PURE__ */ new Vt(), Tn = /* @__PURE__ */ new Vt(!0), Ye = (e) => e, ge = (e) => Reflect.getPrototypeOf(e); -function Vn(e, t, n) { - return function(...s) { - const r = this.__v_raw, i = h(r), o = k(i), c = e === "entries" || e === Symbol.iterator && o, a = e === "keys" && o, f = r[e](...s), d = n ? Ye : t ? Ge : T; - return !t && x( - i, - "iterate", - a ? qe : Y - ), { - // iterator protocol - next() { - const { value: l, done: u } = f.next(); - return u ? { value: l, done: u } : { - value: c ? [d(l[0]), d(l[1])] : d(l), - done: u - }; - }, - // iterable protocol - [Symbol.iterator]() { - return this; - } - }; - }; -} -function _e(e) { - return function(...t) { - if (E.NODE_ENV !== "production") { - const n = t[0] ? `on key "${t[0]}" ` : ""; - z( - `${an(e)} operation ${n}failed: target is readonly.`, - h(this) - ); - } - return e === "delete" ? !1 : e === "clear" ? void 0 : this; - }; -} -function Rn(e, t) { - const n = { - get(r) { - const i = this.__v_raw, o = h(i), c = h(r); - e || (q(r, c) && x(o, "get", r), x(o, "get", c)); - const { has: a } = ge(o), f = t ? Ye : e ? Ge : T; - if (a.call(o, r)) - return f(i.get(r)); - if (a.call(o, c)) - return f(i.get(c)); - i !== o && i.get(r); - }, - get size() { - const r = this.__v_raw; - return !e && x(h(r), "iterate", Y), Reflect.get(r, "size", r); - }, - has(r) { - const i = this.__v_raw, o = h(i), c = h(r); - return e || (q(r, c) && x(o, "has", r), x(o, "has", c)), r === c ? i.has(r) : i.has(r) || i.has(c); - }, - forEach(r, i) { - const o = this, c = o.__v_raw, a = h(c), f = t ? Ye : e ? Ge : T; - return !e && x(a, "iterate", Y), c.forEach((d, l) => r.call(i, f(d), f(l), o)); - } - }; - return R( - n, - e ? { - add: _e("add"), - set: _e("set"), - delete: _e("delete"), - clear: _e("clear") - } : { - add(r) { - !t && !V(r) && !U(r) && (r = h(r)); - const i = h(this); - return ge(i).has.call(i, r) || (i.add(r), K(i, "add", r, r)), this; - }, - set(r, i) { - !t && !V(i) && !U(i) && (i = h(i)); - const o = h(this), { has: c, get: a } = ge(o); - let f = c.call(o, r); - f ? E.NODE_ENV !== "production" && ht(o, c, r) : (r = h(r), f = c.call(o, r)); - const d = a.call(o, r); - return o.set(r, i), f ? q(i, d) && K(o, "set", r, i, d) : K(o, "add", r, i), this; - }, - delete(r) { - const i = h(this), { has: o, get: c } = ge(i); - let a = o.call(i, r); - a ? E.NODE_ENV !== "production" && ht(i, o, r) : (r = h(r), a = o.call(i, r)); - const f = c ? c.call(i, r) : void 0, d = i.delete(r); - return a && K(i, "delete", r, void 0, f), d; - }, - clear() { - const r = h(this), i = r.size !== 0, o = E.NODE_ENV !== "production" ? k(r) ? new Map(r) : new Set(r) : void 0, c = r.clear(); - return i && K( - r, - "clear", - void 0, - void 0, - o - ), c; - } - } - ), [ - "keys", - "values", - "entries", - Symbol.iterator - ].forEach((r) => { - n[r] = Vn(r, e, t); - }), n; -} -function ot(e, t) { - const n = Rn(e, t); - return (s, r, i) => r === "__v_isReactive" ? !e : r === "__v_isReadonly" ? e : r === "__v_raw" ? s : Reflect.get( - N(n, r) && r in s ? n : s, - r, - i - ); -} -const Cn = { - get: /* @__PURE__ */ ot(!1, !1) -}, In = { - get: /* @__PURE__ */ ot(!0, !1) -}, $n = { - get: /* @__PURE__ */ ot(!0, !0) -}; -function ht(e, t, n) { - const s = h(n); - if (s !== n && t.call(e, s)) { - const r = Nt(e); - z( - `Reactive ${r} contains both the raw and reactive versions of the same object${r === "Map" ? " as keys" : ""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.` - ); - } -} -const Rt = /* @__PURE__ */ new WeakMap(), Pn = /* @__PURE__ */ new WeakMap(), Ct = /* @__PURE__ */ new WeakMap(), It = /* @__PURE__ */ new WeakMap(); -function An(e) { - switch (e) { - case "Object": - case "Array": - return 1; - case "Map": - case "Set": - case "WeakMap": - case "WeakSet": - return 2; - default: - return 0; - } -} -function Mn(e) { - return e.__v_skip || !Object.isExtensible(e) ? 0 : An(Nt(e)); -} -function $t(e) { - return U(e) ? e : ct( - e, - !1, - yn, - Cn, - Rt - ); -} -function Pt(e) { - return ct( - e, - !0, - Dn, - In, - Ct - ); -} -function me(e) { - return ct( - e, - !0, - Tn, - $n, - It - ); -} -function ct(e, t, n, s, r) { - if (!y(e)) - return E.NODE_ENV !== "production" && z( - `value cannot be made ${t ? "readonly" : "reactive"}: ${String( - e - )}` - ), e; - if (e.__v_raw && !(t && e.__v_isReactive)) - return e; - const i = r.get(e); - if (i) - return i; - const o = Mn(e); - if (o === 0) - return e; - const c = new Proxy( - e, - o === 2 ? s : n - ); - return r.set(e, c), c; -} -function ee(e) { - return U(e) ? ee(e.__v_raw) : !!(e && e.__v_isReactive); -} -function U(e) { - return !!(e && e.__v_isReadonly); -} -function V(e) { - return !!(e && e.__v_isShallow); -} -function xe(e) { - return e ? !!e.__v_raw : !1; -} -function h(e) { - const t = e && e.__v_raw; - return t ? h(t) : e; -} -function Fn(e) { - return !N(e, "__v_skip") && Object.isExtensible(e) && un(e, "__v_skip", !0), e; -} -const T = (e) => y(e) ? $t(e) : e, Ge = (e) => y(e) ? Pt(e) : e; -function D(e) { - return e ? e.__v_isRef === !0 : !1; -} -function jn(e) { - return D(e) ? e.value : e; -} -const Hn = { - get: (e, t, n) => t === "__v_raw" ? e : jn(Reflect.get(e, t, n)), - set: (e, t, n, s) => { - const r = e[t]; - return D(r) && !D(n) ? (r.value = n, !0) : Reflect.set(e, t, n, s); - } -}; -function Wn(e) { - return ee(e) ? e : new Proxy(e, Hn); -} -const be = {}, ve = /* @__PURE__ */ new WeakMap(); -let J; -function Kn(e, t = !1, n = J) { - if (n) { - let s = ve.get(n); - s || ve.set(n, s = []), s.push(e); - } else E.NODE_ENV !== "production" && !t && z( - "onWatcherCleanup() was called when there was no active watcher to associate with." - ); -} -function Ln(e, t, n = $) { - const { immediate: s, deep: r, once: i, scheduler: o, augmentJob: c, call: a } = n, f = (g) => { - (n.onWarn || z)( - "Invalid watch source: ", - g, - "A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types." - ); - }, d = (g) => r ? g : V(g) || r === !1 || r === 0 ? L(g, 1) : L(g); - let l, u, p, w, C = !1, de = !1; - if (D(e) ? (u = () => e.value, C = V(e)) : ee(e) ? (u = () => d(e), C = !0) : b(e) ? (de = !0, C = e.some((g) => ee(g) || V(g)), u = () => e.map((g) => { - if (D(g)) - return g.value; - if (ee(g)) - return d(g); - if (O(g)) - return a ? a(g, 2) : g(); - E.NODE_ENV !== "production" && f(g); - })) : O(e) ? t ? u = a ? () => a(e, 2) : e : u = () => { - if (p) { - $e(); - try { - p(); - } finally { - Pe(); - } - } - const g = J; - J = l; - try { - return a ? a(e, 3, [w]) : e(w); - } finally { - J = g; - } - } : (u = ie, E.NODE_ENV !== "production" && f(e)), t && r) { - const g = u, M = r === !0 ? 1 / 0 : r; - u = () => L(g(), M); - } - const Q = () => { - l.stop(); - }; - if (i && t) { - const g = t; - t = (...M) => { - g(...M), Q(); - }; - } - let B = de ? new Array(e.length).fill(be) : be; - const ne = (g) => { - if (!(!(l.flags & 1) || !l.dirty && !g)) - if (t) { - const M = l.run(); - if (r || C || (de ? M.some((Fe, he) => q(Fe, B[he])) : q(M, B))) { - p && p(); - const Fe = J; - J = l; - try { - const he = [ - M, - // pass undefined as the old value when it's changed for the first time - B === be ? void 0 : de && B[0] === be ? [] : B, - w - ]; - a ? a(t, 3, he) : ( - // @ts-expect-error - t(...he) - ), B = M; - } finally { - J = Fe; - } - } - } else - l.run(); - }; - return c && c(ne), l = new gn(u), l.scheduler = o ? () => o(ne, !1) : ne, w = (g) => Kn(g, !1, l), p = l.onStop = () => { - const g = ve.get(l); - if (g) { - if (a) - a(g, 4); - else - for (const M of g) M(); - ve.delete(l); - } - }, E.NODE_ENV !== "production" && (l.onTrack = n.onTrack, l.onTrigger = n.onTrigger), t ? s ? ne(!0) : B = l.run() : o ? o(ne.bind(null, !0), !0) : l.run(), Q.pause = l.pause.bind(l), Q.resume = l.resume.bind(l), Q.stop = Q, Q; -} -function L(e, t = 1 / 0, n) { - if (t <= 0 || !y(e) || e.__v_skip || (n = n || /* @__PURE__ */ new Set(), n.has(e))) - return e; - if (n.add(e), t--, D(e)) - L(e.value, t, n); - else if (b(e)) - for (let s = 0; s < e.length; s++) - L(e[s], t, n); - else if (rn(e) || k(e)) - e.forEach((s) => { - L(s, t, n); - }); - else if (cn(e)) { - for (const s in e) - L(e[s], t, n); - for (const s of Object.getOwnPropertySymbols(e)) - Object.prototype.propertyIsEnumerable.call(e, s) && L(e[s], t, n); - } - return e; -} -var _ = {}; -const G = []; -function zn(e) { - G.push(e); -} -function Un() { - G.pop(); -} -let Ke = !1; -function S(e, ...t) { - if (Ke) return; - Ke = !0, $e(); - const n = G.length ? G[G.length - 1].component : null, s = n && n.appContext.config.warnHandler, r = Bn(); - if (s) - Ae( - s, - n, - 11, - [ - // eslint-disable-next-line no-restricted-syntax - e + t.map((i) => { - var o, c; - return (c = (o = i.toString) == null ? void 0 : o.call(i)) != null ? c : JSON.stringify(i); - }).join(""), - n && n.proxy, - r.map( - ({ vnode: i }) => `at <${Zt(n, i.type)}>` - ).join(` -`), - r - ] - ); - else { - const i = [`[Vue warn]: ${e}`, ...t]; - r.length && i.push(` -`, ...Jn(r)), console.warn(...i); - } - Pe(), Ke = !1; -} -function Bn() { - let e = G[G.length - 1]; - if (!e) - return []; - const t = []; - for (; e; ) { - const n = t[0]; - n && n.vnode === e ? n.recurseCount++ : t.push({ - vnode: e, - recurseCount: 0 - }); - const s = e.component && e.component.parent; - e = s && s.vnode; - } - return t; -} -function Jn(e) { - const t = []; - return e.forEach((n, s) => { - t.push(...s === 0 ? [] : [` -`], ...qn(n)); - }), t; -} -function qn({ vnode: e, recurseCount: t }) { - const n = t > 0 ? `... (${t} recursive calls)` : "", s = e.component ? e.component.parent == null : !1, r = ` at <${Zt( - e.component, - e.type, - s - )}`, i = ">" + n; - return e.props ? [r, ...Yn(e.props), i] : [r + i]; -} -function Yn(e) { - const t = [], n = Object.keys(e); - return n.slice(0, 3).forEach((s) => { - t.push(...At(s, e[s])); - }), n.length > 3 && t.push(" ..."), t; -} -function At(e, t, n) { - return F(t) ? (t = JSON.stringify(t), n ? t : [`${e}=${t}`]) : typeof t == "number" || typeof t == "boolean" || t == null ? n ? t : [`${e}=${t}`] : D(t) ? (t = At(e, h(t.value), !0), n ? t : [`${e}=Ref<`, t, ">"]) : O(t) ? [`${e}=fn${t.name ? `<${t.name}>` : ""}`] : (t = h(t), n ? t : [`${e}=`, t]); -} -const Mt = { - sp: "serverPrefetch hook", - bc: "beforeCreate hook", - c: "created hook", - bm: "beforeMount hook", - m: "mounted hook", - bu: "beforeUpdate hook", - u: "updated", - bum: "beforeUnmount hook", - um: "unmounted hook", - a: "activated hook", - da: "deactivated hook", - ec: "errorCaptured hook", - rtc: "renderTracked hook", - rtg: "renderTriggered hook", - 0: "setup function", - 1: "render function", - 2: "watcher getter", - 3: "watcher callback", - 4: "watcher cleanup function", - 5: "native event handler", - 6: "component event handler", - 7: "vnode hook", - 8: "directive hook", - 9: "transition hook", - 10: "app errorHandler", - 11: "app warnHandler", - 12: "ref function", - 13: "async component loader", - 14: "scheduler flush", - 15: "component update", - 16: "app unmount cleanup function" -}; -function Ae(e, t, n, s) { - try { - return s ? e(...s) : e(); - } catch (r) { - lt(r, t, n); - } -} -function Ft(e, t, n, s) { - if (O(e)) { - const r = Ae(e, t, n, s); - return r && sn(r) && r.catch((i) => { - lt(i, t, n); - }), r; - } - if (b(e)) { - const r = []; - for (let i = 0; i < e.length; i++) - r.push(Ft(e[i], t, n, s)); - return r; - } else _.NODE_ENV !== "production" && S( - `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof e}` - ); -} -function lt(e, t, n, s = !0) { - const r = t ? t.vnode : null, { errorHandler: i, throwUnhandledErrorInProduction: o } = t && t.appContext.config || $; - if (t) { - let c = t.parent; - const a = t.proxy, f = _.NODE_ENV !== "production" ? Mt[n] : `https://vuejs.org/error-reference/#runtime-${n}`; - for (; c; ) { - const d = c.ec; - if (d) { - for (let l = 0; l < d.length; l++) - if (d[l](e, a, f) === !1) - return; - } - c = c.parent; - } - if (i) { - $e(), Ae(i, null, 10, [ - e, - a, - f - ]), Pe(); - return; - } - } - Gn(e, n, r, s, o); -} -function Gn(e, t, n, s = !0, r = !1) { - if (_.NODE_ENV !== "production") { - const i = Mt[t]; - if (n && zn(n), S(`Unhandled error${i ? ` during execution of ${i}` : ""}`), n && Un(), s) - throw e; - console.error(e); - } else { - if (r) - throw e; - console.error(e); - } -} -const I = []; -let H = -1; -const te = []; -let W = null, X = 0; -const jt = /* @__PURE__ */ Promise.resolve(); -let ye = null; -const Qn = 100; -function Zn(e) { - const t = ye || jt; - return e ? t.then(this ? e.bind(this) : e) : t; -} -function Xn(e) { - let t = H + 1, n = I.length; - for (; t < n; ) { - const s = t + n >>> 1, r = I[s], i = ue(r); - i < e || i === e && r.flags & 2 ? t = s + 1 : n = s; - } - return t; -} -function at(e) { - if (!(e.flags & 1)) { - const t = ue(e), n = I[I.length - 1]; - !n || // fast path when the job id is larger than the tail - !(e.flags & 2) && t >= ue(n) ? I.push(e) : I.splice(Xn(t), 0, e), e.flags |= 1, Ht(); - } -} -function Ht() { - ye || (ye = jt.then(Kt)); -} -function Wt(e) { - b(e) ? te.push(...e) : W && e.id === -1 ? W.splice(X + 1, 0, e) : e.flags & 1 || (te.push(e), e.flags |= 1), Ht(); -} -function kn(e) { - if (te.length) { - const t = [...new Set(te)].sort( - (n, s) => ue(n) - ue(s) - ); - if (te.length = 0, W) { - W.push(...t); - return; - } - for (W = t, _.NODE_ENV !== "production" && (e = e || /* @__PURE__ */ new Map()), X = 0; X < W.length; X++) { - const n = W[X]; - _.NODE_ENV !== "production" && Lt(e, n) || (n.flags & 4 && (n.flags &= -2), n.flags & 8 || n(), n.flags &= -2); - } - W = null, X = 0; - } -} -const ue = (e) => e.id == null ? e.flags & 2 ? -1 : 1 / 0 : e.id; -function Kt(e) { - _.NODE_ENV !== "production" && (e = e || /* @__PURE__ */ new Map()); - const t = _.NODE_ENV !== "production" ? (n) => Lt(e, n) : ie; - try { - for (H = 0; H < I.length; H++) { - const n = I[H]; - if (n && !(n.flags & 8)) { - if (_.NODE_ENV !== "production" && t(n)) - continue; - n.flags & 4 && (n.flags &= -2), Ae( - n, - n.i, - n.i ? 15 : 14 - ), n.flags & 4 || (n.flags &= -2); - } - } - } finally { - for (; H < I.length; H++) { - const n = I[H]; - n && (n.flags &= -2); - } - H = -1, I.length = 0, kn(e), ye = null, (I.length || te.length) && Kt(e); - } -} -function Lt(e, t) { - const n = e.get(t) || 0; - if (n > Qn) { - const s = t.i, r = s && Qt(s.type); - return lt( - `Maximum recursive updates exceeded${r ? ` in component <${r}>` : ""}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`, - null, - 10 - ), !0; - } - return e.set(t, n + 1), !1; -} -const Le = /* @__PURE__ */ new Map(); -_.NODE_ENV !== "production" && (Ie().__VUE_HMR_RUNTIME__ = { - createRecord: ze(er), - rerender: ze(tr), - reload: ze(nr) -}); -const De = /* @__PURE__ */ new Map(); -function er(e, t) { - return De.has(e) ? !1 : (De.set(e, { - initialDef: Te(t), - instances: /* @__PURE__ */ new Set() - }), !0); -} -function Te(e) { - return Xt(e) ? e.__vccOpts : e; -} -function tr(e, t) { - const n = De.get(e); - n && (n.initialDef.render = t, [...n.instances].forEach((s) => { - t && (s.render = t, Te(s.type).render = t), s.renderCache = [], s.update(); - })); -} -function nr(e, t) { - const n = De.get(e); - if (!n) return; - t = Te(t), gt(n.initialDef, t); - const s = [...n.instances]; - for (let r = 0; r < s.length; r++) { - const i = s[r], o = Te(i.type); - let c = Le.get(o); - c || (o !== n.initialDef && gt(o, t), Le.set(o, c = /* @__PURE__ */ new Set())), c.add(i), i.appContext.propsCache.delete(i.type), i.appContext.emitsCache.delete(i.type), i.appContext.optionsCache.delete(i.type), i.ceReload ? (c.add(i), i.ceReload(t.styles), c.delete(i)) : i.parent ? at(() => { - i.parent.update(), c.delete(i); - }) : i.appContext.reload ? i.appContext.reload() : typeof window < "u" ? window.location.reload() : console.warn( - "[HMR] Root or manually mounted instance modified. Full reload required." - ), i.root.ce && i !== i.root && i.root.ce._removeChildStyle(o); - } - Wt(() => { - Le.clear(); - }); -} -function gt(e, t) { - R(e, t); - for (const n in e) - n !== "__file" && !(n in t) && delete e[n]; -} -function ze(e) { - return (t, n) => { - try { - return e(t, n); - } catch (s) { - console.error(s), console.warn( - "[HMR] Something went wrong during Vue component hot-reload. Full reload required." - ); - } - }; -} -let fe = null, rr = null; -const sr = (e) => e.__isTeleport; -function zt(e, t) { - e.shapeFlag & 6 && e.component ? (e.transition = t, zt(e.component.subTree, t)) : e.shapeFlag & 128 ? (e.ssContent.transition = t.clone(e.ssContent), e.ssFallback.transition = t.clone(e.ssFallback)) : e.transition = t; -} -Ie().requestIdleCallback; -Ie().cancelIdleCallback; -const ir = Symbol.for("v-ndc"), Qe = (e) => e ? Ar(e) ? Mr(e) : Qe(e.parent) : null, le = ( - // Move PURE marker to new line to workaround compiler discarding it - // due to type annotation - /* @__PURE__ */ R(/* @__PURE__ */ Object.create(null), { - $: (e) => e, - $el: (e) => e.vnode.el, - $data: (e) => e.data, - $props: (e) => _.NODE_ENV !== "production" ? me(e.props) : e.props, - $attrs: (e) => _.NODE_ENV !== "production" ? me(e.attrs) : e.attrs, - $slots: (e) => _.NODE_ENV !== "production" ? me(e.slots) : e.slots, - $refs: (e) => _.NODE_ENV !== "production" ? me(e.refs) : e.refs, - $parent: (e) => Qe(e.parent), - $root: (e) => Qe(e.root), - $host: (e) => e.ce, - $emit: (e) => e.emit, - $options: (e) => cr(e), - $forceUpdate: (e) => e.f || (e.f = () => { - at(e.update); - }), - $nextTick: (e) => e.n || (e.n = Zn.bind(e.proxy)), - $watch: (e) => br.bind(e) - }) -), Ue = (e, t) => e !== $ && !e.__isScriptSetup && N(e, t), or = { - get({ _: e }, t) { - if (t === "__v_skip") - return !0; - const { ctx: n, setupState: s, data: r, props: i, accessCache: o, type: c, appContext: a } = e; - if (_.NODE_ENV !== "production" && t === "__isVue") - return !0; - let f; - if (t[0] !== "$") { - const p = o[t]; - if (p !== void 0) - switch (p) { - case 1: - return s[t]; - case 2: - return r[t]; - case 4: - return n[t]; - case 3: - return i[t]; - } - else { - if (Ue(s, t)) - return o[t] = 1, s[t]; - if (r !== $ && N(r, t)) - return o[t] = 2, r[t]; - if ( - // only cache other properties when instance has declared (thus stable) - // props - (f = e.propsOptions[0]) && N(f, t) - ) - return o[t] = 3, i[t]; - if (n !== $ && N(n, t)) - return o[t] = 4, n[t]; - o[t] = 0; - } - } - const d = le[t]; - let l, u; - if (d) - return t === "$attrs" ? x(e.attrs, "get", "") : _.NODE_ENV !== "production" && t === "$slots" && x(e, "get", t), d(e); - if ( - // css module (injected by vue-loader) - (l = c.__cssModules) && (l = l[t]) - ) - return l; - if (n !== $ && N(n, t)) - return o[t] = 4, n[t]; - if ( - // global properties - u = a.config.globalProperties, N(u, t) - ) - return u[t]; - }, - set({ _: e }, t, n) { - const { data: s, setupState: r, ctx: i } = e; - return Ue(r, t) ? (r[t] = n, !0) : _.NODE_ENV !== "production" && r.__isScriptSetup && N(r, t) ? (S(`Cannot mutate diff --git a/web/skins/classic/views/report_event_audit.php b/web/skins/classic/views/report_event_audit.php index d247526bf..8f83c3931 100644 --- a/web/skins/classic/views/report_event_audit.php +++ b/web/skins/classic/views/report_event_audit.php @@ -76,7 +76,7 @@ if ( count($user->unviewableMonitorIds()) ) { $eventsSql .= ' AND MonitorId IN ('.implode(',', $user->viewableMonitorIds()).')'; } if ( count($selected_monitor_ids) ) { - $eventsSql .= ' AND MonitorId IN ('.implode(',', $selected_monitor_ids).')'; + $eventsSql .= ' AND MonitorId IN ('.implode(',', array_map('intval', $selected_monitor_ids)).')'; } if ( isset($minTime) && isset($maxTime) ) { $eventsSql .= " AND EndDateTime > '" . $minTime . "' AND StartDateTime < '" . $maxTime . "'"; diff --git a/web/skins/classic/views/watch.php b/web/skins/classic/views/watch.php index 9b9f3dbc5..d5aadf8ab 100644 --- a/web/skins/classic/views/watch.php +++ b/web/skins/classic/views/watch.php @@ -226,13 +226,17 @@ echo getNavBarHTML() ?>