From dda634649fb8234429bf2afe2e8d0ac70861fd9a Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 1 Mar 2023 08:19:16 -0300 Subject: [PATCH 001/416] update --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 6f92feebb..8c1355c4e 100755 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -19,7 +19,7 @@ class Encoder extends ObjectYPT static $STATUS_DONE = 'done'; static $STATUS_TRANSFERRING = 'transferring'; static $STATUS_PACKING = 'packing'; - static $STATUS_FIXING = 'Fixing'; + static $STATUS_FIXING = 'fixing'; protected $id, $fileURI, $filename, $status, $status_obs, $return_vars, $worker_ppid, $worker_pid, $priority, $created, $modified, $formats_id, $title, $videoDownloadedLink, $downloadedFileName, $streamers_id, $override_status; static function getSearchFieldsNames() From 613e6aef8a7552917885c9e0d470b78fc8776355 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 1 Mar 2023 08:33:16 -0300 Subject: [PATCH 002/416] update --- objects/Encoder.php | 5 +- objects/include_config.php | 48 +- view/index.php | 2156 ++++++++++++++++++------------------ 3 files changed, 1122 insertions(+), 1087 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 8c1355c4e..49b819040 100755 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -664,9 +664,12 @@ static function areDownloaded() return self::getQueue($status = array(Encoder::$STATUS_DOWNLOADED)); } - static function getQueue($status = array(Encoder::$STATUS_ENCODING, Encoder::$STATUS_DOWNLOADING)) + static function getQueue($status = array()) { global $global; + if(empty($status)){ + $status = array(Encoder::$STATUS_ENCODING, Encoder::$STATUS_DOWNLOADING) + } $statusIn = implode("', '", $status); diff --git a/objects/include_config.php b/objects/include_config.php index 62a59c5ec..eaaf4edfe 100755 --- a/objects/include_config.php +++ b/objects/include_config.php @@ -1,27 +1,31 @@ getOffset() / 60; @@ -29,24 +33,24 @@ $mins = abs($mins); $hrs = floor($mins / 60); $mins -= $hrs * 60; -$offset = sprintf('%+d:%02d', $hrs*$sgn, $mins); +$offset = sprintf('%+d:%02d', $hrs * $sgn, $mins); $global['mysqli']->query("SET time_zone='$offset';"); session_set_cookie_params(86400); ini_set('session.gc_maxlifetime', 86400); -ini_set('session.cookie_lifetime',86400); +ini_set('session.cookie_lifetime', 86400); -if(!function_exists('local_get_contents')){ - require_once $global['systemRootPath'].'objects/functions.php'; - require_once $global['systemRootPath'].'objects/Object.php'; +if (!function_exists('local_get_contents')) { + require_once $global['systemRootPath'] . 'objects/functions.php'; + require_once $global['systemRootPath'] . 'objects/Object.php'; } -foreach(['_REQUEST', '_POST', '_GET'] as $Try) { +foreach (['_REQUEST', '_POST', '_GET'] as $Try) { ${$Try}['notifyURL'] = trim((isset(${$Try}['notifyURL']) && is_string(${$Try}['notifyURL'])) ? ${$Try}['notifyURL'] : ''); } unset($Try); -if(!empty($_REQUEST['notifyURL']) && !preg_match('/^http/i', $_REQUEST['notifyURL'])){ +if (!empty($_REQUEST['notifyURL']) && !preg_match('/^http/i', $_REQUEST['notifyURL'])) { $_REQUEST['notifyURL'] = "https://{$_REQUEST['notifyURL']}"; $_POST['notifyURL'] = $_REQUEST['notifyURL']; $_GET['notifyURL'] = $_REQUEST['notifyURL']; @@ -58,12 +62,12 @@ $_SESSION['lastUpdate'] = time(); -$global['multiResolutionOrder'] = array(74,75,76,77,78,79,80,81,82,83,84,85,86,87,6,7,8, 88, 89, 90); -$global['sendAll'] = array(6,7,8, 88, 89, 90); -$global['hasHDOrder'] = array(87,86,85,83,80,79,78,76); -$global['hasSDOrder'] = array(87,85,84,82,80,78,77,75); -$global['hasLowOrder'] = array(87,86,84,81,80,79,77,74); -$global['bothVideosOrder'] = array(81,82,83,84,85,86,87); // MP4 and Webm +$global['multiResolutionOrder'] = array(74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 6, 7, 8, 88, 89, 90); +$global['sendAll'] = array(6, 7, 8, 88, 89, 90); +$global['hasHDOrder'] = array(87, 86, 85, 83, 80, 79, 78, 76); +$global['hasSDOrder'] = array(87, 85, 84, 82, 80, 78, 77, 75); +$global['hasLowOrder'] = array(87, 86, 84, 81, 80, 79, 77, 74); +$global['bothVideosOrder'] = array(81, 82, 83, 84, 85, 86, 87); // MP4 and Webm // in case of PHP - youtube-dl: command not found -putenv('PATH=/usr/local/bin:/usr/bin'); \ No newline at end of file +putenv('PATH=/usr/local/bin:/usr/bin'); diff --git a/view/index.php b/view/index.php index c0cca6d68..0958174b4 100755 --- a/view/index.php +++ b/view/index.php @@ -13,7 +13,6 @@ if (!empty($_POST['pass'])) { $_GET['pass'] = $_POST['pass']; } - //header('Access-Control-Allow-Origin: *'); require_once $config; require_once '../objects/Encoder.php'; @@ -46,1233 +45,1262 @@ ?> - - - - - - - Encoder - - - - - - - - - - - - - - - - - - - - - - - - - - - - " rel="stylesheet" type="text/css"/> - - - - - - - - - - - + + + + + + + Encoder + + + + + + + + + + + + + + + + + + + + + + + + + + + + " rel="stylesheet" type="text/css" /> + + + + + + + + + + + + + + + - Logoff + + + + + + +
+ -
- -
-
-
-
-
- Please sign in -
- -
-
- - -
+
+
+
+ +
+ Please sign in +
+ +
+
+ +
-
- -
-
- - -
+
+
+ +
+
+ +
+
-
- -
-
- - -
+
+ +
+
+ +
- -
-
- -
+
+ +
+
+
-
+
+
-
-
-
+
- + result); + if (empty($result->videoHLS)) { + $advancedCustom->doNotShowEncoderHLS = true; + $advancedCustom->doNotShowEncoderAutomaticHLS = true; + } else if (!isset($advancedCustom->doNotShowEncoderHLS)) { + $advancedCustom->doNotShowEncoderHLS = false; + $advancedCustom->doNotShowEncoderAutomaticHLS = false; + } + fixAdvancedCustom($advancedCustom); + ?> - - result); - if (empty($result->videoHLS)) { - $advancedCustom->doNotShowEncoderHLS = true; - $advancedCustom->doNotShowEncoderAutomaticHLS = true; - } else if (!isset($advancedCustom->doNotShowEncoderHLS)) { - $advancedCustom->doNotShowEncoderHLS = false; - $advancedCustom->doNotShowEncoderAutomaticHLS = false; - } - fixAdvancedCustom($advancedCustom); - ?> - -
-
-
- -
-
-
-
- -
-
+
+
+ + userGroups) && empty($global['hideUserGroups'])) { + ?> +
+
+ User Groups - userGroups) && empty($global['hideUserGroups'])) { - ?> -
-
- User Groups + + + - + +
+
+
+ userGroups as $key => $value) { + ?> +
+ +
+
-
-
- userGroups as $key => $value) { - ?> -
- -
- -
-
Unckeck all to make it public
+
Unckeck all to make it public
-
- - + doNotAllowEncoderOverwriteStatus)) { - ?> -
-
Override status
-
- -
+ if (empty($advancedCustom->doNotAllowEncoderOverwriteStatus)) { + ?> +
+
Override status
+
+
- + doNotAllowUpdateVideoId)) { - ?> -
-
Update existing video
-
- - - -
+ if (empty($advancedCustom->doNotAllowUpdateVideoId)) { + ?> +
+
Update existing video
+
+ + +
+
- - + $(function() { + $("#videoSearch").autocomplete({ + minLength: 0, + source: function(req, res) { + $.ajax({ + url: 'objects/videos.json.php?rowCount=6', + data: { + searchPhrase: req.term, + users_id: '', + user: '', + pass: '', + encodedPass: true + }, + /* + xhrFields: { + //withCredentials: true + }, + */ + type: 'post', + success: function(data) { + res(data.rows); + } + }); + }, + focus: function(event, ui) { + $("#videoSearch").val(ui.item.title); + return false; + }, + select: function(event, ui) { + $("#videoSearch").val(ui.item.title); + $("#update_video_id").val(ui.item.id); + console.log(ui.item.videosURL); + console.log(ui.item.videosURL.jpg); + $("#inputNextVideo-poster").attr("src", ui.item.videosURL.jpg.url); + return false; + } + }).autocomplete("instance")._renderItem = function(ul, item) { + return $("
  • ").append("
    " + item.title + "
    ").appendTo(ul); + }; + }); + + showOnlyEncoderAutomaticResolutions)) { - ?> -
    -
    Resolutions
    -
    - doNotShowEncoderHLS)) { - ?> -
    -
    -
    Advanced
    -
    - doNotShowExtractAudio)) { ?> -
    - - doNotShowCreateVideoSpectrum)) { ?> - - - - - -
    + +
    - -
    -
    Streamer info
    +
    +
    +
    Advanced
    -
    - User:
    + doNotShowExtractAudio)) { ?> +
    + + doNotShowCreateVideoSpectrum)) { ?> + + + + +
    + +
    +
    Streamer info
    +
    +
    + User:
    +
  • - -
    -
    -
    -
    -
    - - + function resetAutocompleteVideosID() { + $("#videoSearch").val(''); + $("#update_video_id").val(''); + $("#inputNextVideo-poster").attr("src", "view/img/notfound.jpg"); + } + + + +
    -
    + - - + \ No newline at end of file From 527610482f3c9b6e851c9bc7d885051741cb51cb Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 1 Mar 2023 08:33:52 -0300 Subject: [PATCH 003/416] fix --- objects/Encoder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 49b819040..cadbaf69d 100755 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -667,8 +667,8 @@ static function areDownloaded() static function getQueue($status = array()) { global $global; - if(empty($status)){ - $status = array(Encoder::$STATUS_ENCODING, Encoder::$STATUS_DOWNLOADING) + if (empty($status)) { + $status = array(Encoder::$STATUS_ENCODING, Encoder::$STATUS_DOWNLOADING); } $statusIn = implode("', '", $status); From 0bce8bdcb6eaf5f4b25e9c2dbd9fe2bb8fa725c2 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 1 Mar 2023 08:35:27 -0300 Subject: [PATCH 004/416] update --- install/deleteAllQueue.php | 14 +++++--------- install/deleteAllQueueWithError.php | 14 +++++--------- objects/include_config.php | 2 +- view/jquery-file-upload/server/php/index.php | 2 +- view/videosListEPG.php | 6 +++--- 5 files changed, 15 insertions(+), 23 deletions(-) diff --git a/install/deleteAllQueue.php b/install/deleteAllQueue.php index 6f23bd506..8704eb25b 100755 --- a/install/deleteAllQueue.php +++ b/install/deleteAllQueue.php @@ -6,25 +6,21 @@ if (!isCommandLineInterface()) { return die('Command Line only'); } -require_once $global['systemRootPath'].'objects/Encoder.php'; +require_once $global['systemRootPath'] . 'objects/Encoder.php'; ini_set('display_errors', 1); ini_set('display_startup_errors', 1); -error_reporting(E_ALL); +error_reporting(E_ALL & ~E_DEPRECATED); //$rows = Encoder::getAllQueue(); $rows = Encoder::getAll(false); -echo "Start {$global['webSiteRootURL']}".PHP_EOL; +echo "Start {$global['webSiteRootURL']}" . PHP_EOL; foreach ($rows as $value) { - echo "Deleting [{$value['id']}]{$value['title']}, {$value['videoDownloadedLink']}".PHP_EOL; + echo "Deleting [{$value['id']}]{$value['title']}, {$value['videoDownloadedLink']}" . PHP_EOL; $e = new Encoder($value['id']); $e->delete(); } -echo "end".PHP_EOL; +echo "end" . PHP_EOL; echo "\n"; die(); - - - - diff --git a/install/deleteAllQueueWithError.php b/install/deleteAllQueueWithError.php index f17f35247..d2f17991e 100755 --- a/install/deleteAllQueueWithError.php +++ b/install/deleteAllQueueWithError.php @@ -6,25 +6,21 @@ if (!isCommandLineInterface()) { return die('Command Line only'); } -require_once $global['systemRootPath'].'objects/Encoder.php'; +require_once $global['systemRootPath'] . 'objects/Encoder.php'; ini_set('display_errors', 1); ini_set('display_startup_errors', 1); -error_reporting(E_ALL); +error_reporting(E_ALL & ~E_DEPRECATED); //$rows = Encoder::getAllQueue(); $rows = Encoder::getAll(false, true); -echo "Start {$global['webSiteRootURL']}".PHP_EOL; +echo "Start {$global['webSiteRootURL']}" . PHP_EOL; foreach ($rows as $value) { - echo "Deleting [{$value['id']}]{$value['title']}, {$value['videoDownloadedLink']}".PHP_EOL; + echo "Deleting [{$value['id']}]{$value['title']}, {$value['videoDownloadedLink']}" . PHP_EOL; $e = new Encoder($value['id']); $e->delete(); } -echo "end".PHP_EOL; +echo "end" . PHP_EOL; echo "\n"; die(); - - - - diff --git a/objects/include_config.php b/objects/include_config.php index eaaf4edfe..b06b8cf38 100755 --- a/objects/include_config.php +++ b/objects/include_config.php @@ -1,7 +1,7 @@ setTimezone(new DateTimeZone($_REQUEST['date_default_timezone'])); From 5847be7cbc4bde7f45401fe277e3a0cd62e946fe Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 1 Mar 2023 09:20:59 -0300 Subject: [PATCH 005/416] https://github.com/WWBN/AVideo/issues/7732 --- view/css/style.css | 60 ++++++++++++++++++++++++++++++---------------- view/index.php | 44 +++++++++++++++++++++++++++++----- 2 files changed, 78 insertions(+), 26 deletions(-) diff --git a/view/css/style.css b/view/css/style.css index 61afab63f..aba1a136b 100755 --- a/view/css/style.css +++ b/view/css/style.css @@ -2,7 +2,8 @@ position: relative; height: 25px; } -.progress > .progress-type { + +.progress>.progress-type { position: absolute; left: 0px; font-weight: 800; @@ -10,42 +11,51 @@ color: rgb(255, 255, 255); background-color: rgba(25, 25, 25, 0.2); } -.progress > .progress-completed { + +.progress>.progress-completed { position: absolute; right: 0px; font-weight: 800; padding: 3px 10px 2px; } + .progress-bar { - -webkit-transition: width 2.5s ease; - -o-transition: width 2.5s ease; - transition: width 2.5s ease; + -webkit-transition: width 6s ease; + -o-transition: width 6s ease; + transition: width 6s ease; +} + +.progress-bar.progress-bar-info { + -webkit-transition: width 1.5s ease; + -o-transition: width 1.5s ease; + transition: width 1.5s ease; } -.material-switch > input[type="checkbox"] { - display: none; +.material-switch>input[type="checkbox"] { + display: none; } -.material-switch > label { +.material-switch>label { cursor: pointer; height: 0px; - position: relative; - width: 40px; + position: relative; + width: 40px; } -.material-switch > label::before { +.material-switch>label::before { background: rgb(0, 0, 0); box-shadow: inset 0px 0px 10px rgba(0, 0, 0, 0.5); border-radius: 8px; content: ''; height: 16px; margin-top: -8px; - position:absolute; + position: absolute; opacity: 0.3; transition: all 0.4s ease-in-out; width: 40px; } -.material-switch > label::after { + +.material-switch>label::after { background: rgb(255, 255, 255); border-radius: 16px; box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.3); @@ -58,28 +68,34 @@ transition: all 0.3s ease-in-out; width: 24px; } -.material-switch > input[type="checkbox"]:checked + label::before { + +.material-switch>input[type="checkbox"]:checked+label::before { background: inherit; opacity: 0.5; } -.material-switch > input[type="checkbox"]:checked + label::after { + +.material-switch>input[type="checkbox"]:checked+label::after { background: inherit; left: 20px; } .navbar-brand { - padding: 0px !important; /* firefox bug fix */ + padding: 0px !important; + /* firefox bug fix */ margin-left: 10px !important; } + .navbar-brand>img { height: 100%; width: auto; } -.encodingProgress{ + +.encodingProgress { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } -.downloadProgress{ + +.downloadProgress { border-top-left-radius: 0; border-top-right-radius: 0; } @@ -90,14 +106,17 @@ white-space: nowrap; line-height: normal; } + #config .checkboxes input { vertical-align: middle; margin: 0; } + #config .checkboxes label span { vertical-align: middle; margin-left: 4px; } + #config small { line-height: normal; } @@ -106,9 +125,10 @@ body { padding-top: 50px; } -.availableResolutionsLabels{ +.availableResolutionsLabels { text-align: center; } -.availableResolutionsLabels .label{ + +.availableResolutionsLabels .label { margin: 1px 2px; } \ No newline at end of file diff --git a/view/index.php b/view/index.php index 0958174b4..90a5be35c 100755 --- a/view/index.php +++ b/view/index.php @@ -675,6 +675,33 @@ function isAChannel() { return /^(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/(channel|user).+/gm.test($('#inputVideoURL').val()); } + function setDownloadProgress(id, progress) { + var selector = "#downloadProgress" + id; + progress = parseFloat(progress); + + $(selector).slideDown(); + if (progress < 0) { + progress = 0; + } else if (progress > 100) { + progress = 100; + } + if (progress < 100) { + $(selector).addClass('active'); + $(selector).find('.progress-bar').removeClass('progress-bar-info'); + $(selector).find('.progress-bar').addClass('progress-bar-danger'); + } else { + $(selector).removeClass('active'); + $(selector).find('.progress-bar').removeClass('progress-bar-danger'); + $(selector).find('.progress-bar').addClass('progress-bar-info'); + } + //console.log('progress-bar', progress); + $(selector).find('.progress-bar').css({ + 'width': progress + '%' + }); + + } + + var checkProgressTimeout = 3000; //4 secongs function checkProgress() { $.ajax({ url: 'status?', @@ -708,7 +735,6 @@ function checkProgress() { for (i = 0; i < encodingNowIds.length; i++) { var id = encodingNowIds[i]; - $("#downloadProgress" + id).slideDown(); if (response.download_status[i] && !response.encoding_status[i].progress) { @@ -720,9 +746,7 @@ function checkProgress() { }); } if (response.download_status[i]) { - $("#downloadProgress" + id).find('.progress-bar').css({ - 'width': response.download_status[i].progress + '%' - }); + setDownloadProgress(id, response.download_status[i].progress); } if (response.encoding_status[i].progress >= 100) { $("#encodingProgress" + id).find('.progress-bar').css({ @@ -741,9 +765,10 @@ function checkProgress() { } } + setTimeout(function() { checkProgress(); - }, 1000); + }, checkProgressTimeout); } else { while ((id = encodingNowIds.pop()) != null) { $("#encodeProgress" + id).slideUp("normal", function() { @@ -752,7 +777,14 @@ function checkProgress() { } setTimeout(function() { checkProgress(); - }, 5000); + }, checkProgressTimeout * 2); + } + if (response.downloaded.length > 0) { + for (i = 0; i < response.downloaded.length; i++) { + var id = response.downloaded[i].id; + setDownloadProgress(id, 100); + } + } } From 060abae95f7c83ffa9c99aee6612478e3226f729 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 1 Mar 2023 11:20:24 -0300 Subject: [PATCH 006/416] update --- objects/Encoder.php | 4 ++ objects/include_config.php | 7 ++- view/css/style.css | 11 ++-- view/index.php | 111 ++++++++++++++++++++++++------------- view/status.php | 5 +- 5 files changed, 92 insertions(+), 46 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index cadbaf69d..1a6e7653c 100755 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -663,6 +663,10 @@ static function areDownloaded() { return self::getQueue($status = array(Encoder::$STATUS_DOWNLOADED)); } + static function areTransferring() + { + return self::getQueue($status = array(Encoder::$STATUS_TRANSFERRING)); + } static function getQueue($status = array()) { diff --git a/objects/include_config.php b/objects/include_config.php index b06b8cf38..e2762e068 100755 --- a/objects/include_config.php +++ b/objects/include_config.php @@ -4,10 +4,15 @@ error_reporting(E_ALL & ~E_DEPRECATED); ini_set('display_errors', 1); } -if (empty($global['logfile'])) { +$global['docker_vars'] = '/var/www/docker_vars.json'; +if (file_exists($global['docker_vars'])) { + $global['logfile'] = 'php://stdout'; +} else if (empty($global['logfile'])) { $global['logfile'] = $global['systemRootPath'] . 'videos/avideo.log'; } + ini_set('error_log', $global['logfile']); + global $global; global $config; diff --git a/view/css/style.css b/view/css/style.css index aba1a136b..1d6949ad1 100755 --- a/view/css/style.css +++ b/view/css/style.css @@ -20,16 +20,17 @@ } .progress-bar { + -webkit-transition: width 1.5s ease; + -o-transition: width 1.5s ease; + transition: width 1.5s ease; +} + +.progress-bar.active { -webkit-transition: width 6s ease; -o-transition: width 6s ease; transition: width 6s ease; } -.progress-bar.progress-bar-info { - -webkit-transition: width 1.5s ease; - -o-transition: width 1.5s ease; - transition: width 1.5s ease; -} .material-switch>input[type="checkbox"] { display: none; diff --git a/view/index.php b/view/index.php index 90a5be35c..d1803d8c1 100755 --- a/view/index.php +++ b/view/index.php @@ -675,9 +675,9 @@ function isAChannel() { return /^(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/(channel|user).+/gm.test($('#inputVideoURL').val()); } - function setDownloadProgress(id, progress) { + function setDownloadProgress(id, progress, setText) { var selector = "#downloadProgress" + id; - progress = parseFloat(progress); + progress = parseInt(progress); $(selector).slideDown(); if (progress < 0) { @@ -685,20 +685,53 @@ function setDownloadProgress(id, progress) { } else if (progress > 100) { progress = 100; } + var text = "Downloading " + progress + '%'; if (progress < 100) { $(selector).addClass('active'); - $(selector).find('.progress-bar').removeClass('progress-bar-info'); + $(selector).find('.progress-bar').removeClass('progress-bar-success'); $(selector).find('.progress-bar').addClass('progress-bar-danger'); } else { + text = "Downloaded"; $(selector).removeClass('active'); $(selector).find('.progress-bar').removeClass('progress-bar-danger'); - $(selector).find('.progress-bar').addClass('progress-bar-info'); + $(selector).find('.progress-bar').addClass('progress-bar-success'); } + if (setText) { + $("#encodingProgress" + id).find('.progress-completed').html(text); + } + //console.log('progress-bar', progress); $(selector).find('.progress-bar').css({ 'width': progress + '%' }); + } + function setEncodingProgress(id, progress, text) { + var selector = "#encodingProgress" + id; + if (!isNaN(progress)) { + progress = parseInt(progress); + $(selector).slideDown(); + if (progress < 0) { + progress = 0; + } else if (progress > 100) { + progress = 100; + } + $(selector).find('.progress-completed').html("" + text + " " + progress + '%'); + $(selector).find('.progress-bar').css({ + 'width': progress + '%' + }); + if (progress > 0) { + $(selector).addClass('active'); + $(selector).find('.progress-bar').removeClass('progress-bar-success'); + $(selector).find('.progress-bar').addClass('progress-bar-primary'); + + } else { + $(selector).removeClass('active'); + $(selector).find('.progress-bar').removeClass('progress-bar-primary'); + $(selector).find('.progress-bar').addClass('progress-bar-success'); + + } + } } var checkProgressTimeout = 3000; //4 secongs @@ -715,6 +748,12 @@ function checkProgress() { } } + if (response.downloaded.length > 0) { + for (i = 0; i < response.downloaded.length; i++) { + var id = response.downloaded[i].id; + setDownloadProgress(id, 100, true); + } + } if (response.encoding.length > 0) { var newEncodingNowIds = new Array(); for (i = 0; i < response.encoding.length; i++) { @@ -726,9 +765,7 @@ function checkProgress() { var id = encodingNowIds[i]; // if start encode next before get 100% if (newEncodingNowIds.indexOf(id) == -1) { - $("#encodeProgress" + id).slideUp("normal", function() { - $(this).remove(); - }); + removeQueueItem(id); } } encodingNowIds = newEncodingNowIds; @@ -736,34 +773,19 @@ function checkProgress() { for (i = 0; i < encodingNowIds.length; i++) { var id = encodingNowIds[i]; - - if (response.download_status[i] && !response.encoding_status[i].progress) { - $("#encodingProgress" + id).find('.progress-completed').html("" + response.encoding[i].name + " [Downloading ...] " + response.download_status[i].progress + '%'); - } else { - $("#encodingProgress" + id).find('.progress-completed').html("" + response.encoding[i].name + " [" + response.encoding_status[i].from + " to " + response.encoding_status[i].to + "] " + response.encoding_status[i].progress + '% ' + response.encoding_status[i].remainTimeHuman); - $("#encodingProgress" + id).find('.progress-bar').css({ - 'width': response.encoding_status[i].progress + '%' - }); + var text = response.encoding[i].name + " [Downloading ...]"; + if (response.download_status[i] && response.encoding_status[i].progress) { + text = response.encoding[i].name + " [" + response.encoding_status[i].from + " to " + response.encoding_status[i].to + "] " + response.encoding_status[i].remainTimeHuman; } - if (response.download_status[i]) { - setDownloadProgress(id, response.download_status[i].progress); + var setText = true; + if (response.encoding_status[i].progress) { + setText = false; + setEncodingProgress(id, response.encoding_status[i].progress, text); } - if (response.encoding_status[i].progress >= 100) { - $("#encodingProgress" + id).find('.progress-bar').css({ - 'width': '100%' - }); - setTimeout(function() { - $("#encodeProgress" + id).fadeOut("slow", function() { - $(this).remove(); - }); - $("#downloadProgress" + id).slideUp("fast", function() { - $(this).remove(); - }); - }, 3000); - } else { + if (response.download_status[i]) { + setDownloadProgress(id, response.download_status[i].progress, setText); } - } setTimeout(function() { @@ -771,27 +793,27 @@ function checkProgress() { }, checkProgressTimeout); } else { while ((id = encodingNowIds.pop()) != null) { - $("#encodeProgress" + id).slideUp("normal", function() { - $(this).remove(); - }); + removeQueueItem(id); } setTimeout(function() { checkProgress(); }, checkProgressTimeout * 2); } - if (response.downloaded.length > 0) { - for (i = 0; i < response.downloaded.length; i++) { - var id = response.downloaded[i].id; - setDownloadProgress(id, 100); + if (response.transferring.length > 0) { + for (i = 0; i < response.transferring.length; i++) { + var id = response.transferring[i].id; + removeQueueItem(id); } - } } }); } + var checkProgressRemoveTimeout = []; + function createQueueItem(queueItem, queueItemAfter) { + clearTimeout(checkProgressRemoveTimeout[queueItem.id]); if ($('#encodeProgress' + queueItem.id).length) { return false; } @@ -810,6 +832,17 @@ function createQueueItem(queueItem, queueItemAfter) { } } + function removeQueueItem(id) { + checkProgressRemoveTimeout[id] = setTimeout(function() { + $("#encodeProgress" + id).fadeOut("slow", function() { + $(this).remove(); + }); + $("#downloadProgress" + id).slideUp("fast", function() { + $(this).remove(); + }); + }, 3000); + } + var streamerMaxFileSize = 0; $(document).ready(function() { diff --git a/view/status.php b/view/status.php index 95bfc8355..028a79276 100755 --- a/view/status.php +++ b/view/status.php @@ -17,12 +17,14 @@ $obj->cmd = ""; $obj->encoding_status = array(); $obj->version = $config->getVersion(); +//$obj->logfile = $global['logfile']; if (!empty($global['concurrent'])) { $obj->concurrent = $global['concurrent']; } $obj->encoding = Encoder::areEncoding(); $obj->downloaded = Encoder::areDownloaded(); +$obj->transferring = Encoder::areTransferring(); //$obj->transferring = Encoder::isTransferring(); $obj->queue_list = Encoder::getAllQueue(); $obj->queue_size = count($obj->queue_list); @@ -41,8 +43,9 @@ $obj->encoding_status[$i] = Encoder::getVideoConversionStatus($obj->encoding[$i]['id']); $obj->download_status[$i] = Encoder::getYoutubeDlProgress($obj->encoding[$i]['id']); $msg .= "[{$obj->encoding[$i]['id']}] {$obj->encoding[$i]['filename']}"; - if (count($obj->encoding) > 1 && $i < count($obj->encoding) - 1) + if (count($obj->encoding) > 1 && $i < count($obj->encoding) - 1) { $msg .= ", "; + } } $msg .= (count($obj->encoding) == 1) ? " is encoding" : " are encoding"; $obj->msg = $msg; From 39b522cea5705889eb2dbce8f4f709dd09d0b3d2 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 1 Mar 2023 11:22:11 -0300 Subject: [PATCH 007/416] Update --- .github/workflows/docker-image.yml | 0 .gitignore | 0 .htaccess | 0 CNAME | 0 Dockerfile | 0 LICENSE | 0 README.md | 0 _config.yml | 0 deploy/apache/000-default.conf | 0 deploy/docker-entrypoint | 0 deploy/wait-for-db.php | 0 index.php | 0 install/checkConfiguration.php | 0 install/cli.php | 0 install/database.sql | 0 install/deleteAllQueue.php | 0 install/deleteAllQueueWithError.php | 0 install/deleteSystemdPrivate.php | 0 install/index.php | 0 install/install.php | 0 install/killOldProcess.php | 0 install/makeAdmin.php | 0 install/makeEncoderPublic.php | 0 install/reencodeAllVideos.php | 0 install/test.php | 0 install/watermarkCleaner.php | 0 model/EncoderModel.mwb | Bin model/EncoderModel.mwb.bak | Bin nbproject/project.properties | 0 nbproject/project.xml | 0 node_modules/.package-lock.json | 0 node_modules/bootstrap/CHANGELOG.md | 0 node_modules/bootstrap/Gruntfile.js | 0 node_modules/bootstrap/LICENSE | 0 node_modules/bootstrap/README.md | 0 node_modules/bootstrap/dist/css/bootstrap-theme.css | 0 .../bootstrap/dist/css/bootstrap-theme.css.map | 0 .../bootstrap/dist/css/bootstrap-theme.min.css | 0 .../bootstrap/dist/css/bootstrap-theme.min.css.map | 0 node_modules/bootstrap/dist/css/bootstrap.css | 0 node_modules/bootstrap/dist/css/bootstrap.css.map | 0 node_modules/bootstrap/dist/css/bootstrap.min.css | 0 .../bootstrap/dist/css/bootstrap.min.css.map | 0 .../dist/fonts/glyphicons-halflings-regular.eot | Bin .../dist/fonts/glyphicons-halflings-regular.svg | 0 .../dist/fonts/glyphicons-halflings-regular.ttf | Bin .../dist/fonts/glyphicons-halflings-regular.woff | Bin .../dist/fonts/glyphicons-halflings-regular.woff2 | Bin node_modules/bootstrap/dist/js/bootstrap.js | 0 node_modules/bootstrap/dist/js/bootstrap.min.js | 0 node_modules/bootstrap/dist/js/npm.js | 0 .../fonts/glyphicons-halflings-regular.eot | Bin .../fonts/glyphicons-halflings-regular.svg | 0 .../fonts/glyphicons-halflings-regular.ttf | Bin .../fonts/glyphicons-halflings-regular.woff | Bin .../fonts/glyphicons-halflings-regular.woff2 | Bin node_modules/bootstrap/grunt/.jshintrc | 0 node_modules/bootstrap/grunt/.stylelintrc | 0 node_modules/bootstrap/grunt/browsers.js | 0 .../bootstrap/grunt/bs-commonjs-generator.js | 0 .../bootstrap/grunt/bs-glyphicons-data-generator.js | 0 node_modules/bootstrap/grunt/bs-lessdoc-parser.js | 0 .../bootstrap/grunt/bs-raw-files-generator.js | 0 node_modules/bootstrap/grunt/change-version.js | 0 node_modules/bootstrap/grunt/configBridge.json | 0 node_modules/bootstrap/grunt/generate-sri.js | 0 node_modules/bootstrap/grunt/karma.conf.js | 0 node_modules/bootstrap/js/affix.js | 0 node_modules/bootstrap/js/alert.js | 0 node_modules/bootstrap/js/button.js | 0 node_modules/bootstrap/js/carousel.js | 0 node_modules/bootstrap/js/collapse.js | 0 node_modules/bootstrap/js/dropdown.js | 0 node_modules/bootstrap/js/modal.js | 0 node_modules/bootstrap/js/popover.js | 0 node_modules/bootstrap/js/scrollspy.js | 0 node_modules/bootstrap/js/tab.js | 0 node_modules/bootstrap/js/tooltip.js | 0 node_modules/bootstrap/js/transition.js | 0 node_modules/bootstrap/less/alerts.less | 0 node_modules/bootstrap/less/badges.less | 0 node_modules/bootstrap/less/bootstrap.less | 0 node_modules/bootstrap/less/breadcrumbs.less | 0 node_modules/bootstrap/less/button-groups.less | 0 node_modules/bootstrap/less/buttons.less | 0 node_modules/bootstrap/less/carousel.less | 0 node_modules/bootstrap/less/close.less | 0 node_modules/bootstrap/less/code.less | 0 .../bootstrap/less/component-animations.less | 0 node_modules/bootstrap/less/dropdowns.less | 0 node_modules/bootstrap/less/forms.less | 0 node_modules/bootstrap/less/glyphicons.less | 0 node_modules/bootstrap/less/grid.less | 0 node_modules/bootstrap/less/input-groups.less | 0 node_modules/bootstrap/less/jumbotron.less | 0 node_modules/bootstrap/less/labels.less | 0 node_modules/bootstrap/less/list-group.less | 0 node_modules/bootstrap/less/media.less | 0 node_modules/bootstrap/less/mixins.less | 0 node_modules/bootstrap/less/mixins/alerts.less | 0 .../bootstrap/less/mixins/background-variant.less | 0 .../bootstrap/less/mixins/border-radius.less | 0 node_modules/bootstrap/less/mixins/buttons.less | 0 .../bootstrap/less/mixins/center-block.less | 0 node_modules/bootstrap/less/mixins/clearfix.less | 0 node_modules/bootstrap/less/mixins/forms.less | 0 node_modules/bootstrap/less/mixins/gradients.less | 0 .../bootstrap/less/mixins/grid-framework.less | 0 node_modules/bootstrap/less/mixins/grid.less | 0 node_modules/bootstrap/less/mixins/hide-text.less | 0 node_modules/bootstrap/less/mixins/image.less | 0 node_modules/bootstrap/less/mixins/labels.less | 0 node_modules/bootstrap/less/mixins/list-group.less | 0 node_modules/bootstrap/less/mixins/nav-divider.less | 0 .../bootstrap/less/mixins/nav-vertical-align.less | 0 node_modules/bootstrap/less/mixins/opacity.less | 0 node_modules/bootstrap/less/mixins/pagination.less | 0 node_modules/bootstrap/less/mixins/panels.less | 0 .../bootstrap/less/mixins/progress-bar.less | 0 .../bootstrap/less/mixins/reset-filter.less | 0 node_modules/bootstrap/less/mixins/reset-text.less | 0 node_modules/bootstrap/less/mixins/resize.less | 0 .../less/mixins/responsive-visibility.less | 0 node_modules/bootstrap/less/mixins/size.less | 0 node_modules/bootstrap/less/mixins/tab-focus.less | 0 node_modules/bootstrap/less/mixins/table-row.less | 0 .../bootstrap/less/mixins/text-emphasis.less | 0 .../bootstrap/less/mixins/text-overflow.less | 0 .../bootstrap/less/mixins/vendor-prefixes.less | 0 node_modules/bootstrap/less/modals.less | 0 node_modules/bootstrap/less/navbar.less | 0 node_modules/bootstrap/less/navs.less | 0 node_modules/bootstrap/less/normalize.less | 0 node_modules/bootstrap/less/pager.less | 0 node_modules/bootstrap/less/pagination.less | 0 node_modules/bootstrap/less/panels.less | 0 node_modules/bootstrap/less/popovers.less | 0 node_modules/bootstrap/less/print.less | 0 node_modules/bootstrap/less/progress-bars.less | 0 node_modules/bootstrap/less/responsive-embed.less | 0 .../bootstrap/less/responsive-utilities.less | 0 node_modules/bootstrap/less/scaffolding.less | 0 node_modules/bootstrap/less/tables.less | 0 node_modules/bootstrap/less/theme.less | 0 node_modules/bootstrap/less/thumbnails.less | 0 node_modules/bootstrap/less/tooltip.less | 0 node_modules/bootstrap/less/type.less | 0 node_modules/bootstrap/less/utilities.less | 0 node_modules/bootstrap/less/variables.less | 0 node_modules/bootstrap/less/wells.less | 0 node_modules/bootstrap/package.json | 0 node_modules/jquery/AUTHORS.txt | 0 node_modules/jquery/LICENSE.txt | 0 node_modules/jquery/README.md | 0 node_modules/jquery/bower.json | 0 node_modules/jquery/dist/jquery.js | 0 node_modules/jquery/dist/jquery.min.js | 0 node_modules/jquery/dist/jquery.min.map | 0 node_modules/jquery/dist/jquery.slim.js | 0 node_modules/jquery/dist/jquery.slim.min.js | 0 node_modules/jquery/dist/jquery.slim.min.map | 0 node_modules/jquery/external/sizzle/LICENSE.txt | 0 node_modules/jquery/external/sizzle/dist/sizzle.js | 0 .../jquery/external/sizzle/dist/sizzle.min.js | 0 .../jquery/external/sizzle/dist/sizzle.min.map | 0 node_modules/jquery/package.json | 0 node_modules/jquery/src/ajax.js | 0 node_modules/jquery/src/ajax/jsonp.js | 0 node_modules/jquery/src/ajax/load.js | 0 node_modules/jquery/src/ajax/script.js | 0 node_modules/jquery/src/ajax/var/location.js | 0 node_modules/jquery/src/ajax/var/nonce.js | 0 node_modules/jquery/src/ajax/var/rquery.js | 0 node_modules/jquery/src/ajax/xhr.js | 0 node_modules/jquery/src/attributes.js | 0 node_modules/jquery/src/attributes/attr.js | 0 node_modules/jquery/src/attributes/classes.js | 0 node_modules/jquery/src/attributes/prop.js | 0 node_modules/jquery/src/attributes/support.js | 0 node_modules/jquery/src/attributes/val.js | 0 node_modules/jquery/src/callbacks.js | 0 node_modules/jquery/src/core.js | 0 node_modules/jquery/src/core/DOMEval.js | 0 node_modules/jquery/src/core/access.js | 0 node_modules/jquery/src/core/camelCase.js | 0 node_modules/jquery/src/core/init.js | 0 node_modules/jquery/src/core/isAttached.js | 0 node_modules/jquery/src/core/nodeName.js | 0 node_modules/jquery/src/core/parseHTML.js | 0 node_modules/jquery/src/core/parseXML.js | 0 node_modules/jquery/src/core/ready-no-deferred.js | 0 node_modules/jquery/src/core/ready.js | 0 node_modules/jquery/src/core/readyException.js | 0 node_modules/jquery/src/core/stripAndCollapse.js | 0 node_modules/jquery/src/core/support.js | 0 node_modules/jquery/src/core/toType.js | 0 node_modules/jquery/src/core/var/rsingleTag.js | 0 node_modules/jquery/src/css.js | 0 node_modules/jquery/src/css/addGetHookIf.js | 0 node_modules/jquery/src/css/adjustCSS.js | 0 node_modules/jquery/src/css/curCSS.js | 0 node_modules/jquery/src/css/finalPropName.js | 0 .../jquery/src/css/hiddenVisibleSelectors.js | 0 node_modules/jquery/src/css/showHide.js | 0 node_modules/jquery/src/css/support.js | 0 node_modules/jquery/src/css/var/cssExpand.js | 0 node_modules/jquery/src/css/var/getStyles.js | 0 .../jquery/src/css/var/isHiddenWithinTree.js | 0 node_modules/jquery/src/css/var/rboxStyle.js | 0 node_modules/jquery/src/css/var/rnumnonpx.js | 0 node_modules/jquery/src/css/var/swap.js | 0 node_modules/jquery/src/data.js | 0 node_modules/jquery/src/data/Data.js | 0 node_modules/jquery/src/data/var/acceptData.js | 0 node_modules/jquery/src/data/var/dataPriv.js | 0 node_modules/jquery/src/data/var/dataUser.js | 0 node_modules/jquery/src/deferred.js | 0 node_modules/jquery/src/deferred/exceptionHook.js | 0 node_modules/jquery/src/deprecated.js | 0 .../jquery/src/deprecated/ajax-event-alias.js | 0 node_modules/jquery/src/deprecated/event.js | 0 node_modules/jquery/src/dimensions.js | 0 node_modules/jquery/src/effects.js | 0 node_modules/jquery/src/effects/Tween.js | 0 node_modules/jquery/src/effects/animatedSelector.js | 0 node_modules/jquery/src/event.js | 0 node_modules/jquery/src/event/focusin.js | 0 node_modules/jquery/src/event/support.js | 0 node_modules/jquery/src/event/trigger.js | 0 node_modules/jquery/src/exports/amd.js | 0 node_modules/jquery/src/exports/global.js | 0 node_modules/jquery/src/jquery.js | 0 node_modules/jquery/src/manipulation.js | 0 node_modules/jquery/src/manipulation/_evalUrl.js | 0 .../jquery/src/manipulation/buildFragment.js | 0 node_modules/jquery/src/manipulation/getAll.js | 0 .../jquery/src/manipulation/setGlobalEval.js | 0 node_modules/jquery/src/manipulation/support.js | 0 .../jquery/src/manipulation/var/rscriptType.js | 0 .../jquery/src/manipulation/var/rtagName.js | 0 node_modules/jquery/src/manipulation/wrapMap.js | 0 node_modules/jquery/src/offset.js | 0 node_modules/jquery/src/queue.js | 0 node_modules/jquery/src/queue/delay.js | 0 node_modules/jquery/src/selector-native.js | 0 node_modules/jquery/src/selector-sizzle.js | 0 node_modules/jquery/src/selector.js | 0 node_modules/jquery/src/serialize.js | 0 node_modules/jquery/src/traversing.js | 0 node_modules/jquery/src/traversing/findFilter.js | 0 node_modules/jquery/src/traversing/var/dir.js | 0 .../jquery/src/traversing/var/rneedsContext.js | 0 node_modules/jquery/src/traversing/var/siblings.js | 0 node_modules/jquery/src/var/ObjectFunctionString.js | 0 node_modules/jquery/src/var/arr.js | 0 node_modules/jquery/src/var/class2type.js | 0 node_modules/jquery/src/var/document.js | 0 node_modules/jquery/src/var/documentElement.js | 0 node_modules/jquery/src/var/flat.js | 0 node_modules/jquery/src/var/fnToString.js | 0 node_modules/jquery/src/var/getProto.js | 0 node_modules/jquery/src/var/hasOwn.js | 0 node_modules/jquery/src/var/indexOf.js | 0 node_modules/jquery/src/var/isFunction.js | 0 node_modules/jquery/src/var/isWindow.js | 0 node_modules/jquery/src/var/pnum.js | 0 node_modules/jquery/src/var/push.js | 0 node_modules/jquery/src/var/rcheckableType.js | 0 node_modules/jquery/src/var/rcssNum.js | 0 node_modules/jquery/src/var/rnothtmlwhite.js | 0 node_modules/jquery/src/var/slice.js | 0 node_modules/jquery/src/var/support.js | 0 node_modules/jquery/src/var/toString.js | 0 node_modules/jquery/src/wrap.js | 0 objects/Configuration.php | 0 objects/Encoder.php | 0 objects/Format.php | 0 objects/Login.php | 0 objects/Object.php | 0 objects/ServerMonitor.php | 0 objects/Streamer.php | 0 objects/Upload.php | 0 objects/createSpiritsFromVideo.php | 0 objects/functions.php | 0 objects/getImage.php | 0 objects/getImageMP4.php | 0 objects/getLinkInfo.json.php | 0 objects/getSpiritsFromVideo.php | 0 objects/include_config.php | 0 objects/login.json.php | 0 objects/logoff.json.php | 0 objects/security.php | 0 package-lock.json | 0 package.json | 0 update/update.php | 0 update/updateDb.v2.0.sql | 0 update/updateDb.v2.1.sql | 0 update/updateDb.v2.2.sql | 0 update/updateDb.v2.3.sql | 0 update/updateDb.v2.4.sql | 0 update/updateDb.v2.5.sql | 0 update/updateDb.v2.6.sql | 0 update/updateDb.v3.0.sql | 0 update/updateDb.v3.2.sql | 0 update/updateDb.v3.3.sql | 0 update/updateDb.v3.4.sql | 0 update/updateDb.v3.5.sql | 0 update/updateDb.v3.6.sql | 0 update/updateDb.v3.7.sql | 0 update/updateDb.v3.8.sql | 0 update/updateDb.v3.9.sql | 0 update/updateDb.v4.0.sql | 0 view/bootgrid/jquery.bootgrid.css | 0 view/bootgrid/jquery.bootgrid.fa.js | 0 view/bootgrid/jquery.bootgrid.fa.min.js | 0 view/bootgrid/jquery.bootgrid.js | 0 view/bootgrid/jquery.bootgrid.min.css | 0 view/bootgrid/jquery.bootgrid.min.js | 0 view/css/style.css | 0 view/deleteQueue.php | 0 view/img/OnAir.jpg | Bin view/img/OnAir.png | Bin view/img/OnAir.psd | Bin view/img/countdown.mp4 | Bin view/img/creatingImages.jpg | Bin view/img/favicon.ico | Bin view/img/favicon.png | Bin view/img/logo.png | Bin view/img/logo.psd | Bin view/img/notfound.gif | Bin view/img/notfound.jpg | Bin view/index.php | 0 view/index_configurations.php | 0 view/index_formats.php | 0 view/index_shareVideos.php | 0 view/isAdmin.php | 0 view/jquery-file-upload/cors/postmessage.html | 0 view/jquery-file-upload/cors/result.html | 0 view/jquery-file-upload/css/jquery-ui-demo-ie8.css | 0 view/jquery-file-upload/css/jquery-ui-demo.css | 0 .../css/jquery.fileupload-noscript.css | 0 .../css/jquery.fileupload-ui-noscript.css | 0 .../jquery-file-upload/css/jquery.fileupload-ui.css | 0 view/jquery-file-upload/css/jquery.fileupload.css | 0 view/jquery-file-upload/css/style.css | 0 view/jquery-file-upload/form.php | 0 view/jquery-file-upload/img/loading.gif | Bin view/jquery-file-upload/img/progressbar.gif | Bin view/jquery-file-upload/js/app.js | 0 .../js/cors/jquery.postmessage-transport.js | 0 .../js/cors/jquery.xdr-transport.js | 0 .../js/jquery.fileupload-angular.js | 0 .../js/jquery.fileupload-audio.js | 0 .../js/jquery.fileupload-image.js | 0 .../js/jquery.fileupload-jquery-ui.js | 0 .../js/jquery.fileupload-process.js | 0 view/jquery-file-upload/js/jquery.fileupload-ui.js | 0 .../js/jquery.fileupload-validate.js | 0 .../js/jquery.fileupload-video.js | 0 view/jquery-file-upload/js/jquery.fileupload.js | 0 .../js/jquery.iframe-transport.js | 0 view/jquery-file-upload/js/main.js | 0 .../js/vendor/jquery.ui.widget.js | 0 view/jquery-file-upload/server/php/Dockerfile | 0 .../jquery-file-upload/server/php/UploadHandler.php | 0 .../server/php/docker-compose.yml | 0 .../server/php/fileuploadchunkdone.php | 0 view/jquery-file-upload/server/php/index.php | 0 view/js/canvas-to-blob.min.js | 0 view/js/canvas-to-blob.min.js.map | 0 view/js/jquery.blueimp-gallery.min.js | 0 view/js/jquery.blueimp-gallery.min.js.map | 0 view/js/load-image.all.min.js | 0 view/js/load-image.all.min.js.map | 0 view/js/main.js | 0 view/js/polyfill.min.js | 0 view/js/tmpl.min.js | 0 view/js/tmpl.min.js.map | 0 view/listFiles.json.php | 0 view/mini-upload-form/assets/css/style.css | 0 view/mini-upload-form/assets/img/border-image.png | Bin view/mini-upload-form/assets/img/icons.png | Bin .../mini-upload-form/assets/js/jquery.fileupload.js | 0 .../assets/js/jquery.iframe-transport.js | 0 view/mini-upload-form/assets/js/jquery.knob.js | 0 view/mini-upload-form/assets/js/jquery.ui.widget.js | 0 view/mini-upload-form/assets/js/script.js | 0 view/mini-upload-form/form.php | 0 view/mini-upload-form/index.php | 0 view/priority.php | 0 view/queue.json.php | 0 view/queue.php | 0 view/releaseDate.php | 0 view/removeStreamer.php | 0 view/run.php | 0 view/saveConfig.php | 0 view/send.json.php | 0 view/status.php | 0 view/streamers.json.php | 0 view/upload.php | 0 view/videosListEPG.php | 0 view/videosListToLive.php | 0 view/watermark.php | 0 view/youtubeDl.json.php | 0 404 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 .github/workflows/docker-image.yml mode change 100755 => 100644 .gitignore mode change 100755 => 100644 .htaccess mode change 100755 => 100644 CNAME mode change 100755 => 100644 Dockerfile mode change 100755 => 100644 LICENSE mode change 100755 => 100644 README.md mode change 100755 => 100644 _config.yml mode change 100755 => 100644 deploy/apache/000-default.conf mode change 100755 => 100644 deploy/docker-entrypoint mode change 100755 => 100644 deploy/wait-for-db.php mode change 100755 => 100644 index.php mode change 100755 => 100644 install/checkConfiguration.php mode change 100755 => 100644 install/cli.php mode change 100755 => 100644 install/database.sql mode change 100755 => 100644 install/deleteAllQueue.php mode change 100755 => 100644 install/deleteAllQueueWithError.php mode change 100755 => 100644 install/deleteSystemdPrivate.php mode change 100755 => 100644 install/index.php mode change 100755 => 100644 install/install.php mode change 100755 => 100644 install/killOldProcess.php mode change 100755 => 100644 install/makeAdmin.php mode change 100755 => 100644 install/makeEncoderPublic.php mode change 100755 => 100644 install/reencodeAllVideos.php mode change 100755 => 100644 install/test.php mode change 100755 => 100644 install/watermarkCleaner.php mode change 100755 => 100644 model/EncoderModel.mwb mode change 100755 => 100644 model/EncoderModel.mwb.bak mode change 100755 => 100644 nbproject/project.properties mode change 100755 => 100644 nbproject/project.xml mode change 100755 => 100644 node_modules/.package-lock.json mode change 100755 => 100644 node_modules/bootstrap/CHANGELOG.md mode change 100755 => 100644 node_modules/bootstrap/Gruntfile.js mode change 100755 => 100644 node_modules/bootstrap/LICENSE mode change 100755 => 100644 node_modules/bootstrap/README.md mode change 100755 => 100644 node_modules/bootstrap/dist/css/bootstrap-theme.css mode change 100755 => 100644 node_modules/bootstrap/dist/css/bootstrap-theme.css.map mode change 100755 => 100644 node_modules/bootstrap/dist/css/bootstrap-theme.min.css mode change 100755 => 100644 node_modules/bootstrap/dist/css/bootstrap-theme.min.css.map mode change 100755 => 100644 node_modules/bootstrap/dist/css/bootstrap.css mode change 100755 => 100644 node_modules/bootstrap/dist/css/bootstrap.css.map mode change 100755 => 100644 node_modules/bootstrap/dist/css/bootstrap.min.css mode change 100755 => 100644 node_modules/bootstrap/dist/css/bootstrap.min.css.map mode change 100755 => 100644 node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.eot mode change 100755 => 100644 node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.svg mode change 100755 => 100644 node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf mode change 100755 => 100644 node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff mode change 100755 => 100644 node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 mode change 100755 => 100644 node_modules/bootstrap/dist/js/bootstrap.js mode change 100755 => 100644 node_modules/bootstrap/dist/js/bootstrap.min.js mode change 100755 => 100644 node_modules/bootstrap/dist/js/npm.js mode change 100755 => 100644 node_modules/bootstrap/fonts/glyphicons-halflings-regular.eot mode change 100755 => 100644 node_modules/bootstrap/fonts/glyphicons-halflings-regular.svg mode change 100755 => 100644 node_modules/bootstrap/fonts/glyphicons-halflings-regular.ttf mode change 100755 => 100644 node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff mode change 100755 => 100644 node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff2 mode change 100755 => 100644 node_modules/bootstrap/grunt/.jshintrc mode change 100755 => 100644 node_modules/bootstrap/grunt/.stylelintrc mode change 100755 => 100644 node_modules/bootstrap/grunt/browsers.js mode change 100755 => 100644 node_modules/bootstrap/grunt/bs-commonjs-generator.js mode change 100755 => 100644 node_modules/bootstrap/grunt/bs-glyphicons-data-generator.js mode change 100755 => 100644 node_modules/bootstrap/grunt/bs-lessdoc-parser.js mode change 100755 => 100644 node_modules/bootstrap/grunt/bs-raw-files-generator.js mode change 100755 => 100644 node_modules/bootstrap/grunt/change-version.js mode change 100755 => 100644 node_modules/bootstrap/grunt/configBridge.json mode change 100755 => 100644 node_modules/bootstrap/grunt/generate-sri.js mode change 100755 => 100644 node_modules/bootstrap/grunt/karma.conf.js mode change 100755 => 100644 node_modules/bootstrap/js/affix.js mode change 100755 => 100644 node_modules/bootstrap/js/alert.js mode change 100755 => 100644 node_modules/bootstrap/js/button.js mode change 100755 => 100644 node_modules/bootstrap/js/carousel.js mode change 100755 => 100644 node_modules/bootstrap/js/collapse.js mode change 100755 => 100644 node_modules/bootstrap/js/dropdown.js mode change 100755 => 100644 node_modules/bootstrap/js/modal.js mode change 100755 => 100644 node_modules/bootstrap/js/popover.js mode change 100755 => 100644 node_modules/bootstrap/js/scrollspy.js mode change 100755 => 100644 node_modules/bootstrap/js/tab.js mode change 100755 => 100644 node_modules/bootstrap/js/tooltip.js mode change 100755 => 100644 node_modules/bootstrap/js/transition.js mode change 100755 => 100644 node_modules/bootstrap/less/alerts.less mode change 100755 => 100644 node_modules/bootstrap/less/badges.less mode change 100755 => 100644 node_modules/bootstrap/less/bootstrap.less mode change 100755 => 100644 node_modules/bootstrap/less/breadcrumbs.less mode change 100755 => 100644 node_modules/bootstrap/less/button-groups.less mode change 100755 => 100644 node_modules/bootstrap/less/buttons.less mode change 100755 => 100644 node_modules/bootstrap/less/carousel.less mode change 100755 => 100644 node_modules/bootstrap/less/close.less mode change 100755 => 100644 node_modules/bootstrap/less/code.less mode change 100755 => 100644 node_modules/bootstrap/less/component-animations.less mode change 100755 => 100644 node_modules/bootstrap/less/dropdowns.less mode change 100755 => 100644 node_modules/bootstrap/less/forms.less mode change 100755 => 100644 node_modules/bootstrap/less/glyphicons.less mode change 100755 => 100644 node_modules/bootstrap/less/grid.less mode change 100755 => 100644 node_modules/bootstrap/less/input-groups.less mode change 100755 => 100644 node_modules/bootstrap/less/jumbotron.less mode change 100755 => 100644 node_modules/bootstrap/less/labels.less mode change 100755 => 100644 node_modules/bootstrap/less/list-group.less mode change 100755 => 100644 node_modules/bootstrap/less/media.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/alerts.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/background-variant.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/border-radius.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/buttons.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/center-block.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/clearfix.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/forms.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/gradients.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/grid-framework.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/grid.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/hide-text.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/image.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/labels.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/list-group.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/nav-divider.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/nav-vertical-align.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/opacity.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/pagination.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/panels.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/progress-bar.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/reset-filter.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/reset-text.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/resize.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/responsive-visibility.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/size.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/tab-focus.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/table-row.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/text-emphasis.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/text-overflow.less mode change 100755 => 100644 node_modules/bootstrap/less/mixins/vendor-prefixes.less mode change 100755 => 100644 node_modules/bootstrap/less/modals.less mode change 100755 => 100644 node_modules/bootstrap/less/navbar.less mode change 100755 => 100644 node_modules/bootstrap/less/navs.less mode change 100755 => 100644 node_modules/bootstrap/less/normalize.less mode change 100755 => 100644 node_modules/bootstrap/less/pager.less mode change 100755 => 100644 node_modules/bootstrap/less/pagination.less mode change 100755 => 100644 node_modules/bootstrap/less/panels.less mode change 100755 => 100644 node_modules/bootstrap/less/popovers.less mode change 100755 => 100644 node_modules/bootstrap/less/print.less mode change 100755 => 100644 node_modules/bootstrap/less/progress-bars.less mode change 100755 => 100644 node_modules/bootstrap/less/responsive-embed.less mode change 100755 => 100644 node_modules/bootstrap/less/responsive-utilities.less mode change 100755 => 100644 node_modules/bootstrap/less/scaffolding.less mode change 100755 => 100644 node_modules/bootstrap/less/tables.less mode change 100755 => 100644 node_modules/bootstrap/less/theme.less mode change 100755 => 100644 node_modules/bootstrap/less/thumbnails.less mode change 100755 => 100644 node_modules/bootstrap/less/tooltip.less mode change 100755 => 100644 node_modules/bootstrap/less/type.less mode change 100755 => 100644 node_modules/bootstrap/less/utilities.less mode change 100755 => 100644 node_modules/bootstrap/less/variables.less mode change 100755 => 100644 node_modules/bootstrap/less/wells.less mode change 100755 => 100644 node_modules/bootstrap/package.json mode change 100755 => 100644 node_modules/jquery/AUTHORS.txt mode change 100755 => 100644 node_modules/jquery/LICENSE.txt mode change 100755 => 100644 node_modules/jquery/README.md mode change 100755 => 100644 node_modules/jquery/bower.json mode change 100755 => 100644 node_modules/jquery/dist/jquery.js mode change 100755 => 100644 node_modules/jquery/dist/jquery.min.js mode change 100755 => 100644 node_modules/jquery/dist/jquery.min.map mode change 100755 => 100644 node_modules/jquery/dist/jquery.slim.js mode change 100755 => 100644 node_modules/jquery/dist/jquery.slim.min.js mode change 100755 => 100644 node_modules/jquery/dist/jquery.slim.min.map mode change 100755 => 100644 node_modules/jquery/external/sizzle/LICENSE.txt mode change 100755 => 100644 node_modules/jquery/external/sizzle/dist/sizzle.js mode change 100755 => 100644 node_modules/jquery/external/sizzle/dist/sizzle.min.js mode change 100755 => 100644 node_modules/jquery/external/sizzle/dist/sizzle.min.map mode change 100755 => 100644 node_modules/jquery/package.json mode change 100755 => 100644 node_modules/jquery/src/ajax.js mode change 100755 => 100644 node_modules/jquery/src/ajax/jsonp.js mode change 100755 => 100644 node_modules/jquery/src/ajax/load.js mode change 100755 => 100644 node_modules/jquery/src/ajax/script.js mode change 100755 => 100644 node_modules/jquery/src/ajax/var/location.js mode change 100755 => 100644 node_modules/jquery/src/ajax/var/nonce.js mode change 100755 => 100644 node_modules/jquery/src/ajax/var/rquery.js mode change 100755 => 100644 node_modules/jquery/src/ajax/xhr.js mode change 100755 => 100644 node_modules/jquery/src/attributes.js mode change 100755 => 100644 node_modules/jquery/src/attributes/attr.js mode change 100755 => 100644 node_modules/jquery/src/attributes/classes.js mode change 100755 => 100644 node_modules/jquery/src/attributes/prop.js mode change 100755 => 100644 node_modules/jquery/src/attributes/support.js mode change 100755 => 100644 node_modules/jquery/src/attributes/val.js mode change 100755 => 100644 node_modules/jquery/src/callbacks.js mode change 100755 => 100644 node_modules/jquery/src/core.js mode change 100755 => 100644 node_modules/jquery/src/core/DOMEval.js mode change 100755 => 100644 node_modules/jquery/src/core/access.js mode change 100755 => 100644 node_modules/jquery/src/core/camelCase.js mode change 100755 => 100644 node_modules/jquery/src/core/init.js mode change 100755 => 100644 node_modules/jquery/src/core/isAttached.js mode change 100755 => 100644 node_modules/jquery/src/core/nodeName.js mode change 100755 => 100644 node_modules/jquery/src/core/parseHTML.js mode change 100755 => 100644 node_modules/jquery/src/core/parseXML.js mode change 100755 => 100644 node_modules/jquery/src/core/ready-no-deferred.js mode change 100755 => 100644 node_modules/jquery/src/core/ready.js mode change 100755 => 100644 node_modules/jquery/src/core/readyException.js mode change 100755 => 100644 node_modules/jquery/src/core/stripAndCollapse.js mode change 100755 => 100644 node_modules/jquery/src/core/support.js mode change 100755 => 100644 node_modules/jquery/src/core/toType.js mode change 100755 => 100644 node_modules/jquery/src/core/var/rsingleTag.js mode change 100755 => 100644 node_modules/jquery/src/css.js mode change 100755 => 100644 node_modules/jquery/src/css/addGetHookIf.js mode change 100755 => 100644 node_modules/jquery/src/css/adjustCSS.js mode change 100755 => 100644 node_modules/jquery/src/css/curCSS.js mode change 100755 => 100644 node_modules/jquery/src/css/finalPropName.js mode change 100755 => 100644 node_modules/jquery/src/css/hiddenVisibleSelectors.js mode change 100755 => 100644 node_modules/jquery/src/css/showHide.js mode change 100755 => 100644 node_modules/jquery/src/css/support.js mode change 100755 => 100644 node_modules/jquery/src/css/var/cssExpand.js mode change 100755 => 100644 node_modules/jquery/src/css/var/getStyles.js mode change 100755 => 100644 node_modules/jquery/src/css/var/isHiddenWithinTree.js mode change 100755 => 100644 node_modules/jquery/src/css/var/rboxStyle.js mode change 100755 => 100644 node_modules/jquery/src/css/var/rnumnonpx.js mode change 100755 => 100644 node_modules/jquery/src/css/var/swap.js mode change 100755 => 100644 node_modules/jquery/src/data.js mode change 100755 => 100644 node_modules/jquery/src/data/Data.js mode change 100755 => 100644 node_modules/jquery/src/data/var/acceptData.js mode change 100755 => 100644 node_modules/jquery/src/data/var/dataPriv.js mode change 100755 => 100644 node_modules/jquery/src/data/var/dataUser.js mode change 100755 => 100644 node_modules/jquery/src/deferred.js mode change 100755 => 100644 node_modules/jquery/src/deferred/exceptionHook.js mode change 100755 => 100644 node_modules/jquery/src/deprecated.js mode change 100755 => 100644 node_modules/jquery/src/deprecated/ajax-event-alias.js mode change 100755 => 100644 node_modules/jquery/src/deprecated/event.js mode change 100755 => 100644 node_modules/jquery/src/dimensions.js mode change 100755 => 100644 node_modules/jquery/src/effects.js mode change 100755 => 100644 node_modules/jquery/src/effects/Tween.js mode change 100755 => 100644 node_modules/jquery/src/effects/animatedSelector.js mode change 100755 => 100644 node_modules/jquery/src/event.js mode change 100755 => 100644 node_modules/jquery/src/event/focusin.js mode change 100755 => 100644 node_modules/jquery/src/event/support.js mode change 100755 => 100644 node_modules/jquery/src/event/trigger.js mode change 100755 => 100644 node_modules/jquery/src/exports/amd.js mode change 100755 => 100644 node_modules/jquery/src/exports/global.js mode change 100755 => 100644 node_modules/jquery/src/jquery.js mode change 100755 => 100644 node_modules/jquery/src/manipulation.js mode change 100755 => 100644 node_modules/jquery/src/manipulation/_evalUrl.js mode change 100755 => 100644 node_modules/jquery/src/manipulation/buildFragment.js mode change 100755 => 100644 node_modules/jquery/src/manipulation/getAll.js mode change 100755 => 100644 node_modules/jquery/src/manipulation/setGlobalEval.js mode change 100755 => 100644 node_modules/jquery/src/manipulation/support.js mode change 100755 => 100644 node_modules/jquery/src/manipulation/var/rscriptType.js mode change 100755 => 100644 node_modules/jquery/src/manipulation/var/rtagName.js mode change 100755 => 100644 node_modules/jquery/src/manipulation/wrapMap.js mode change 100755 => 100644 node_modules/jquery/src/offset.js mode change 100755 => 100644 node_modules/jquery/src/queue.js mode change 100755 => 100644 node_modules/jquery/src/queue/delay.js mode change 100755 => 100644 node_modules/jquery/src/selector-native.js mode change 100755 => 100644 node_modules/jquery/src/selector-sizzle.js mode change 100755 => 100644 node_modules/jquery/src/selector.js mode change 100755 => 100644 node_modules/jquery/src/serialize.js mode change 100755 => 100644 node_modules/jquery/src/traversing.js mode change 100755 => 100644 node_modules/jquery/src/traversing/findFilter.js mode change 100755 => 100644 node_modules/jquery/src/traversing/var/dir.js mode change 100755 => 100644 node_modules/jquery/src/traversing/var/rneedsContext.js mode change 100755 => 100644 node_modules/jquery/src/traversing/var/siblings.js mode change 100755 => 100644 node_modules/jquery/src/var/ObjectFunctionString.js mode change 100755 => 100644 node_modules/jquery/src/var/arr.js mode change 100755 => 100644 node_modules/jquery/src/var/class2type.js mode change 100755 => 100644 node_modules/jquery/src/var/document.js mode change 100755 => 100644 node_modules/jquery/src/var/documentElement.js mode change 100755 => 100644 node_modules/jquery/src/var/flat.js mode change 100755 => 100644 node_modules/jquery/src/var/fnToString.js mode change 100755 => 100644 node_modules/jquery/src/var/getProto.js mode change 100755 => 100644 node_modules/jquery/src/var/hasOwn.js mode change 100755 => 100644 node_modules/jquery/src/var/indexOf.js mode change 100755 => 100644 node_modules/jquery/src/var/isFunction.js mode change 100755 => 100644 node_modules/jquery/src/var/isWindow.js mode change 100755 => 100644 node_modules/jquery/src/var/pnum.js mode change 100755 => 100644 node_modules/jquery/src/var/push.js mode change 100755 => 100644 node_modules/jquery/src/var/rcheckableType.js mode change 100755 => 100644 node_modules/jquery/src/var/rcssNum.js mode change 100755 => 100644 node_modules/jquery/src/var/rnothtmlwhite.js mode change 100755 => 100644 node_modules/jquery/src/var/slice.js mode change 100755 => 100644 node_modules/jquery/src/var/support.js mode change 100755 => 100644 node_modules/jquery/src/var/toString.js mode change 100755 => 100644 node_modules/jquery/src/wrap.js mode change 100755 => 100644 objects/Configuration.php mode change 100755 => 100644 objects/Encoder.php mode change 100755 => 100644 objects/Format.php mode change 100755 => 100644 objects/Login.php mode change 100755 => 100644 objects/Object.php mode change 100755 => 100644 objects/ServerMonitor.php mode change 100755 => 100644 objects/Streamer.php mode change 100755 => 100644 objects/Upload.php mode change 100755 => 100644 objects/createSpiritsFromVideo.php mode change 100755 => 100644 objects/functions.php mode change 100755 => 100644 objects/getImage.php mode change 100755 => 100644 objects/getImageMP4.php mode change 100755 => 100644 objects/getLinkInfo.json.php mode change 100755 => 100644 objects/getSpiritsFromVideo.php mode change 100755 => 100644 objects/include_config.php mode change 100755 => 100644 objects/login.json.php mode change 100755 => 100644 objects/logoff.json.php mode change 100755 => 100644 objects/security.php mode change 100755 => 100644 package-lock.json mode change 100755 => 100644 package.json mode change 100755 => 100644 update/update.php mode change 100755 => 100644 update/updateDb.v2.0.sql mode change 100755 => 100644 update/updateDb.v2.1.sql mode change 100755 => 100644 update/updateDb.v2.2.sql mode change 100755 => 100644 update/updateDb.v2.3.sql mode change 100755 => 100644 update/updateDb.v2.4.sql mode change 100755 => 100644 update/updateDb.v2.5.sql mode change 100755 => 100644 update/updateDb.v2.6.sql mode change 100755 => 100644 update/updateDb.v3.0.sql mode change 100755 => 100644 update/updateDb.v3.2.sql mode change 100755 => 100644 update/updateDb.v3.3.sql mode change 100755 => 100644 update/updateDb.v3.4.sql mode change 100755 => 100644 update/updateDb.v3.5.sql mode change 100755 => 100644 update/updateDb.v3.6.sql mode change 100755 => 100644 update/updateDb.v3.7.sql mode change 100755 => 100644 update/updateDb.v3.8.sql mode change 100755 => 100644 update/updateDb.v3.9.sql mode change 100755 => 100644 update/updateDb.v4.0.sql mode change 100755 => 100644 view/bootgrid/jquery.bootgrid.css mode change 100755 => 100644 view/bootgrid/jquery.bootgrid.fa.js mode change 100755 => 100644 view/bootgrid/jquery.bootgrid.fa.min.js mode change 100755 => 100644 view/bootgrid/jquery.bootgrid.js mode change 100755 => 100644 view/bootgrid/jquery.bootgrid.min.css mode change 100755 => 100644 view/bootgrid/jquery.bootgrid.min.js mode change 100755 => 100644 view/css/style.css mode change 100755 => 100644 view/deleteQueue.php mode change 100755 => 100644 view/img/OnAir.jpg mode change 100755 => 100644 view/img/OnAir.png mode change 100755 => 100644 view/img/OnAir.psd mode change 100755 => 100644 view/img/countdown.mp4 mode change 100755 => 100644 view/img/creatingImages.jpg mode change 100755 => 100644 view/img/favicon.ico mode change 100755 => 100644 view/img/favicon.png mode change 100755 => 100644 view/img/logo.png mode change 100755 => 100644 view/img/logo.psd mode change 100755 => 100644 view/img/notfound.gif mode change 100755 => 100644 view/img/notfound.jpg mode change 100755 => 100644 view/index.php mode change 100755 => 100644 view/index_configurations.php mode change 100755 => 100644 view/index_formats.php mode change 100755 => 100644 view/index_shareVideos.php mode change 100755 => 100644 view/isAdmin.php mode change 100755 => 100644 view/jquery-file-upload/cors/postmessage.html mode change 100755 => 100644 view/jquery-file-upload/cors/result.html mode change 100755 => 100644 view/jquery-file-upload/css/jquery-ui-demo-ie8.css mode change 100755 => 100644 view/jquery-file-upload/css/jquery-ui-demo.css mode change 100755 => 100644 view/jquery-file-upload/css/jquery.fileupload-noscript.css mode change 100755 => 100644 view/jquery-file-upload/css/jquery.fileupload-ui-noscript.css mode change 100755 => 100644 view/jquery-file-upload/css/jquery.fileupload-ui.css mode change 100755 => 100644 view/jquery-file-upload/css/jquery.fileupload.css mode change 100755 => 100644 view/jquery-file-upload/css/style.css mode change 100755 => 100644 view/jquery-file-upload/form.php mode change 100755 => 100644 view/jquery-file-upload/img/loading.gif mode change 100755 => 100644 view/jquery-file-upload/img/progressbar.gif mode change 100755 => 100644 view/jquery-file-upload/js/app.js mode change 100755 => 100644 view/jquery-file-upload/js/cors/jquery.postmessage-transport.js mode change 100755 => 100644 view/jquery-file-upload/js/cors/jquery.xdr-transport.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload-angular.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload-audio.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload-image.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload-jquery-ui.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload-process.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload-ui.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload-validate.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload-video.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.fileupload.js mode change 100755 => 100644 view/jquery-file-upload/js/jquery.iframe-transport.js mode change 100755 => 100644 view/jquery-file-upload/js/main.js mode change 100755 => 100644 view/jquery-file-upload/js/vendor/jquery.ui.widget.js mode change 100755 => 100644 view/jquery-file-upload/server/php/Dockerfile mode change 100755 => 100644 view/jquery-file-upload/server/php/UploadHandler.php mode change 100755 => 100644 view/jquery-file-upload/server/php/docker-compose.yml mode change 100755 => 100644 view/jquery-file-upload/server/php/fileuploadchunkdone.php mode change 100755 => 100644 view/jquery-file-upload/server/php/index.php mode change 100755 => 100644 view/js/canvas-to-blob.min.js mode change 100755 => 100644 view/js/canvas-to-blob.min.js.map mode change 100755 => 100644 view/js/jquery.blueimp-gallery.min.js mode change 100755 => 100644 view/js/jquery.blueimp-gallery.min.js.map mode change 100755 => 100644 view/js/load-image.all.min.js mode change 100755 => 100644 view/js/load-image.all.min.js.map mode change 100755 => 100644 view/js/main.js mode change 100755 => 100644 view/js/polyfill.min.js mode change 100755 => 100644 view/js/tmpl.min.js mode change 100755 => 100644 view/js/tmpl.min.js.map mode change 100755 => 100644 view/listFiles.json.php mode change 100755 => 100644 view/mini-upload-form/assets/css/style.css mode change 100755 => 100644 view/mini-upload-form/assets/img/border-image.png mode change 100755 => 100644 view/mini-upload-form/assets/img/icons.png mode change 100755 => 100644 view/mini-upload-form/assets/js/jquery.fileupload.js mode change 100755 => 100644 view/mini-upload-form/assets/js/jquery.iframe-transport.js mode change 100755 => 100644 view/mini-upload-form/assets/js/jquery.knob.js mode change 100755 => 100644 view/mini-upload-form/assets/js/jquery.ui.widget.js mode change 100755 => 100644 view/mini-upload-form/assets/js/script.js mode change 100755 => 100644 view/mini-upload-form/form.php mode change 100755 => 100644 view/mini-upload-form/index.php mode change 100755 => 100644 view/priority.php mode change 100755 => 100644 view/queue.json.php mode change 100755 => 100644 view/queue.php mode change 100755 => 100644 view/releaseDate.php mode change 100755 => 100644 view/removeStreamer.php mode change 100755 => 100644 view/run.php mode change 100755 => 100644 view/saveConfig.php mode change 100755 => 100644 view/send.json.php mode change 100755 => 100644 view/status.php mode change 100755 => 100644 view/streamers.json.php mode change 100755 => 100644 view/upload.php mode change 100755 => 100644 view/videosListEPG.php mode change 100755 => 100644 view/videosListToLive.php mode change 100755 => 100644 view/watermark.php mode change 100755 => 100644 view/youtubeDl.json.php diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml old mode 100755 new mode 100644 diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/.htaccess b/.htaccess old mode 100755 new mode 100644 diff --git a/CNAME b/CNAME old mode 100755 new mode 100644 diff --git a/Dockerfile b/Dockerfile old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/_config.yml b/_config.yml old mode 100755 new mode 100644 diff --git a/deploy/apache/000-default.conf b/deploy/apache/000-default.conf old mode 100755 new mode 100644 diff --git a/deploy/docker-entrypoint b/deploy/docker-entrypoint old mode 100755 new mode 100644 diff --git a/deploy/wait-for-db.php b/deploy/wait-for-db.php old mode 100755 new mode 100644 diff --git a/index.php b/index.php old mode 100755 new mode 100644 diff --git a/install/checkConfiguration.php b/install/checkConfiguration.php old mode 100755 new mode 100644 diff --git a/install/cli.php b/install/cli.php old mode 100755 new mode 100644 diff --git a/install/database.sql b/install/database.sql old mode 100755 new mode 100644 diff --git a/install/deleteAllQueue.php b/install/deleteAllQueue.php old mode 100755 new mode 100644 diff --git a/install/deleteAllQueueWithError.php b/install/deleteAllQueueWithError.php old mode 100755 new mode 100644 diff --git a/install/deleteSystemdPrivate.php b/install/deleteSystemdPrivate.php old mode 100755 new mode 100644 diff --git a/install/index.php b/install/index.php old mode 100755 new mode 100644 diff --git a/install/install.php b/install/install.php old mode 100755 new mode 100644 diff --git a/install/killOldProcess.php b/install/killOldProcess.php old mode 100755 new mode 100644 diff --git a/install/makeAdmin.php b/install/makeAdmin.php old mode 100755 new mode 100644 diff --git a/install/makeEncoderPublic.php b/install/makeEncoderPublic.php old mode 100755 new mode 100644 diff --git a/install/reencodeAllVideos.php b/install/reencodeAllVideos.php old mode 100755 new mode 100644 diff --git a/install/test.php b/install/test.php old mode 100755 new mode 100644 diff --git a/install/watermarkCleaner.php b/install/watermarkCleaner.php old mode 100755 new mode 100644 diff --git a/model/EncoderModel.mwb b/model/EncoderModel.mwb old mode 100755 new mode 100644 diff --git a/model/EncoderModel.mwb.bak b/model/EncoderModel.mwb.bak old mode 100755 new mode 100644 diff --git a/nbproject/project.properties b/nbproject/project.properties old mode 100755 new mode 100644 diff --git a/nbproject/project.xml b/nbproject/project.xml old mode 100755 new mode 100644 diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/CHANGELOG.md b/node_modules/bootstrap/CHANGELOG.md old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/Gruntfile.js b/node_modules/bootstrap/Gruntfile.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/LICENSE b/node_modules/bootstrap/LICENSE old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/README.md b/node_modules/bootstrap/README.md old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/css/bootstrap-theme.css b/node_modules/bootstrap/dist/css/bootstrap-theme.css old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/css/bootstrap-theme.css.map b/node_modules/bootstrap/dist/css/bootstrap-theme.css.map old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/css/bootstrap-theme.min.css b/node_modules/bootstrap/dist/css/bootstrap-theme.min.css old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/css/bootstrap-theme.min.css.map b/node_modules/bootstrap/dist/css/bootstrap-theme.min.css.map old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/css/bootstrap.css b/node_modules/bootstrap/dist/css/bootstrap.css old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/css/bootstrap.css.map b/node_modules/bootstrap/dist/css/bootstrap.css.map old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/css/bootstrap.min.css b/node_modules/bootstrap/dist/css/bootstrap.min.css old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/css/bootstrap.min.css.map b/node_modules/bootstrap/dist/css/bootstrap.min.css.map old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.eot old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.svg b/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.svg old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff b/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/node_modules/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/js/bootstrap.js b/node_modules/bootstrap/dist/js/bootstrap.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/js/bootstrap.min.js b/node_modules/bootstrap/dist/js/bootstrap.min.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/dist/js/npm.js b/node_modules/bootstrap/dist/js/npm.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/fonts/glyphicons-halflings-regular.eot b/node_modules/bootstrap/fonts/glyphicons-halflings-regular.eot old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/fonts/glyphicons-halflings-regular.svg b/node_modules/bootstrap/fonts/glyphicons-halflings-regular.svg old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/fonts/glyphicons-halflings-regular.ttf b/node_modules/bootstrap/fonts/glyphicons-halflings-regular.ttf old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff b/node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/node_modules/bootstrap/fonts/glyphicons-halflings-regular.woff2 old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/.jshintrc b/node_modules/bootstrap/grunt/.jshintrc old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/.stylelintrc b/node_modules/bootstrap/grunt/.stylelintrc old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/browsers.js b/node_modules/bootstrap/grunt/browsers.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/bs-commonjs-generator.js b/node_modules/bootstrap/grunt/bs-commonjs-generator.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/bs-glyphicons-data-generator.js b/node_modules/bootstrap/grunt/bs-glyphicons-data-generator.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/bs-lessdoc-parser.js b/node_modules/bootstrap/grunt/bs-lessdoc-parser.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/bs-raw-files-generator.js b/node_modules/bootstrap/grunt/bs-raw-files-generator.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/change-version.js b/node_modules/bootstrap/grunt/change-version.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/configBridge.json b/node_modules/bootstrap/grunt/configBridge.json old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/generate-sri.js b/node_modules/bootstrap/grunt/generate-sri.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/grunt/karma.conf.js b/node_modules/bootstrap/grunt/karma.conf.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/affix.js b/node_modules/bootstrap/js/affix.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/alert.js b/node_modules/bootstrap/js/alert.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/button.js b/node_modules/bootstrap/js/button.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/carousel.js b/node_modules/bootstrap/js/carousel.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/collapse.js b/node_modules/bootstrap/js/collapse.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/dropdown.js b/node_modules/bootstrap/js/dropdown.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/modal.js b/node_modules/bootstrap/js/modal.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/popover.js b/node_modules/bootstrap/js/popover.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/scrollspy.js b/node_modules/bootstrap/js/scrollspy.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/tab.js b/node_modules/bootstrap/js/tab.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/tooltip.js b/node_modules/bootstrap/js/tooltip.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/js/transition.js b/node_modules/bootstrap/js/transition.js old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/alerts.less b/node_modules/bootstrap/less/alerts.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/badges.less b/node_modules/bootstrap/less/badges.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/bootstrap.less b/node_modules/bootstrap/less/bootstrap.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/breadcrumbs.less b/node_modules/bootstrap/less/breadcrumbs.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/button-groups.less b/node_modules/bootstrap/less/button-groups.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/buttons.less b/node_modules/bootstrap/less/buttons.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/carousel.less b/node_modules/bootstrap/less/carousel.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/close.less b/node_modules/bootstrap/less/close.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/code.less b/node_modules/bootstrap/less/code.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/component-animations.less b/node_modules/bootstrap/less/component-animations.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/dropdowns.less b/node_modules/bootstrap/less/dropdowns.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/forms.less b/node_modules/bootstrap/less/forms.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/glyphicons.less b/node_modules/bootstrap/less/glyphicons.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/grid.less b/node_modules/bootstrap/less/grid.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/input-groups.less b/node_modules/bootstrap/less/input-groups.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/jumbotron.less b/node_modules/bootstrap/less/jumbotron.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/labels.less b/node_modules/bootstrap/less/labels.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/list-group.less b/node_modules/bootstrap/less/list-group.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/media.less b/node_modules/bootstrap/less/media.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins.less b/node_modules/bootstrap/less/mixins.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/alerts.less b/node_modules/bootstrap/less/mixins/alerts.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/background-variant.less b/node_modules/bootstrap/less/mixins/background-variant.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/border-radius.less b/node_modules/bootstrap/less/mixins/border-radius.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/buttons.less b/node_modules/bootstrap/less/mixins/buttons.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/center-block.less b/node_modules/bootstrap/less/mixins/center-block.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/clearfix.less b/node_modules/bootstrap/less/mixins/clearfix.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/forms.less b/node_modules/bootstrap/less/mixins/forms.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/gradients.less b/node_modules/bootstrap/less/mixins/gradients.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/grid-framework.less b/node_modules/bootstrap/less/mixins/grid-framework.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/grid.less b/node_modules/bootstrap/less/mixins/grid.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/hide-text.less b/node_modules/bootstrap/less/mixins/hide-text.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/image.less b/node_modules/bootstrap/less/mixins/image.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/labels.less b/node_modules/bootstrap/less/mixins/labels.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/list-group.less b/node_modules/bootstrap/less/mixins/list-group.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/nav-divider.less b/node_modules/bootstrap/less/mixins/nav-divider.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/nav-vertical-align.less b/node_modules/bootstrap/less/mixins/nav-vertical-align.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/opacity.less b/node_modules/bootstrap/less/mixins/opacity.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/pagination.less b/node_modules/bootstrap/less/mixins/pagination.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/panels.less b/node_modules/bootstrap/less/mixins/panels.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/progress-bar.less b/node_modules/bootstrap/less/mixins/progress-bar.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/reset-filter.less b/node_modules/bootstrap/less/mixins/reset-filter.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/reset-text.less b/node_modules/bootstrap/less/mixins/reset-text.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/resize.less b/node_modules/bootstrap/less/mixins/resize.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/responsive-visibility.less b/node_modules/bootstrap/less/mixins/responsive-visibility.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/size.less b/node_modules/bootstrap/less/mixins/size.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/tab-focus.less b/node_modules/bootstrap/less/mixins/tab-focus.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/table-row.less b/node_modules/bootstrap/less/mixins/table-row.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/text-emphasis.less b/node_modules/bootstrap/less/mixins/text-emphasis.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/text-overflow.less b/node_modules/bootstrap/less/mixins/text-overflow.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/mixins/vendor-prefixes.less b/node_modules/bootstrap/less/mixins/vendor-prefixes.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/modals.less b/node_modules/bootstrap/less/modals.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/navbar.less b/node_modules/bootstrap/less/navbar.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/navs.less b/node_modules/bootstrap/less/navs.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/normalize.less b/node_modules/bootstrap/less/normalize.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/pager.less b/node_modules/bootstrap/less/pager.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/pagination.less b/node_modules/bootstrap/less/pagination.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/panels.less b/node_modules/bootstrap/less/panels.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/popovers.less b/node_modules/bootstrap/less/popovers.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/print.less b/node_modules/bootstrap/less/print.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/progress-bars.less b/node_modules/bootstrap/less/progress-bars.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/responsive-embed.less b/node_modules/bootstrap/less/responsive-embed.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/responsive-utilities.less b/node_modules/bootstrap/less/responsive-utilities.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/scaffolding.less b/node_modules/bootstrap/less/scaffolding.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/tables.less b/node_modules/bootstrap/less/tables.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/theme.less b/node_modules/bootstrap/less/theme.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/thumbnails.less b/node_modules/bootstrap/less/thumbnails.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/tooltip.less b/node_modules/bootstrap/less/tooltip.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/type.less b/node_modules/bootstrap/less/type.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/utilities.less b/node_modules/bootstrap/less/utilities.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/variables.less b/node_modules/bootstrap/less/variables.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/less/wells.less b/node_modules/bootstrap/less/wells.less old mode 100755 new mode 100644 diff --git a/node_modules/bootstrap/package.json b/node_modules/bootstrap/package.json old mode 100755 new mode 100644 diff --git a/node_modules/jquery/AUTHORS.txt b/node_modules/jquery/AUTHORS.txt old mode 100755 new mode 100644 diff --git a/node_modules/jquery/LICENSE.txt b/node_modules/jquery/LICENSE.txt old mode 100755 new mode 100644 diff --git a/node_modules/jquery/README.md b/node_modules/jquery/README.md old mode 100755 new mode 100644 diff --git a/node_modules/jquery/bower.json b/node_modules/jquery/bower.json old mode 100755 new mode 100644 diff --git a/node_modules/jquery/dist/jquery.js b/node_modules/jquery/dist/jquery.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/dist/jquery.min.js b/node_modules/jquery/dist/jquery.min.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/dist/jquery.min.map b/node_modules/jquery/dist/jquery.min.map old mode 100755 new mode 100644 diff --git a/node_modules/jquery/dist/jquery.slim.js b/node_modules/jquery/dist/jquery.slim.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/dist/jquery.slim.min.js b/node_modules/jquery/dist/jquery.slim.min.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/dist/jquery.slim.min.map b/node_modules/jquery/dist/jquery.slim.min.map old mode 100755 new mode 100644 diff --git a/node_modules/jquery/external/sizzle/LICENSE.txt b/node_modules/jquery/external/sizzle/LICENSE.txt old mode 100755 new mode 100644 diff --git a/node_modules/jquery/external/sizzle/dist/sizzle.js b/node_modules/jquery/external/sizzle/dist/sizzle.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/external/sizzle/dist/sizzle.min.js b/node_modules/jquery/external/sizzle/dist/sizzle.min.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/external/sizzle/dist/sizzle.min.map b/node_modules/jquery/external/sizzle/dist/sizzle.min.map old mode 100755 new mode 100644 diff --git a/node_modules/jquery/package.json b/node_modules/jquery/package.json old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/ajax.js b/node_modules/jquery/src/ajax.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/ajax/jsonp.js b/node_modules/jquery/src/ajax/jsonp.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/ajax/load.js b/node_modules/jquery/src/ajax/load.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/ajax/script.js b/node_modules/jquery/src/ajax/script.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/ajax/var/location.js b/node_modules/jquery/src/ajax/var/location.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/ajax/var/nonce.js b/node_modules/jquery/src/ajax/var/nonce.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/ajax/var/rquery.js b/node_modules/jquery/src/ajax/var/rquery.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/ajax/xhr.js b/node_modules/jquery/src/ajax/xhr.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/attributes.js b/node_modules/jquery/src/attributes.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/attributes/attr.js b/node_modules/jquery/src/attributes/attr.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/attributes/classes.js b/node_modules/jquery/src/attributes/classes.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/attributes/prop.js b/node_modules/jquery/src/attributes/prop.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/attributes/support.js b/node_modules/jquery/src/attributes/support.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/attributes/val.js b/node_modules/jquery/src/attributes/val.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/callbacks.js b/node_modules/jquery/src/callbacks.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core.js b/node_modules/jquery/src/core.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/DOMEval.js b/node_modules/jquery/src/core/DOMEval.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/access.js b/node_modules/jquery/src/core/access.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/camelCase.js b/node_modules/jquery/src/core/camelCase.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/init.js b/node_modules/jquery/src/core/init.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/isAttached.js b/node_modules/jquery/src/core/isAttached.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/nodeName.js b/node_modules/jquery/src/core/nodeName.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/parseHTML.js b/node_modules/jquery/src/core/parseHTML.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/parseXML.js b/node_modules/jquery/src/core/parseXML.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/ready-no-deferred.js b/node_modules/jquery/src/core/ready-no-deferred.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/ready.js b/node_modules/jquery/src/core/ready.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/readyException.js b/node_modules/jquery/src/core/readyException.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/stripAndCollapse.js b/node_modules/jquery/src/core/stripAndCollapse.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/support.js b/node_modules/jquery/src/core/support.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/toType.js b/node_modules/jquery/src/core/toType.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/core/var/rsingleTag.js b/node_modules/jquery/src/core/var/rsingleTag.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css.js b/node_modules/jquery/src/css.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/addGetHookIf.js b/node_modules/jquery/src/css/addGetHookIf.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/adjustCSS.js b/node_modules/jquery/src/css/adjustCSS.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/curCSS.js b/node_modules/jquery/src/css/curCSS.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/finalPropName.js b/node_modules/jquery/src/css/finalPropName.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/hiddenVisibleSelectors.js b/node_modules/jquery/src/css/hiddenVisibleSelectors.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/showHide.js b/node_modules/jquery/src/css/showHide.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/support.js b/node_modules/jquery/src/css/support.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/var/cssExpand.js b/node_modules/jquery/src/css/var/cssExpand.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/var/getStyles.js b/node_modules/jquery/src/css/var/getStyles.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/var/isHiddenWithinTree.js b/node_modules/jquery/src/css/var/isHiddenWithinTree.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/var/rboxStyle.js b/node_modules/jquery/src/css/var/rboxStyle.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/var/rnumnonpx.js b/node_modules/jquery/src/css/var/rnumnonpx.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/css/var/swap.js b/node_modules/jquery/src/css/var/swap.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/data.js b/node_modules/jquery/src/data.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/data/Data.js b/node_modules/jquery/src/data/Data.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/data/var/acceptData.js b/node_modules/jquery/src/data/var/acceptData.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/data/var/dataPriv.js b/node_modules/jquery/src/data/var/dataPriv.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/data/var/dataUser.js b/node_modules/jquery/src/data/var/dataUser.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/deferred.js b/node_modules/jquery/src/deferred.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/deferred/exceptionHook.js b/node_modules/jquery/src/deferred/exceptionHook.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/deprecated.js b/node_modules/jquery/src/deprecated.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/deprecated/ajax-event-alias.js b/node_modules/jquery/src/deprecated/ajax-event-alias.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/deprecated/event.js b/node_modules/jquery/src/deprecated/event.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/dimensions.js b/node_modules/jquery/src/dimensions.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/effects.js b/node_modules/jquery/src/effects.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/effects/Tween.js b/node_modules/jquery/src/effects/Tween.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/effects/animatedSelector.js b/node_modules/jquery/src/effects/animatedSelector.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/event.js b/node_modules/jquery/src/event.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/event/focusin.js b/node_modules/jquery/src/event/focusin.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/event/support.js b/node_modules/jquery/src/event/support.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/event/trigger.js b/node_modules/jquery/src/event/trigger.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/exports/amd.js b/node_modules/jquery/src/exports/amd.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/exports/global.js b/node_modules/jquery/src/exports/global.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/jquery.js b/node_modules/jquery/src/jquery.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation.js b/node_modules/jquery/src/manipulation.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation/_evalUrl.js b/node_modules/jquery/src/manipulation/_evalUrl.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation/buildFragment.js b/node_modules/jquery/src/manipulation/buildFragment.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation/getAll.js b/node_modules/jquery/src/manipulation/getAll.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation/setGlobalEval.js b/node_modules/jquery/src/manipulation/setGlobalEval.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation/support.js b/node_modules/jquery/src/manipulation/support.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation/var/rscriptType.js b/node_modules/jquery/src/manipulation/var/rscriptType.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation/var/rtagName.js b/node_modules/jquery/src/manipulation/var/rtagName.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/manipulation/wrapMap.js b/node_modules/jquery/src/manipulation/wrapMap.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/offset.js b/node_modules/jquery/src/offset.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/queue.js b/node_modules/jquery/src/queue.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/queue/delay.js b/node_modules/jquery/src/queue/delay.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/selector-native.js b/node_modules/jquery/src/selector-native.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/selector-sizzle.js b/node_modules/jquery/src/selector-sizzle.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/selector.js b/node_modules/jquery/src/selector.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/serialize.js b/node_modules/jquery/src/serialize.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/traversing.js b/node_modules/jquery/src/traversing.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/traversing/findFilter.js b/node_modules/jquery/src/traversing/findFilter.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/traversing/var/dir.js b/node_modules/jquery/src/traversing/var/dir.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/traversing/var/rneedsContext.js b/node_modules/jquery/src/traversing/var/rneedsContext.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/traversing/var/siblings.js b/node_modules/jquery/src/traversing/var/siblings.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/ObjectFunctionString.js b/node_modules/jquery/src/var/ObjectFunctionString.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/arr.js b/node_modules/jquery/src/var/arr.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/class2type.js b/node_modules/jquery/src/var/class2type.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/document.js b/node_modules/jquery/src/var/document.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/documentElement.js b/node_modules/jquery/src/var/documentElement.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/flat.js b/node_modules/jquery/src/var/flat.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/fnToString.js b/node_modules/jquery/src/var/fnToString.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/getProto.js b/node_modules/jquery/src/var/getProto.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/hasOwn.js b/node_modules/jquery/src/var/hasOwn.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/indexOf.js b/node_modules/jquery/src/var/indexOf.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/isFunction.js b/node_modules/jquery/src/var/isFunction.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/isWindow.js b/node_modules/jquery/src/var/isWindow.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/pnum.js b/node_modules/jquery/src/var/pnum.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/push.js b/node_modules/jquery/src/var/push.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/rcheckableType.js b/node_modules/jquery/src/var/rcheckableType.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/rcssNum.js b/node_modules/jquery/src/var/rcssNum.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/rnothtmlwhite.js b/node_modules/jquery/src/var/rnothtmlwhite.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/slice.js b/node_modules/jquery/src/var/slice.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/support.js b/node_modules/jquery/src/var/support.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/var/toString.js b/node_modules/jquery/src/var/toString.js old mode 100755 new mode 100644 diff --git a/node_modules/jquery/src/wrap.js b/node_modules/jquery/src/wrap.js old mode 100755 new mode 100644 diff --git a/objects/Configuration.php b/objects/Configuration.php old mode 100755 new mode 100644 diff --git a/objects/Encoder.php b/objects/Encoder.php old mode 100755 new mode 100644 diff --git a/objects/Format.php b/objects/Format.php old mode 100755 new mode 100644 diff --git a/objects/Login.php b/objects/Login.php old mode 100755 new mode 100644 diff --git a/objects/Object.php b/objects/Object.php old mode 100755 new mode 100644 diff --git a/objects/ServerMonitor.php b/objects/ServerMonitor.php old mode 100755 new mode 100644 diff --git a/objects/Streamer.php b/objects/Streamer.php old mode 100755 new mode 100644 diff --git a/objects/Upload.php b/objects/Upload.php old mode 100755 new mode 100644 diff --git a/objects/createSpiritsFromVideo.php b/objects/createSpiritsFromVideo.php old mode 100755 new mode 100644 diff --git a/objects/functions.php b/objects/functions.php old mode 100755 new mode 100644 diff --git a/objects/getImage.php b/objects/getImage.php old mode 100755 new mode 100644 diff --git a/objects/getImageMP4.php b/objects/getImageMP4.php old mode 100755 new mode 100644 diff --git a/objects/getLinkInfo.json.php b/objects/getLinkInfo.json.php old mode 100755 new mode 100644 diff --git a/objects/getSpiritsFromVideo.php b/objects/getSpiritsFromVideo.php old mode 100755 new mode 100644 diff --git a/objects/include_config.php b/objects/include_config.php old mode 100755 new mode 100644 diff --git a/objects/login.json.php b/objects/login.json.php old mode 100755 new mode 100644 diff --git a/objects/logoff.json.php b/objects/logoff.json.php old mode 100755 new mode 100644 diff --git a/objects/security.php b/objects/security.php old mode 100755 new mode 100644 diff --git a/package-lock.json b/package-lock.json old mode 100755 new mode 100644 diff --git a/package.json b/package.json old mode 100755 new mode 100644 diff --git a/update/update.php b/update/update.php old mode 100755 new mode 100644 diff --git a/update/updateDb.v2.0.sql b/update/updateDb.v2.0.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v2.1.sql b/update/updateDb.v2.1.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v2.2.sql b/update/updateDb.v2.2.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v2.3.sql b/update/updateDb.v2.3.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v2.4.sql b/update/updateDb.v2.4.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v2.5.sql b/update/updateDb.v2.5.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v2.6.sql b/update/updateDb.v2.6.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.0.sql b/update/updateDb.v3.0.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.2.sql b/update/updateDb.v3.2.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.3.sql b/update/updateDb.v3.3.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.4.sql b/update/updateDb.v3.4.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.5.sql b/update/updateDb.v3.5.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.6.sql b/update/updateDb.v3.6.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.7.sql b/update/updateDb.v3.7.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.8.sql b/update/updateDb.v3.8.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v3.9.sql b/update/updateDb.v3.9.sql old mode 100755 new mode 100644 diff --git a/update/updateDb.v4.0.sql b/update/updateDb.v4.0.sql old mode 100755 new mode 100644 diff --git a/view/bootgrid/jquery.bootgrid.css b/view/bootgrid/jquery.bootgrid.css old mode 100755 new mode 100644 diff --git a/view/bootgrid/jquery.bootgrid.fa.js b/view/bootgrid/jquery.bootgrid.fa.js old mode 100755 new mode 100644 diff --git a/view/bootgrid/jquery.bootgrid.fa.min.js b/view/bootgrid/jquery.bootgrid.fa.min.js old mode 100755 new mode 100644 diff --git a/view/bootgrid/jquery.bootgrid.js b/view/bootgrid/jquery.bootgrid.js old mode 100755 new mode 100644 diff --git a/view/bootgrid/jquery.bootgrid.min.css b/view/bootgrid/jquery.bootgrid.min.css old mode 100755 new mode 100644 diff --git a/view/bootgrid/jquery.bootgrid.min.js b/view/bootgrid/jquery.bootgrid.min.js old mode 100755 new mode 100644 diff --git a/view/css/style.css b/view/css/style.css old mode 100755 new mode 100644 diff --git a/view/deleteQueue.php b/view/deleteQueue.php old mode 100755 new mode 100644 diff --git a/view/img/OnAir.jpg b/view/img/OnAir.jpg old mode 100755 new mode 100644 diff --git a/view/img/OnAir.png b/view/img/OnAir.png old mode 100755 new mode 100644 diff --git a/view/img/OnAir.psd b/view/img/OnAir.psd old mode 100755 new mode 100644 diff --git a/view/img/countdown.mp4 b/view/img/countdown.mp4 old mode 100755 new mode 100644 diff --git a/view/img/creatingImages.jpg b/view/img/creatingImages.jpg old mode 100755 new mode 100644 diff --git a/view/img/favicon.ico b/view/img/favicon.ico old mode 100755 new mode 100644 diff --git a/view/img/favicon.png b/view/img/favicon.png old mode 100755 new mode 100644 diff --git a/view/img/logo.png b/view/img/logo.png old mode 100755 new mode 100644 diff --git a/view/img/logo.psd b/view/img/logo.psd old mode 100755 new mode 100644 diff --git a/view/img/notfound.gif b/view/img/notfound.gif old mode 100755 new mode 100644 diff --git a/view/img/notfound.jpg b/view/img/notfound.jpg old mode 100755 new mode 100644 diff --git a/view/index.php b/view/index.php old mode 100755 new mode 100644 diff --git a/view/index_configurations.php b/view/index_configurations.php old mode 100755 new mode 100644 diff --git a/view/index_formats.php b/view/index_formats.php old mode 100755 new mode 100644 diff --git a/view/index_shareVideos.php b/view/index_shareVideos.php old mode 100755 new mode 100644 diff --git a/view/isAdmin.php b/view/isAdmin.php old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/cors/postmessage.html b/view/jquery-file-upload/cors/postmessage.html old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/cors/result.html b/view/jquery-file-upload/cors/result.html old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/css/jquery-ui-demo-ie8.css b/view/jquery-file-upload/css/jquery-ui-demo-ie8.css old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/css/jquery-ui-demo.css b/view/jquery-file-upload/css/jquery-ui-demo.css old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/css/jquery.fileupload-noscript.css b/view/jquery-file-upload/css/jquery.fileupload-noscript.css old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/css/jquery.fileupload-ui-noscript.css b/view/jquery-file-upload/css/jquery.fileupload-ui-noscript.css old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/css/jquery.fileupload-ui.css b/view/jquery-file-upload/css/jquery.fileupload-ui.css old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/css/jquery.fileupload.css b/view/jquery-file-upload/css/jquery.fileupload.css old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/css/style.css b/view/jquery-file-upload/css/style.css old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/form.php b/view/jquery-file-upload/form.php old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/img/loading.gif b/view/jquery-file-upload/img/loading.gif old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/img/progressbar.gif b/view/jquery-file-upload/img/progressbar.gif old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/app.js b/view/jquery-file-upload/js/app.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/cors/jquery.postmessage-transport.js b/view/jquery-file-upload/js/cors/jquery.postmessage-transport.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/cors/jquery.xdr-transport.js b/view/jquery-file-upload/js/cors/jquery.xdr-transport.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload-angular.js b/view/jquery-file-upload/js/jquery.fileupload-angular.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload-audio.js b/view/jquery-file-upload/js/jquery.fileupload-audio.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload-image.js b/view/jquery-file-upload/js/jquery.fileupload-image.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload-jquery-ui.js b/view/jquery-file-upload/js/jquery.fileupload-jquery-ui.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload-process.js b/view/jquery-file-upload/js/jquery.fileupload-process.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload-ui.js b/view/jquery-file-upload/js/jquery.fileupload-ui.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload-validate.js b/view/jquery-file-upload/js/jquery.fileupload-validate.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload-video.js b/view/jquery-file-upload/js/jquery.fileupload-video.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.fileupload.js b/view/jquery-file-upload/js/jquery.fileupload.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/jquery.iframe-transport.js b/view/jquery-file-upload/js/jquery.iframe-transport.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/main.js b/view/jquery-file-upload/js/main.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/js/vendor/jquery.ui.widget.js b/view/jquery-file-upload/js/vendor/jquery.ui.widget.js old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/server/php/Dockerfile b/view/jquery-file-upload/server/php/Dockerfile old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/server/php/UploadHandler.php b/view/jquery-file-upload/server/php/UploadHandler.php old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/server/php/docker-compose.yml b/view/jquery-file-upload/server/php/docker-compose.yml old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/server/php/fileuploadchunkdone.php b/view/jquery-file-upload/server/php/fileuploadchunkdone.php old mode 100755 new mode 100644 diff --git a/view/jquery-file-upload/server/php/index.php b/view/jquery-file-upload/server/php/index.php old mode 100755 new mode 100644 diff --git a/view/js/canvas-to-blob.min.js b/view/js/canvas-to-blob.min.js old mode 100755 new mode 100644 diff --git a/view/js/canvas-to-blob.min.js.map b/view/js/canvas-to-blob.min.js.map old mode 100755 new mode 100644 diff --git a/view/js/jquery.blueimp-gallery.min.js b/view/js/jquery.blueimp-gallery.min.js old mode 100755 new mode 100644 diff --git a/view/js/jquery.blueimp-gallery.min.js.map b/view/js/jquery.blueimp-gallery.min.js.map old mode 100755 new mode 100644 diff --git a/view/js/load-image.all.min.js b/view/js/load-image.all.min.js old mode 100755 new mode 100644 diff --git a/view/js/load-image.all.min.js.map b/view/js/load-image.all.min.js.map old mode 100755 new mode 100644 diff --git a/view/js/main.js b/view/js/main.js old mode 100755 new mode 100644 diff --git a/view/js/polyfill.min.js b/view/js/polyfill.min.js old mode 100755 new mode 100644 diff --git a/view/js/tmpl.min.js b/view/js/tmpl.min.js old mode 100755 new mode 100644 diff --git a/view/js/tmpl.min.js.map b/view/js/tmpl.min.js.map old mode 100755 new mode 100644 diff --git a/view/listFiles.json.php b/view/listFiles.json.php old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/assets/css/style.css b/view/mini-upload-form/assets/css/style.css old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/assets/img/border-image.png b/view/mini-upload-form/assets/img/border-image.png old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/assets/img/icons.png b/view/mini-upload-form/assets/img/icons.png old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/assets/js/jquery.fileupload.js b/view/mini-upload-form/assets/js/jquery.fileupload.js old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/assets/js/jquery.iframe-transport.js b/view/mini-upload-form/assets/js/jquery.iframe-transport.js old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/assets/js/jquery.knob.js b/view/mini-upload-form/assets/js/jquery.knob.js old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/assets/js/jquery.ui.widget.js b/view/mini-upload-form/assets/js/jquery.ui.widget.js old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/assets/js/script.js b/view/mini-upload-form/assets/js/script.js old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/form.php b/view/mini-upload-form/form.php old mode 100755 new mode 100644 diff --git a/view/mini-upload-form/index.php b/view/mini-upload-form/index.php old mode 100755 new mode 100644 diff --git a/view/priority.php b/view/priority.php old mode 100755 new mode 100644 diff --git a/view/queue.json.php b/view/queue.json.php old mode 100755 new mode 100644 diff --git a/view/queue.php b/view/queue.php old mode 100755 new mode 100644 diff --git a/view/releaseDate.php b/view/releaseDate.php old mode 100755 new mode 100644 diff --git a/view/removeStreamer.php b/view/removeStreamer.php old mode 100755 new mode 100644 diff --git a/view/run.php b/view/run.php old mode 100755 new mode 100644 diff --git a/view/saveConfig.php b/view/saveConfig.php old mode 100755 new mode 100644 diff --git a/view/send.json.php b/view/send.json.php old mode 100755 new mode 100644 diff --git a/view/status.php b/view/status.php old mode 100755 new mode 100644 diff --git a/view/streamers.json.php b/view/streamers.json.php old mode 100755 new mode 100644 diff --git a/view/upload.php b/view/upload.php old mode 100755 new mode 100644 diff --git a/view/videosListEPG.php b/view/videosListEPG.php old mode 100755 new mode 100644 diff --git a/view/videosListToLive.php b/view/videosListToLive.php old mode 100755 new mode 100644 diff --git a/view/watermark.php b/view/watermark.php old mode 100755 new mode 100644 diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php old mode 100755 new mode 100644 From 329f22ea7847c23859cd8e2d9e3e82efa3cc2dc0 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 1 Mar 2023 12:57:07 -0300 Subject: [PATCH 008/416] updates --- objects/include_config.php | 13 ++++++------- view/css/style.css | 32 +++++++++++++++++++++++++------- view/encodeProgressTemplate.html | 17 +++++++++++++++++ view/index.php | 20 ++++++++++++-------- 4 files changed, 60 insertions(+), 22 deletions(-) create mode 100644 view/encodeProgressTemplate.html diff --git a/objects/include_config.php b/objects/include_config.php index e2762e068..f8f3fbd8c 100644 --- a/objects/include_config.php +++ b/objects/include_config.php @@ -1,16 +1,15 @@ .progress-type { - position: absolute; - left: 0px; - font-weight: 800; - padding: 3px 30px 2px 10px; - color: rgb(255, 255, 255); - background-color: rgba(25, 25, 25, 0.2); + color: #FFF; + text-shadow: 0px 0px 5px #000; + padding: 3px 10px 2px !important; + white-space: nowrap; /* Prevents the text from wrapping */ + overflow: hidden; /* Hides the overflowing text */ + text-overflow: ellipsis; /* Adds the ellipsis to the end of the text */ } .progress>.progress-completed { position: absolute; right: 0px; font-weight: 800; - padding: 3px 10px 2px; + padding: 3px 10px 2px !important; + text-align: right; + color: #000; + text-shadow: 0px 0px 5px #FFF; } .progress-bar { diff --git a/view/encodeProgressTemplate.html b/view/encodeProgressTemplate.html new file mode 100644 index 000000000..38cdc6ac7 --- /dev/null +++ b/view/encodeProgressTemplate.html @@ -0,0 +1,17 @@ +
    + {site} +
    +
    + 0% Complete +
    + + Priority {priority} {title} + + {name} +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/view/index.php b/view/index.php index d1803d8c1..61c414ee4 100644 --- a/view/index.php +++ b/view/index.php @@ -716,7 +716,7 @@ function setEncodingProgress(id, progress, text) { } else if (progress > 100) { progress = 100; } - $(selector).find('.progress-completed').html("" + text + " " + progress + '%'); + $(selector).find('.progress-completed').html("" + text + " " + progress + '%'); $(selector).find('.progress-bar').css({ 'width': progress + '%' }); @@ -811,6 +811,7 @@ function checkProgress() { } var checkProgressRemoveTimeout = []; + var createQueueTemplate = ; function createQueueItem(queueItem, queueItemAfter) { clearTimeout(checkProgressRemoveTimeout[queueItem.id]); @@ -818,13 +819,16 @@ function createQueueItem(queueItem, queueItemAfter) { return false; } console.log(queueItemAfter); - var item = '
    '; - item += '' + queueItem.streamer_site + ''; - item += '
    '; - item += '
    '; - item += '0% Complete
    Priority ' + queueItem.streamer_priority + ' ' + queueItem.title + '' + queueItem.name + ''; - item += '
    '; - item += '
    '; + + var itemsArray = {}; + itemsArray.id = queueItem.id; + itemsArray.site = queueItem.streamer_site; + itemsArray.priority = queueItem.streamer_priority; + itemsArray.title = queueItem.title; + itemsArray.name = queueItem.name; + + var item = arrayToTemplate(itemsArray, createQueueTemplate); + if (typeof queueItemAfter === 'undefined' || !$("#" + queueItemAfter.id).length) { $("#encoding").append(item); } else { From 434b32f2aeb7ede52c0839b0c127cd10e7529730 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 1 Mar 2023 13:14:23 -0300 Subject: [PATCH 009/416] logs --- objects/include_config.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/include_config.php b/objects/include_config.php index f8f3fbd8c..ac1055c08 100644 --- a/objects/include_config.php +++ b/objects/include_config.php @@ -1,7 +1,7 @@ Date: Thu, 2 Mar 2023 11:12:50 -0300 Subject: [PATCH 010/416] fix --- objects/Encoder.php | 2 +- objects/include_config.php | 4 ++-- view/queue.json.php | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 1a6e7653c..8e95bdf98 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -518,7 +518,7 @@ static function getYoutubeDl($videoURL, $queue_id, $destinationFile) $videoURL = escapeshellarg($videoURL); $tmpfname = _get_temp_file('youtubeDl'); //$cmd = "youtube-dl -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; + $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]/mp4' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; error_log("getYoutubeDl: Getting from Youtube DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); diff --git a/objects/include_config.php b/objects/include_config.php index ac1055c08..5270034c3 100644 --- a/objects/include_config.php +++ b/objects/include_config.php @@ -1,13 +1,13 @@ $value) { $f = new Format($rows[$key]['formats_id']); $rows[$key]['format'] = $f->getName(); From f25e6cc52879da1dab12754f1fc1a23a850fb14c Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 2 Mar 2023 11:24:41 -0300 Subject: [PATCH 011/416] updates --- objects/Encoder.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 8e95bdf98..30e57ee73 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -453,8 +453,14 @@ static function downloadFile($queue_id) if (!empty($q->getVideoDownloadedLink())) { //begin youtube-dl downloading and symlink it to the video temp file $response = static::getYoutubeDl($q->getVideoDownloadedLink(), $queue_id, $obj->pathFileName); - error_log("downloadFile:getYoutubeDl queue_id = {$queue_id}"); - $obj->error = false; + if(!empty($response)){ + error_log("downloadFile:getYoutubeDl SUCCESS queue_id = {$queue_id}"); + $obj->pathFileName = $response; + $obj->error = false; + }else{ + error_log("downloadFile:getYoutubeDl ERROR queue_id = {$queue_id}"); + $obj->error = false; + } } else { error_log("downloadFile: not using getYoutubeDl"); //symlink the downloaded file to the video temp file ($obj-pathFileName) @@ -560,8 +566,11 @@ static function getYoutubeDl($videoURL, $queue_id, $destinationFile) // the file is just symlinked //////symlink($file, $destinationFile); ////// symlink not allowed without apache configuration - _rename($file, $destinationFile); - return $file; + if(_rename($file, $destinationFile)){ + return $destinationFile; + }else{ + return $file; + } } static function getYoutubeDlProgress($queue_id) From ba54bead6f9a77ee575f1946d281b93bcba319c0 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 2 Mar 2023 11:49:06 -0300 Subject: [PATCH 012/416] debug --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 30e57ee73..c7e2ad637 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -526,7 +526,7 @@ static function getYoutubeDl($videoURL, $queue_id, $destinationFile) //$cmd = "youtube-dl -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]/mp4' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; - error_log("getYoutubeDl: Getting from Youtube DL {$cmd}"); + error_log("getYoutubeDl: Getting from Youtube DL {$cmd} ". json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); if ($return_val !== 0) { //echo "\n**ERROR Youtube DL **".$code . "\n" . print_r($output, true); From df06b63d3521e9748acf982a600b4151116956df Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 2 Mar 2023 11:59:33 -0300 Subject: [PATCH 013/416] fix --- objects/Encoder.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index c7e2ad637..22ece2243 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -493,12 +493,12 @@ static function downloadFile($queue_id) } else { $obj->error = true; } - if ($response || $obj->error) { + if ($obj->error) { $destination = "{$dstFilepath}{$filename}"; //error_log("downloadFile: error"); $obj->msg = "Could not save file {$url} in $destination"; - $response = static::getYoutubeDl($url, $queue_id, $destination); error_log("downloadFile: trying getYoutubeDl queue_id = {$queue_id}"); + $response = static::getYoutubeDl($url, $queue_id, $destination); $obj->error = !file_exists($destination); } error_log("downloadFile: " . json_encode($obj)); From d8fa446806f479776507555a955442788c072a78 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 2 Mar 2023 14:58:28 -0300 Subject: [PATCH 014/416] fix --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 22ece2243..f6734c4ee 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -524,7 +524,7 @@ static function getYoutubeDl($videoURL, $queue_id, $destinationFile) $videoURL = escapeshellarg($videoURL); $tmpfname = _get_temp_file('youtubeDl'); //$cmd = "youtube-dl -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]/mp4' {$videoURL}"; + $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; error_log("getYoutubeDl: Getting from Youtube DL {$cmd} ". json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); From 8886582873d41a66a1e8116d884a961ed11695f4 Mon Sep 17 00:00:00 2001 From: KrzysioMisio <93145787+KrzysioMisio@users.noreply.github.com> Date: Fri, 3 Mar 2023 15:13:58 +0100 Subject: [PATCH 015/416] update These changes helped me --- view/index.php | 65 +++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/view/index.php b/view/index.php index 61c414ee4..b6558f00c 100644 --- a/view/index.php +++ b/view/index.php @@ -53,9 +53,9 @@ Encoder - - - + + + @@ -71,22 +71,22 @@ - - + + - - " rel="stylesheet" type="text/css" /> + + - + @@ -123,7 +123,7 @@ siteLogo)) { ?> - + @@ -277,7 +277,7 @@ ?>
    -
    +
    + @@ -157,40 +198,40 @@
    - Please sign in +
    - +
    - +
    - +
    - +
    - +
    - +
    - +
    @@ -223,14 +264,14 @@ success: function(response) { if (response.error) { modal.hidePleaseWait(); - swal("Sorry!", response.error, "error"); + swal("", response.error, "error"); } else if (!response.streamer) { modal.hidePleaseWait(); - swal("Sorry!", "We could not find your streamer site!", "error"); + swal("", "", "error"); } else if (!response.isLogged) { modal.hidePleaseWait(); - swal("Sorry!", "Your user or password is wrong!", "error"); + swal("", "", "error"); } else { var url = new URL(document.location); url.searchParams.append('justLogin', 1); @@ -281,13 +322,13 @@
    @@ -386,14 +427,14 @@ function loadUserGroups() { if (empty($advancedCustom->doNotAllowEncoderOverwriteStatus)) { ?>
    -
    Override status
    +
    @@ -403,11 +444,11 @@ function loadUserGroups() { if (empty($advancedCustom->doNotAllowUpdateVideoId)) { ?>
    -
    Update existing video
    +
    - - + +
    @@ -459,7 +500,7 @@ function loadUserGroups() { if (empty($advancedCustom->showOnlyEncoderAutomaticResolutions)) { ?>
    -
    Resolutions
    +
    doNotShowEncoderHLS)) { @@ -467,7 +508,7 @@ function loadUserGroups() {
    doNotShowEncoderHLS)) echo 'checked="checked"'; ?> class="mp4Checkbox" onclick="if ($(this).is(':checked')) { $('#inputHLS').prop('checked', false); - }" /> Low + }" /> doNotShowEncoderHLS)) echo 'checked="checked"'; ?> class="mp4Checkbox" onclick="if ($(this).is(':checked')) { $('#inputHLS').prop('checked', false); - }" /> SD + }" /> doNotShowEncoderHLS)) echo 'checked="checked"'; ?> class="mp4Checkbox" onclick="if ($(this).is(':checked')) { $('#inputHLS').prop('checked', false); - }" /> HD + }" />
    -
    Advanced
    +
    doNotShowExtractAudio)) { ?>
    doNotShowCreateVideoSpectrum)) { ?>
    -
    Streamer info
    +

    - User:
    + :
    @@ -560,13 +601,12 @@ function loadUserGroups() { if (empty($_POST['updateFile'])) { ?> class="nav-item active " class="nav-item " - class="nav-item " > - Sharing Queue +
  • class="nav-item " > - Update +
  • @@ -590,7 +630,7 @@ function loadUserGroups() { } ?> - Title - Status - Dates + + + @@ -623,10 +663,10 @@ function loadUserGroups() { - - - - + + + + @@ -663,7 +703,7 @@ function checkFiles() { for (i = 0; i < response.length; i++) { if (!response[i]) continue; - $('#files').append('
  • ' + response[i].name + '
  • '); + $('#files').append('
  • ' + response[i].name + '
  • '); } } } @@ -684,13 +724,13 @@ function setDownloadProgress(id, progress, setText) { } else if (progress > 100) { progress = 100; } - var text = "Downloading " + progress + '%'; + var text = " " + progress + '%'; if (progress < 100) { $(selector).addClass('active'); $(selector).find('.progress-bar').removeClass('progress-bar-success'); $(selector).find('.progress-bar').addClass('progress-bar-danger'); } else { - text = "Downloaded"; + text = ""; $(selector).removeClass('active'); $(selector).find('.progress-bar').removeClass('progress-bar-danger'); $(selector).find('.progress-bar').addClass('progress-bar-success'); @@ -773,7 +813,7 @@ function checkProgress() { for (i = 0; i < encodingNowIds.length; i++) { var id = encodingNowIds[i]; - var text = response.encoding[i].name + " [Downloading ...]"; + var text = response.encoding[i].name + " [ ...]"; if (response.download_status[i] && response.encoding_status[i].progress) { text = response.encoding[i].name + " [" + response.encoding_status[i].from + " to " + response.encoding_status[i].to + "] " + response.encoding_status[i].remainTimeHuman; } @@ -828,7 +868,7 @@ function createQueueItem(queueItem, queueItemAfter) { itemsArray.name = queueItem.name; var item = arrayToTemplate(itemsArray, createQueueTemplate); - + if (typeof queueItemAfter === 'undefined' || !$("#" + queueItemAfter.id).length) { $("#encoding").append(item); } else { @@ -878,7 +918,7 @@ function removeQueueItem(id) { success: function(response) { $('#max_file_size').text(response.max_file_size); streamerMaxFileSize = response.file_upload_max_size; - $('#currentStorageUsage').text((response.currentStorageUsage / 60).toFixed(2) + " Minutes"); + $('#currentStorageUsage').text((response.currentStorageUsage / 60).toFixed(2) + " "); } }); @@ -1018,14 +1058,14 @@ function removeQueueItem(id) { var return_vars = JSON.parse(row.return_vars); if (row.status != 'queue' && row.status != 'encoding') { - reQueue = '' + reQueue = '' } - deleteQueue = '' + deleteQueue = '' if (row.status === 'done' || row.status === 'transferring') { - sendFileQueue = '' + sendFileQueue = '' } if (return_vars.videos_id) { - edit = '' + edit = '' } return edit + sendFileQueue + reQueue + deleteQueue; @@ -1034,7 +1074,7 @@ function removeQueueItem(id) { return "Created: " + row.created + "
    Modified: " + row.modified; }, "status": function(column, row) { - var btn = ' '; + var btn = ' '; var label = "warning"; if (row.status == "error") { label = "danger"; @@ -1061,7 +1101,7 @@ function removeQueueItem(id) { if (typeof json.videos_id !== 'undefined') { videos_id = json.videos_id; } - var title = '[' + videos_id + '] ' + l.hostname + ' Priority ' + row.priority + ''; + var title = '[' + videos_id + '] ' + l.hostname + ' ' + row.priority + ''; title += '
    ' + row.format + ''; for (const index in row.fileInfo) { @@ -1176,13 +1216,13 @@ function removeQueueItem(id) { }, "admin": function(column, row) { var tag = ""; return tag; }, "commands": function(column, row) { - var deleteBtn = ''; + var deleteBtn = ''; return deleteBtn; } @@ -1255,10 +1295,10 @@ function submitDownloadForm() { if (Login::canBulkEncode()) { ?> var span = document.createElement("span"); - span.innerHTML = "This is a Channel, are you sure you want to download all videos on this channel?
    It may take a while to complete
    Start Index:
    End Index: "; + span.innerHTML = "

    Start Index:
    End Index: "; swal({ - title: "Are you sure?", + title: "", content: span, icon: "warning", buttons: true, @@ -1299,13 +1339,13 @@ function submitDownloadForm() { type: 'post', success: function(response) { if (response.text) { - avideoAlertSuccess("All your videos were imported"); + avideoAlertSuccess(""); } console.log(response); } }); setTimeout(function() { - avideoAlertInfo("All your videos channel will be process, this may take a while to be complete"); + avideoAlertInfo(""); }, 500); modal.hidePleaseWait(); } @@ -1313,7 +1353,7 @@ function submitDownloadForm() { - avideoAlertError("Channel Import is disabled"); + avideoAlertError(""); From 5cc4ffe9a6e9fcefe953c04c9a9b2f39bbc72884 Mon Sep 17 00:00:00 2001 From: KrzysioMisio <93145787+KrzysioMisio@users.noreply.github.com> Date: Fri, 17 Mar 2023 15:27:02 +0100 Subject: [PATCH 030/416] translation --- view/index_configurations.php | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/view/index_configurations.php b/view/index_configurations.php index 2064354a7..744dab012 100644 --- a/view/index_configurations.php +++ b/view/index_configurations.php @@ -17,8 +17,8 @@ ?>
    [] - -
    + + @@ -26,7 +26,7 @@
    - +
    - Please upgrade to enable this feature +
    + ?>
    - - + +
    - + checked="true"> - Will remove queue and the files when the encoder process is done + + checked="true" /> +
    - +
    \ No newline at end of file +?> From bee4aba8604f0229726af5725d5d46fc500e00d0 Mon Sep 17 00:00:00 2001 From: KrzysioMisio <93145787+KrzysioMisio@users.noreply.github.com> Date: Fri, 17 Mar 2023 15:28:24 +0100 Subject: [PATCH 031/416] translation --- view/index_shareVideos.php | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/view/index_shareVideos.php b/view/index_shareVideos.php index f173d329c..eccd43e95 100644 --- a/view/index_shareVideos.php +++ b/view/index_shareVideos.php @@ -1,5 +1,5 @@ -
    +
    showOnlyEncoderAutomaticResolutions)) { @@ -7,24 +7,24 @@ } ?>
    -
    +
    @@ -39,15 +39,15 @@ ?>
    - Share videos from YouTube and a few more sites. + .
    - +
    @@ -64,7 +64,7 @@
    + @@ -150,7 +150,7 @@ function reloadIfIsNotEditingCategory() {
    - - + + " . __($value) . ""; } ?> - + " . __($value) . ""; } ?> - + - +
    - - " value='' required> + +
    \ No newline at end of file + From dfcfb7fd1ba62df81ac7e44895aa9c25156cccf5 Mon Sep 17 00:00:00 2001 From: KrzysioMisio <93145787+KrzysioMisio@users.noreply.github.com> Date: Fri, 17 Mar 2023 15:33:34 +0100 Subject: [PATCH 033/416] translation --- view/mini-upload-form/form.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/view/mini-upload-form/form.php b/view/mini-upload-form/form.php index a2840565f..321a256b5 100644 --- a/view/mini-upload-form/form.php +++ b/view/mini-upload-form/form.php @@ -1,10 +1,10 @@
    - +
    - +
    categories)) { @@ -13,7 +13,7 @@
    @@ -75,4 +75,4 @@ function reloadIfIsNotEditingCategory() { - \ No newline at end of file + From cb107aca889755089187a2b491772d2af973654a Mon Sep 17 00:00:00 2001 From: KrzysioMisio <93145787+KrzysioMisio@users.noreply.github.com> Date: Fri, 17 Mar 2023 15:35:06 +0100 Subject: [PATCH 034/416] translation --- view/jquery-file-upload/form.php | 40 ++++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/view/jquery-file-upload/form.php b/view/jquery-file-upload/form.php index 67b961adb..bf375796c 100644 --- a/view/jquery-file-upload/form.php +++ b/view/jquery-file-upload/form.php @@ -1,9 +1,9 @@
    - +
    - +
    categories)) { ?>
    - - - -
    - - + + + +
    +
    + + +
    + +
    - + @@ -600,9 +707,9 @@ function loadUserGroups() {
  • class="nav-item active " class="nav-item " > + } else { + ?> class="nav-item " >
  • class="nav-item active " class="nav-item " > + } else { + ?> class="nav-item " > @@ -851,7 +958,7 @@ function checkProgress() { } var checkProgressRemoveTimeout = []; - var createQueueTemplate = ; + var createQueueTemplate = ; function createQueueItem(queueItem, queueItemAfter) { clearTimeout(checkProgressRemoveTimeout[queueItem.id]); @@ -1412,4 +1519,4 @@ function resetAutocompleteVideosID() { - + \ No newline at end of file From 898b93a17f5392e19d1baa82e719546f234c2a51 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 20 Mar 2023 09:14:00 -0300 Subject: [PATCH 039/416] wrong files --- view/index.php | 89 -------------------------------------------------- 1 file changed, 89 deletions(-) diff --git a/view/index.php b/view/index.php index 8ffd6f038..3dfc398ff 100644 --- a/view/index.php +++ b/view/index.php @@ -174,95 +174,6 @@ function changeLang() {
  • -
    -
  • +
    + + + +
  • + @@ -620,7 +621,7 @@ function loadUserGroups() { ?> class="nav-item active " class="nav-item " > + } ?>>
    + ?> + if (isPHP("5.6")) { + ?>
    PHP is Present -
    +
    + } else { + ?>
    Your PHP version is , you must install PHP 5.6.x or greater -
    +
    + } + ?> + if ($exifTool = isExifToo()) { + ?>
    Exiftool [] is Present -
    +
    + } else { + ?>
    Since AVideo 2.1 we use exiftool to determine if an video is landscape or portrait @@ -87,29 +87,29 @@ In order to install exiftool type the following command in the terminal:
    sudo apt install libimage-exiftool-perl
    -
    +
    + } + ?> + if ($ffmpeg = isFFMPEG()) { + ?>
    FFMPEG is Present Make sure your FFMPEG is 3.x or greater -
    +
    + } else { + ?>
    FFmpeg is not enabled, make sure your FFMPEG is 3.x or greater
    FFmpeg has been removed from Ubuntu 14.04 and was replaced by Libav. This decision has been reversed so that FFmpeg is available now in Ubuntu 15.04 again, but there is still no official package for 14.04. In this tutorial, I will show you how to install FFmpeg from mc3man ppa. Add the mc3man ppa:
    - If you are not using Ubuntu 14.x go to step 2 + If you are not using Ubuntu 14.x go to step 2

    Step 1

    sudo add-apt-repository ppa:mc3man/trusty-media

    @@ -134,22 +134,22 @@
    sudo apt-get install ffmpeg
    -
    +
    + } + ?> + if ($youtube_dl = isYoutubeDL()) { + ?>
    youtube-dl is Present -
    +
    + } else { + ?>
    youtube-dl is not enabled @@ -181,146 +181,146 @@
    0 1 * * * sudo pip install --upgrade youtube-dl
    -
    + + } + ?> + if (checkVideosDir()) { + ?>
    Your videos directory is writable -
    + + } else { + ?>
    Your videos directory must be writable
    + $dir = getPathToApplication() . "videos"; + if (!file_exists($dir)) { + ?> The video directory does not exist, AVideo had no permission to create it, you must create it manually!
    sudo mkdir 
    + } + ?>
    Then you can set the permissions (www-data means apache user).
    sudo chown www-data:www-data  && sudo chmod 755  
    -
    + + } + $pathToPHPini = php_ini_loaded_file(); + if (empty($pathToPHPini)) { + $pathToPHPini = "/etc/php/7.0/cli/php.ini"; + } + ?> + if (check_max_execution_time()) { + ?>
    Your max_execution_time is -
    + + } else { + ?>
    Your max_execution_time is , it must be at least 7200
    - Edit the php.ini file + Edit the php.ini file
    sudo nano 
    -
    + + } + ?> + if (check_post_max_size()) { + ?>
    Your post_max_size is -
    + + } else { + ?>
    Your post_max_size is , it must be at least 1000M
    - Edit the php.ini file + Edit the php.ini file
    sudo nano 
    -
    + + } + ?> + if (check_upload_max_filesize()) { + ?>
    Your upload_max_filesize is -
    + + } else { + ?>
    Your upload_max_filesize is , it must be at least 1000M
    - Edit the php.ini file + Edit the php.ini file
    sudo nano 
    -
    + + } + ?> + if (check_memory_limit()) { + ?>
    Your memory_limit is -
    + + } else { + ?>
    Your memory_limit is , it must be at least 512M
    - Edit the php.ini file + Edit the php.ini file
    sudo nano 
    -
    + + } + ?>
    @@ -364,9 +364,9 @@
    +
    @@ -441,7 +441,7 @@ $('#siteURL').keyup(function () { $('#allowedStreamers').val($(this).val()); }); - $('[data-toggle="popover"]').popover(); + $('[data-toggle="popover"]').popover(); $('#configurationForm').submit(function (evt) { evt.preventDefault(); diff --git a/install/install.php b/install/install.php index f8ec9cde7..46632c308 100644 --- a/install/install.php +++ b/install/install.php @@ -29,9 +29,9 @@ $webSiteRootURL = rtrim($webSiteRootURL, '/') . '/'; $_POST['systemRootPath'] = str_replace("install", "", getcwd()); -if(!is_dir($_POST['systemRootPath'])){ +if(!is_dir($_POST['systemRootPath'])) { $_POST['systemRootPath'] = "/var/www/html/YouPHPTube/Encoder/"; - if(!is_dir($_POST['systemRootPath'])){ + if(!is_dir($_POST['systemRootPath'])) { $_POST['systemRootPath'] = "/var/www/html/AVideo/Encoder/"; } } @@ -61,7 +61,6 @@ . " WHERE id = 1"; $global['mysqli']->query($sql); -}else{ +} else { echo PHP_EOL."File not found {$streamerConfiguration}".PHP_EOL; } - diff --git a/install/killOldProcess.php b/install/killOldProcess.php index bb3ec3603..d12c5a0b1 100644 --- a/install/killOldProcess.php +++ b/install/killOldProcess.php @@ -1,39 +1,39 @@ 100){ // 1 minute + if ($etime > 100) { // 1 minute $pid = intval($matches[1]); - if(!empty($pid)){ - echo "Killing {$pid}".PHP_EOL; + if (!empty($pid)) { + echo "Killing {$pid}" . PHP_EOL; $cmd = 'kill -9 '.$pid; echo shell_exec($cmd); continue; } } } - if(strpos($line, '-y -ss 3 -t 3') !== false){ - echo $line.PHP_EOL; + if (strpos($line, '-y -ss 3 -t 3') !== false) { + echo $line . PHP_EOL; preg_match('/([0-9]+) +([0-9:]+)/', $line, $matches); $etime = intval(str_replace(':', '', $matches[2])); - if($etime>100){ // 1 minute + if ($etime>100) { // 1 minute $pid = intval($matches[1]); - if(!empty($pid)){ - echo "Killing {$pid}".PHP_EOL; - $cmd = 'kill -9 '.$pid; + if (!empty($pid)) { + echo "Killing {$pid}" . PHP_EOL; + $cmd = 'kill -9 ' . $pid; echo shell_exec($cmd); continue; } } } -} \ No newline at end of file +} diff --git a/install/makeAdmin.php b/install/makeAdmin.php index 157d646e5..766c4ee08 100644 --- a/install/makeAdmin.php +++ b/install/makeAdmin.php @@ -2,7 +2,7 @@ //streamer config require_once '../videos/configuration.php'; -if(!isCommandLineInterface()){ +if (!isCommandLineInterface()) { return die('Command Line only'); } echo "Enter the username or press enter to skip:"; @@ -10,11 +10,11 @@ ob_flush(); $userName = trim(readline("")); -if(!empty($userName)){ - $sql = "UPDATE {$global['tablesPrefix']}streamers SET isAdmin = 1 where user = '".$userName."'"; - echo $sql.PHP_EOL; +if (!empty($userName)) { + $sql = "UPDATE {$global['tablesPrefix']}streamers SET isAdmin = 1 where user = '" . $userName . "'"; + echo $sql.PHP_EOL; $insert_row = $global['mysqli']->query($sql); - + if ($insert_row) { echo "User created".PHP_EOL; } else { @@ -24,7 +24,3 @@ echo "Bye"; echo "\n"; die(); - - - - diff --git a/install/makeEncoderPublic.php b/install/makeEncoderPublic.php index eb8c77c99..9ad4193a7 100644 --- a/install/makeEncoderPublic.php +++ b/install/makeEncoderPublic.php @@ -2,7 +2,7 @@ //streamer config require_once '../videos/configuration.php'; -if(!isCommandLineInterface()){ +if(!isCommandLineInterface()) { return die('Command Line only'); } diff --git a/install/reencodeAllVideos.php b/install/reencodeAllVideos.php index 19910f603..d779b6086 100644 --- a/install/reencodeAllVideos.php +++ b/install/reencodeAllVideos.php @@ -19,7 +19,3 @@ echo "Bye"; echo "\n"; die(); - - - - diff --git a/install/test.php b/install/test.php index c20e4fe23..b96418c53 100644 --- a/install/test.php +++ b/install/test.php @@ -13,7 +13,7 @@ 'http://4k.ypt.me/1080/Earth_from_Space.mov', 'http://4k.ypt.me/1080/Snow.mp4', 'http://4k.ypt.me/4K/Elecard_about_Tomsk_part1_HEVC_UHD.mp4', - 'https://www.youtube.com/watch?v=PaXVZJFfgJA', //4K HDR IMAX • Spider-Man fights Mysterio's Illusions ᵈᵗˢ⁻ʰᵈ + 'https://www.youtube.com/watch?v=PaXVZJFfgJA', //4K HDR IMAX • Spider-Man fights Mysterio's Illusions ᵈᵗˢ⁻ʰᵈ //'http://4k.ypt.me/4K/Stream1_AV1_4K_8.5mbps.webm' ); @@ -26,14 +26,10 @@ $path_parts = pathinfo($_POST['fileURI']); $basename = explode(".", $path_parts['basename']); $_POST['filename'] = str_replace(array(".", "_"), array(" ", " "), $basename[0]); - echo "Processing: ".json_encode($_POST).PHP_EOL; + echo "Processing: ".json_encode($_POST) . PHP_EOL; include $global['systemRootPath'].'view/queue.php'; - echo "Include: {$_POST['filename']}".PHP_EOL; + echo "Include: {$_POST['filename']}" . PHP_EOL; } -echo "Bye".PHP_EOL; +echo "Bye" . PHP_EOL; die(); - - - - diff --git a/install/watermarkCleaner.php b/install/watermarkCleaner.php index d9e099a15..53eedd133 100644 --- a/install/watermarkCleaner.php +++ b/install/watermarkCleaner.php @@ -1,6 +1,6 @@ lastUpdate - strtotime("-{$deleteFilesOlderThanHours} hours"); if ($remainingTime<0) { $cmd = "rm -rf {$dir}"; - echo "Remove {$cmd}".PHP_EOL; + echo "Remove {$cmd}" . PHP_EOL; exec($cmd); - }else{ - echo "Wait {$remainingTime} seconds".PHP_EOL; + } else { + echo "Wait {$remainingTime} seconds" . PHP_EOL; } } } else { if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { - if($file=='.' || $file == '..'){ + if ($file === '.' || $file === '..') { continue; } $newDir = "{$dir}{$file}/"; - if(is_dir($newDir)){ + if (is_dir($newDir)) { searchObjLog($newDir); } } diff --git a/locale/function.php b/locale/function.php index ff68581ca..73d3bf551 100644 --- a/locale/function.php +++ b/locale/function.php @@ -7,12 +7,12 @@ $_SESSION['lang'] = $_POST['lang']; if (isset($_SESSION['lang']) && $_SESSION['lang'] == $_POST['lang']) { echo ''; + window.location.replace(document.referrer); + '; } } -if(!class_exists('Locale')){ +if (!class_exists('Locale')) { $php_version = phpversion(); // Extract the major and minor version numbers @@ -31,13 +31,9 @@ $locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); $langBrowser = str_replace('-', '_', $locale); -function detecting_lang($languageBrowser, $default = 'en_US') { - $scanDir = '../locale/' . $languageBrowser . '.php'; - if (file_exists($scanDir) == false) { - return $default; - } else { - return basename($languageBrowser, '.php'); - } +function detecting_lang($languageBrowser, $default = 'en_US') +{ + return !file_exists('../locale/' . $languageBrowser . '.php') ? $default : basename($languageBrowser, '.php'); } if (!isset($_SESSION['lang'])) { @@ -48,7 +44,8 @@ function detecting_lang($languageBrowser, $default = 'en_US') { include $_SESSION['lang'] . '.php'; } -function display_lang($decoded_json, $searchKey) { +function display_lang($decoded_json, $searchKey) +{ foreach ($decoded_json as $key => $val) { $value = $decoded_json[$key]['value']; $label = $decoded_json[$key]['label']; @@ -59,5 +56,3 @@ function display_lang($decoded_json, $searchKey) { } } } - -?> diff --git a/locale/index.php b/locale/index.php index bb47b1faa..de000d673 100644 --- a/locale/index.php +++ b/locale/index.php @@ -63,4 +63,4 @@ function listAll($dir) } } } -*/ \ No newline at end of file +*/ diff --git a/locale/ja_JP.php b/locale/ja_JP.php index bf5e15b87..06e2da3a5 100644 --- a/locale/ja_JP.php +++ b/locale/ja_JP.php @@ -123,4 +123,4 @@ $t['more sites'] = '他のサイト'; $t['second'] = '秒'; $t['week'] = '週間'; -$t['year'] = '年'; \ No newline at end of file +$t['year'] = '年'; diff --git a/locale/locale.json.php b/locale/locale.json.php index 2d5183a3c..6054d3bb4 100644 --- a/locale/locale.json.php +++ b/locale/locale.json.php @@ -437,5 +437,3 @@ "zu_ZA" : {"value" : "zu_ZA","label" : "Zulu (South Africa)", "flag" : "za"}, "zu" : {"value" : "zu","label" : "Zulu", "flag" : "zu"} }'; - - diff --git a/locale/pt.php b/locale/pt.php index ac221b785..cc38ce189 100644 --- a/locale/pt.php +++ b/locale/pt.php @@ -106,4 +106,4 @@ $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'Detectamos um total de %s atualizações pendentes, se deseja fazer agora, clique no botão (Atualizar agora)'; $t['Will remove queue and the files when the encoder process is done'] = 'Removerá a fila e os arquivos quando o processo de codificação for concluído'; $t['Year'] = 'Ano'; -$t['Years'] = 'Anos'; \ No newline at end of file +$t['Years'] = 'Anos'; diff --git a/locale/pt_BR.php b/locale/pt_BR.php index ac221b785..cc38ce189 100644 --- a/locale/pt_BR.php +++ b/locale/pt_BR.php @@ -106,4 +106,4 @@ $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'Detectamos um total de %s atualizações pendentes, se deseja fazer agora, clique no botão (Atualizar agora)'; $t['Will remove queue and the files when the encoder process is done'] = 'Removerá a fila e os arquivos quando o processo de codificação for concluído'; $t['Year'] = 'Ano'; -$t['Years'] = 'Anos'; \ No newline at end of file +$t['Years'] = 'Anos'; diff --git a/objects/Configuration.php b/objects/Configuration.php index 0036c4219..baac20391 100644 --- a/objects/Configuration.php +++ b/objects/Configuration.php @@ -24,7 +24,6 @@ function __construct() { try { $this->load(1); } catch (Exception $exc) { - } if (empty($this->version)) { @@ -76,12 +75,7 @@ function getAutodelete() { } function setAutodelete($autodelete) { - if (empty($autodelete) || strtolower($autodelete) === 'false') { - $autodelete = 0; - } else { - $autodelete = 1; - } - $this->autodelete = $autodelete; + $this->autodelete = (empty($autodelete) || strtolower($autodelete) === 'false') ? 0 : 1; } function currentVersionLowerThen($version) { @@ -120,13 +114,13 @@ static function rewriteConfigFile($configurationVersion = 2) { /** * Do NOT change from here */ -if(empty(\$global['webSiteRootPath'])){ +if (empty(\$global['webSiteRootPath'])){ preg_match('/https?:\/\/[^\/]+(.*)/i', \$global['webSiteRootURL'], \$matches); - if(!empty(\$matches[1])){ + if (!empty(\$matches[1])){ \$global['webSiteRootPath'] = \$matches[1]; } } -if(empty(\$global['webSiteRootPath'])){ +if (empty(\$global['webSiteRootPath'])){ die('Please configure your webSiteRootPath'); } @@ -143,24 +137,18 @@ static function getOldConfig() { $sql = "SELECT * FROM configurations WHERE id = 1 LIMIT 1"; $global['lastQuery'] = $sql; $res = $global['mysqli']->query($sql); - if ($res) { - $user = $res->fetch_assoc(); - } else { - $user = false; - } - return $user; + return $res ? $res->fetch_assoc() : false; } protected function loadOld() { $user = self::getOldConfig(); - if (empty($user)) + if (empty($user)) { return false; + } foreach ($user as $key => $value) { $this->$key = $value; } return true; } - } - -} \ No newline at end of file +} diff --git a/objects/Encoder.php b/objects/Encoder.php index be32f6f93..42337f0af 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -1,9 +1,9 @@ streamers_id)) { @@ -81,19 +96,19 @@ function save() $this->filename = ''; } - if (empty($this->id) && (self::isPorn($this->fileURI) || self::isPorn($this->videoDownloadedLink) || self::isPorn($this->filename) || self::isPorn($this->title))) { - if($what = self::isPorn($this->fileURI)){ + if (empty($this->id) && (self::isPorn($this->fileURI) || self::isPorn($this->videoDownloadedLink) || self::isPorn($this->filename) || self::isPorn($this->title))) { + if ($what = self::isPorn($this->fileURI)) { error_log("Encoder::save deny [$what] ".__LINE__); - } - if($what = self::isPorn($this->videoDownloadedLink)){ + } + if ($what = self::isPorn($this->videoDownloadedLink)) { error_log("Encoder::save deny [$what] ".__LINE__); - } - if($what = self::isPorn($this->filename)){ + } + if ($what = self::isPorn($this->filename)) { error_log("Encoder::save deny [$what] ".__LINE__); - } - if($what = self::isPorn($this->title)){ + } + if ($what = self::isPorn($this->title)) { error_log("Encoder::save deny [$what] ".__LINE__); - } + } return false; } @@ -108,7 +123,7 @@ function save() return parent::save(); } - static function getAll($onlyMine = false, $errorOnly = false) + public static function getAll($onlyMine = false, $errorOnly = false) { global $global; $sql = "SELECT * FROM " . static::getTableName() . " WHERE 1=1 "; @@ -129,7 +144,7 @@ static function getAll($onlyMine = false, $errorOnly = false) */ $global['lastQuery'] = $sql; $res = $global['mysqli']->query($sql); - $rows = array(); + $rows = []; if ($res) { while ($row = $res->fetch_assoc()) { $rows[] = $row; @@ -140,7 +155,7 @@ static function getAll($onlyMine = false, $errorOnly = false) return $rows; } - static function getTotal($onlyMine = false) + public static function getTotal($onlyMine = false) { //will receive //current=1&rowCount=10&sort[sender]=asc&searchPhrase= @@ -161,86 +176,84 @@ static function getTotal($onlyMine = false) return $res->num_rows; } - function getId() + public function getId() { return $this->id; } - function getFileURI() + public function getFileURI() { return $this->fileURI; } - function getFilename() + public function getFilename() { return $this->filename; } /** - * * @return string */ - function getStatus() + public function getStatus() { return $this->status; } - function getStatus_obs() + public function getStatus_obs() { return $this->status_obs; } - function getReturn_vars() + public function getReturn_vars() { error_log("getReturn_vars " . $this->return_vars); return $this->return_vars; } - function getWorker_ppid() + public function getWorker_ppid() { return intval($this->worker_ppid); } - function getWorker_pid() + public function getWorker_pid() { return intval($this->worker_pid); } - function getPriority() + public function getPriority() { return intval($this->priority); } - function getCreated() + public function getCreated() { return $this->created; } - function getModified() + public function getModified() { return $this->modified; } /** - * * @return int */ - function getFormats_id() + public function getFormats_id() { return $this->formats_id; } - function setFileURI($fileURI) + public function setFileURI($fileURI) { $this->fileURI = $fileURI; } - function setFilename($filename) + public function setFilename($filename) { $this->filename = $filename; } - function setStatus($status) + public function setStatus($status) { $this->status = $status; @@ -249,8 +262,8 @@ function setStatus($status) case "done": case "error": case "queue": - $this->setWorker_ppid(NULL); - $this->setWorker_pid(NULL); + $this->setWorker_ppid(null); + $this->setWorker_pid(null); break; case "downloading": case "encoding": @@ -258,32 +271,32 @@ function setStatus($status) case "transferring": default: $this->setWorker_ppid(getmypid()); - $this->setWorker_pid(NULL); + $this->setWorker_pid(null); break; } } - function setStatus_obs($status_obs) + public function setStatus_obs($status_obs) { $this->status_obs = substr($status_obs, 0, 200); } - function setReturn_vars($return_vars) + public function setReturn_vars($return_vars) { $this->return_vars = $return_vars; } - function setWorker_ppid($worker_ppid) + public function setWorker_ppid($worker_ppid) { $this->worker_ppid = $worker_ppid; } - function setWorker_pid($worker_pid) + public function setWorker_pid($worker_pid) { $this->worker_pid = $worker_pid; } - function setReturn_varsVideos_id($videos_id) + public function setReturn_varsVideos_id($videos_id) { $videos_id = intval($videos_id); if (empty($videos_id)) { @@ -299,7 +312,7 @@ function setReturn_varsVideos_id($videos_id) return $this->id; } - function setReturn_varsVideo_id_hash($video_id_hash) + public function setReturn_varsVideo_id_hash($video_id_hash) { if (empty($video_id_hash)) { return false; @@ -314,91 +327,90 @@ function setReturn_varsVideo_id_hash($video_id_hash) return $this->id; } - function setPriority($priority) + public function setPriority($priority) { $this->priority = intval($priority); } - function setCreated($created) + public function setCreated($created) { $this->created = $created; } - function setModified($modified) + public function setModified($modified) { $this->modified = $modified; } - function getTitle() + public function getTitle() { return $this->title; } - function setTitle($title) + public function setTitle($title) { $this->title = substr($title, 0, 254); } - function getVideoDownloadedLink() + public function getVideoDownloadedLink() { return $this->videoDownloadedLink; } - function setVideoDownloadedLink($videoDownloadedLink) + public function setVideoDownloadedLink($videoDownloadedLink) { $this->videoDownloadedLink = substr($videoDownloadedLink, 0, 254); } - function getDownloadedFileName() + public function getDownloadedFileName() { return $this->downloadedFileName; } - function setDownloadedFileName($downloadedFileName) + public function setDownloadedFileName($downloadedFileName) { $this->downloadedFileName = substr($downloadedFileName, 0, 254); } /** - * * @return int */ - function getStreamers_id() + public function getStreamers_id() { return $this->streamers_id; } - function setStreamers_id($streamers_id) + public function setStreamers_id($streamers_id) { $this->streamers_id = $streamers_id; } - function getOverride_status() + public function getOverride_status() { return $this->override_status; } - function setOverride_status($override_status) + public function setOverride_status($override_status) { $this->override_status = $override_status; } - function setFormats_id($formats_id) + public function setFormats_id($formats_id) { - if (!preg_match('/^[0-9]+$/', $formats_id)) { + if (!preg_match('/^\d+$/', $formats_id)) { $formats_id = Format::createIfNotExists($formats_id); } $this->formats_id = $formats_id; } - function setFormats_idFromOrder($order) + public function setFormats_idFromOrder($order) { $o = new Format(0); $o->loadFromOrder($order); $this->setFormats_id($o->getId()); } - static function getNext() + public static function getNext() { global $global; $sql = "SELECT * FROM " . static::getTableName() . " WHERE status = 'queue' OR status = 'downloaded' "; @@ -417,7 +429,7 @@ static function getNext() return false; } - static function downloadFile($queue_id) + public static function downloadFile($queue_id) { global $global; $obj = new stdClass(); @@ -525,7 +537,7 @@ static function downloadFile($queue_id) return $obj; } - static private function setDownloaded($queue_id, $filePath) + private static function setDownloaded($queue_id, $filePath) { $encoder = new Encoder($queue_id); $msg = "Original filesize is " . humanFileSize(filesize($filePath)); @@ -535,7 +547,7 @@ static private function setDownloaded($queue_id, $filePath) return $encoder->save(); } - static function getYoutubeDl($videoURL, $queue_id, $destinationFile) + public static function getYoutubeDl($videoURL, $queue_id, $destinationFile) { global $global; $videoURL = escapeshellarg($videoURL); @@ -581,16 +593,12 @@ static function getYoutubeDl($videoURL, $queue_id, $destinationFile) error_log("getYoutubeDl: Copying [$file] to [$destinationFile] "); // instead of loading the whole file into memory to dump it into a new filename // the file is just symlinked - //////symlink($file, $destinationFile); + ////// symlink($file, $destinationFile); ////// symlink not allowed without apache configuration - if (_rename($file, $destinationFile)) { - return $destinationFile; - } else { - return $file; - } + return _rename($file, $destinationFile) ? $destinationFile : $file; } - static function getYoutubeDlProgress($queue_id) + public static function getYoutubeDlProgress($queue_id) { global $global; $obj = new stdClass(); @@ -624,7 +632,7 @@ static function getYoutubeDlProgress($queue_id) return $obj; } - static function getVideoFile($videoURL, $queue_id, $downloadedFile, $destinationFile) + public static function getVideoFile($videoURL, $queue_id, $downloadedFile, $destinationFile) { // the file has already been downloaded // all that is needed to do is create a tempfile reference to the original @@ -653,7 +661,7 @@ static function getVideoFile($videoURL, $queue_id, $downloadedFile, $destination return $myfile; } - static function areDownloading() + public static function areDownloading() { global $global; $sql = "SELECT f.*, e.* FROM " . static::getTableName() . " e " @@ -664,7 +672,7 @@ static function areDownloading() * @var object $global['mysqli'] */ $res = $global['mysqli']->query($sql); - $results = array(); + $results = []; if ($res) { while ($result = $res->fetch_assoc()) { $encoder = new Encoder($result['id']); @@ -680,21 +688,21 @@ static function areDownloading() return $results; } - static function areEncoding() + public static function areEncoding() { return self::getQueue($status = array(Encoder::$STATUS_ENCODING, Encoder::$STATUS_DOWNLOADING)); } - static function areDownloaded() + public static function areDownloaded() { return self::getQueue($status = array(Encoder::$STATUS_DOWNLOADED)); } - static function areTransferring() + public static function areTransferring() { return self::getQueue($status = array(Encoder::$STATUS_TRANSFERRING)); } - static function getQueue($status = array()) + public static function getQueue($status = array()) { global $global; if (empty($status)) { @@ -704,8 +712,8 @@ static function getQueue($status = array()) $statusIn = implode("', '", $status); $sql = "SELECT f.*, e.* FROM " . static::getTableName() . " e " - . " LEFT JOIN {$global['tablesPrefix']}formats f ON f.id = formats_id WHERE - status IN ('{$statusIn}') + . " LEFT JOIN {$global['tablesPrefix']}formats f ON f.id = formats_id WHERE + status IN ('{$statusIn}') ORDER BY priority ASC, e.id ASC "; /** @@ -713,7 +721,7 @@ static function getQueue($status = array()) * @var object $global['mysqli'] */ $res = $global['mysqli']->query($sql); - $results = array(); + $results = []; if ($res) { while ($result = $res->fetch_assoc()) { $encoder = new Encoder($result['id']); @@ -755,10 +763,9 @@ static function isTransferring() { } return false; } - * - */ + */ - static function getAllQueue() + public static function getAllQueue() { global $global; $sql = "SELECT f.*, e.* FROM " . static::getTableName() . " e " @@ -775,7 +782,7 @@ static function getAllQueue() * @var object $global['mysqli'] */ $res = $global['mysqli']->query($sql); - $rows = array(); + $rows = []; if ($res) { while ($row = $res->fetch_assoc()) { $row['return_vars'] = json_decode($row['return_vars']); @@ -790,7 +797,7 @@ static function getAllQueue() return $rows; } - static function getFromFilename($filename) + public static function getFromFilename($filename) { global $global; $sql = "SELECT * FROM " . static::getTableName() . " WHERE filename = '$filename' LIMIT 1 "; @@ -808,7 +815,7 @@ static function getFromFilename($filename) return false; } - static function getFromFileURI($fileURI) + public static function getFromFileURI($fileURI) { global $global; $sql = "SELECT * FROM " . static::getTableName() . " WHERE fileURI = '$fileURI' LIMIT 1 "; @@ -826,19 +833,22 @@ static function getFromFileURI($fileURI) return false; } - function isWorkerRunning() + public function isWorkerRunning() { $ppid = $this->getWorker_ppid(); - if (empty($ppid)) + if (empty($ppid)) { return false; + } exec("kill -0 " . $ppid, $output, $ppid_retval); - if ($ppid_retval != 0) + if ($ppid_retval != 0) { return false; + } $pid = $this->getWorker_pid(); - if (!is_numeric($pid)) + if (!is_numeric($pid)) { return false; + } /* * We have a parent ($ppid != 0) but no child ($pid == 0) @@ -846,8 +856,9 @@ function isWorkerRunning() */ if ($pid != 0) { exec("kill -0 " . $pid, $output, $pid_retval); - if ($pid_retval != 0) + if ($pid_retval != 0) { return false; + } } return true; } @@ -864,7 +875,7 @@ private static function setStatusError($queue_id, $msg, $notifyIsDone = false) return $saved; } - function exec($cmd, &$output = array(), &$return_val = 0) + public function exec($cmd, &$output = array(), &$return_val = 0) { if (function_exists("pcntl_fork")) { if (($status = $this->getStatus()) != "encoding") { @@ -887,9 +898,10 @@ function exec($cmd, &$output = array(), &$return_val = 0) } else { $return_val = 1; } - if (pcntl_wifsignaled($status)) + if (pcntl_wifsignaled($status)) { error_log("id=(" . $this->getId() . "), process " . $pid . " got signal " . pcntl_wtermsig($status)); - $this->setWorker_pid(NULL); + } + $this->setWorker_pid(null); $this->save(); break; case 0: @@ -920,7 +932,7 @@ function pnctl_get_last_error() return; } - function deleteQueue($notifyStreamer = false) + public function deleteQueue($notifyStreamer = false) { $worker_pid = $this->getWorker_pid(); $worker_ppid = $this->getWorker_ppid(); @@ -938,7 +950,7 @@ function deleteQueue($notifyStreamer = false) } } - static function run($try = 0) + public static function run($try = 0) { global $global; $maxTries = 3; @@ -983,7 +995,7 @@ static function run($try = 0) self::setStatusError($rowNext['id'], $msg); return false; } - } else if (!empty($return_vars->videos_id)) { + } elseif (!empty($return_vars->videos_id)) { $encoder->setStatus(Encoder::$STATUS_ENCODING); $encoder->save(); // run to try to download next @@ -996,7 +1008,7 @@ static function run($try = 0) if (!empty($resp->error)) { if ($resp->error === -1) { return false; - } else if ($try < 4) { + } elseif ($try < 4) { $msg = "Encoder::run: Trying again: [$try] => Execute code error 1 " . json_encode($resp->msg) . " \n Code: {$resp->code}"; error_log($msg); $encoder->setStatus(Encoder::$STATUS_QUEUE); @@ -1060,8 +1072,9 @@ static function run($try = 0) for ($i = 0; $i < count($rows); $i++) { $row = $rows[$i]; $msg .= "[{$row['id']}] {$row['filename']}"; - if (count($rows) > 1 && $i < count($rows) - 1) + if (count($rows) > 1 && $i < count($rows) - 1) { $msg .= ", "; + } } $msg .= (count($rows) == 1) ? " is encoding" : " are encoding"; $obj->msg = $msg; @@ -1151,14 +1164,14 @@ public static function getTmpFiles($encoder_queue_id) public static function getAllFilesInfo($encoder_queue_id) { $files = Encoder::getTmpFiles($encoder_queue_id); - $info = array(); + $info = []; foreach ($files as $file) { $info[] = getFileInfo($file); } return $info; } - function verify() + public function verify() { $streamers_id = $this->getStreamers_id(); if (empty($streamers_id)) { @@ -1176,7 +1189,7 @@ function verify() return $streamer->verify(); } - function send() + public function send() { global $global; $formatId = $this->getFormats_id(); @@ -1185,7 +1198,7 @@ function send() $return_vars = json_decode($this->getReturn_vars()); $videos_id = (!empty($return_vars->videos_id) ? $return_vars->videos_id : 0); $return = new stdClass(); - $return->sends = array(); + $return->sends = []; $return->formats_id = $this->getFormats_id(); $return->error = false; $return->original_videos_id = $videos_id; @@ -1277,7 +1290,7 @@ function send() return $return; } - static function sendFile($file, $return_vars, $format, $encoder = null, $resolution = "", $chunkFile = "") + public static function sendFile($file, $return_vars, $format, $encoder = null, $resolution = "", $chunkFile = "") { global $global; global $sentImage; @@ -1293,7 +1306,7 @@ static function sendFile($file, $return_vars, $format, $encoder = null, $resolut $obj->resolution = $resolution; $obj->videoDownloadedLink = $encoder->getVideoDownloadedLink(); $videos_id = 0; - if(is_object($return_vars) && !empty($return_vars->videos_id)){ + if (is_object($return_vars) && !empty($return_vars->videos_id)) { $videos_id = $return_vars->videos_id; } @@ -1333,9 +1346,9 @@ static function sendFile($file, $return_vars, $format, $encoder = null, $resolut $title = ''; if (empty($_POST['title'])) { $title = $encoder->getTitle(); - } else if (!empty($_REQUEST['title'])) { + } elseif (!empty($_REQUEST['title'])) { $title = $_REQUEST['title']; - } else if (empty($title) && !empty($obj->videoDownloadedLink)) { + } elseif (empty($title) && !empty($obj->videoDownloadedLink)) { $_title = Encoder::getTitleFromLink($obj->videoDownloadedLink); $title = $_title['output']; if ($_title['error']) { @@ -1357,7 +1370,7 @@ static function sendFile($file, $return_vars, $format, $encoder = null, $resolut $categories_id = $_POST['categories_id']; } if (empty($_POST['usergroups_id'])) { - $usergroups_id = array(); + $usergroups_id = []; } else { $usergroups_id = $_POST['usergroups_id']; } @@ -1394,8 +1407,9 @@ static function sendFile($file, $return_vars, $format, $encoder = null, $resolut // If unfinished progressive upload, status is // active and coding (k) if active (a) was requested // or encoding (e) otherwise. - if ($keep_encoding) + if ($keep_encoding) { $override_status = $override_status == 'a' ? 'k' : 'e'; + } $postFields['overrideStatus'] = $override_status; } @@ -1425,13 +1439,13 @@ static function sendFile($file, $return_vars, $format, $encoder = null, $resolut if (isset($u) && $u !== false && $obj->error == false) { $u->setStatus(Encoder::$STATUS_DONE); $u->save(); - } else if ($obj->error) { + } elseif ($obj->error) { error_log("AVideo-Streamer sendFile error: " . json_encode($postFields) . ' <=>' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); } return $obj; } - static function sendFileChunk($file, $return_vars, $format, $encoder = null, $resolution = "", $try = 0) + public static function sendFileChunk($file, $return_vars, $format, $encoder = null, $resolution = "", $try = 0) { $obj = new stdClass(); @@ -1484,8 +1498,8 @@ static function sendFileChunk($file, $return_vars, $format, $encoder = null, $re // Let curl know that we are using a chunked transfer encoding curl_setopt($ch, CURLOPT_HTTPHEADER, array('Transfer-Encoding: chunked')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // Use a callback to provide curl with data to transmit from the stream global $countCURLOPT_READFUNCTION; $countCURLOPT_READFUNCTION = 0; @@ -1527,7 +1541,7 @@ static function sendFileChunk($file, $return_vars, $format, $encoder = null, $re } } - static function sendFileToDownload($file, $return_vars, $format, $encoder = null, $resolution = "", $try = 0) + public static function sendFileToDownload($file, $return_vars, $format, $encoder = null, $resolution = "", $try = 0) { global $global; global $sentImage; @@ -1562,7 +1576,7 @@ static function sendFileToDownload($file, $return_vars, $format, $encoder = null $categories_id = $_POST['categories_id']; } if (empty($_POST['usergroups_id'])) { - $usergroups_id = array(); + $usergroups_id = []; } else { $usergroups_id = $_POST['usergroups_id']; } @@ -1609,7 +1623,7 @@ static function sendFileToDownload($file, $return_vars, $format, $encoder = null return $obj; } - static function sendImages($file, $return_vars, $encoder) + public static function sendImages($file, $return_vars, $encoder) { global $global; @@ -1665,7 +1679,7 @@ static function sendImages($file, $return_vars, $encoder) return $obj; } - static function sendRawVideo($file, $return_vars, $encoder) + public static function sendRawVideo($file, $return_vars, $encoder) { global $global; @@ -1698,7 +1712,7 @@ static function sendRawVideo($file, $return_vars, $encoder) return $obj; } - static function sendSpectrumFromMP3($file, $return_vars, $encoder) + public static function sendSpectrumFromMP3($file, $return_vars, $encoder) { global $global; @@ -1729,7 +1743,7 @@ static function sendSpectrumFromMP3($file, $return_vars, $encoder) return $obj; } - static function sendToStreamer($target, $postFields, $return_vars = false, $encoder = null) + public static function sendToStreamer($target, $postFields, $return_vars = false, $encoder = null) { $time_start = microtime(true); error_log("sendToStreamer to {$target} "); @@ -1787,8 +1801,8 @@ static function sendToStreamer($target, $postFields, $return_vars = false, $enco } catch (\Throwable $th) { error_log("sendToStreamer($target, " . json_encode($postFields)); } - curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); - curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); if (empty($curl)) { $obj->msg = "sendToStreamer cURL is empty "; return $obj; @@ -1845,7 +1859,7 @@ static function sendToStreamer($target, $postFields, $return_vars = false, $enco return $obj; } - static function getVideoConversionStatus($encoder_queue_id) + public static function getVideoConversionStatus($encoder_queue_id) { global $global; $progressFilename = "{$global['systemRootPath']}videos/{$encoder_queue_id}_tmpFile_progress.txt"; @@ -1857,7 +1871,7 @@ static function getVideoConversionStatus($encoder_queue_id) return false; } - static private function parseProgress($content) + private static function parseProgress($content) { //get duration of source @@ -1932,7 +1946,7 @@ static private function parseProgress($content) return $obj; } - static function getDurationFromFile($file) + public static function getDurationFromFile($file) { global $config, $getDurationFromFile; if (empty($file)) { @@ -1940,7 +1954,7 @@ static function getDurationFromFile($file) } if (!isset($getDurationFromFile)) { - $getDurationFromFile = array(); + $getDurationFromFile = []; } if (!empty($getDurationFromFile[$file])) { @@ -1996,7 +2010,7 @@ static function getDurationFromFile($file) return $duration; } - static function getImage($pathFileName, $seconds = 5) + public static function getImage($pathFileName, $seconds = 5) { global $global; if (preg_match('/\.mp3$/', $pathFileName)) { @@ -2040,7 +2054,7 @@ static function getImage($pathFileName, $seconds = 5) } } - static function getRawVideo($pathFileName) + public static function getRawVideo($pathFileName) { global $global; if (preg_match('/\.mp3$/', $pathFileName)) { @@ -2082,7 +2096,7 @@ static function getRawVideo($pathFileName) } } - static function getSpectrum($pathFileName) + public static function getSpectrum($pathFileName) { global $global; if (!file_exists($pathFileName)) { @@ -2113,7 +2127,7 @@ static function getSpectrum($pathFileName) } } - static function getGifImage($pathFileName, $seconds = 5, $howLong = 3) + public static function getGifImage($pathFileName, $seconds = 5, $howLong = 3) { //error_log("getGifImage"); @@ -2181,7 +2195,7 @@ static function getGifImage($pathFileName, $seconds = 5, $howLong = 3) } } - static function getWebpImage($pathFileName, $seconds = 5, $howLong = 3) + public static function getWebpImage($pathFileName, $seconds = 5, $howLong = 3) { //error_log("getWebpImage"); if (preg_match('/\.mp3$/', $pathFileName)) { @@ -2226,7 +2240,7 @@ static function getWebpImage($pathFileName, $seconds = 5, $howLong = 3) } } - function delete() + public function delete() { global $global; if (empty($this->id)) { @@ -2234,16 +2248,18 @@ function delete() } $files = glob("{$global['systemRootPath']}videos/{$this->id}_tmpFile*"); // get all file names foreach ($files as $file) { // iterate files - if (is_file($file)) - unlink($file); // delete file + if (is_file($file)) { + unlink($file); + } // delete file else { rrmdir($file); } } $files = glob("{$global['systemRootPath']}videos/avideoTmpFile_{$this->id}*"); // get all file names foreach ($files as $file) { // iterate files - if (is_file($file)) - @unlink($file); // delete file + if (is_file($file)) { + @unlink($file); + } // delete file else { @rrmdir($file); } @@ -2265,42 +2281,44 @@ private function deleteOriginal() } $files = glob("{$global['systemRootPath']}videos/original_" . $this->getFilename() . "*"); // get all file names foreach ($files as $file) { // iterate files - if (is_file($file)) - unlink($file); // delete file + if (is_file($file)) { + unlink($file); + } // delete file } return true; } - static function checkList() + public static function checkList() { // is videos writeble } - static function parseDurationToSeconds($str) + public static function parseDurationToSeconds($str) { $durationParts = explode(":", $str); - if (empty($durationParts[1])) + if (empty($durationParts[1])) { return 0; + } $minutes = intval(intval($durationParts[0]) * 60) + intval($durationParts[1]); return intval($durationParts[2]) + ($minutes * 60); } - static function formatDuration($str) + public static function formatDuration($str) { $seconds = 0; if (preg_match('/^[0-9]+$/', $str)) { // seconds only $seconds = $str; - } else if (preg_match('/^[0-9]+:[0-9]+$/', $str)) { // seconds and minutes + } elseif (preg_match('/^[0-9]+:[0-9]+$/', $str)) { // seconds and minutes $durationParts = explode(":", $str); $seconds = intval(($durationParts[0]) * 60) + intval($durationParts[1]); - } else if (preg_match('/^[0-9]+:[0-9]+:[0-9]+$/', $str)) { // seconds and minutes + } elseif (preg_match('/^[0-9]+:[0-9]+:[0-9]+$/', $str)) { // seconds and minutes $durationParts = explode(":", $str); $seconds = intval(($durationParts[0]) * 60 * 60) + (($durationParts[1]) * 60) + intval($durationParts[2]); } return self::parseSecondsToDuration($seconds); } - static function parseSecondsToDuration($int) + public static function parseSecondsToDuration($int) { $seconds = $int % 60; if ($seconds < 10) { @@ -2323,7 +2341,7 @@ static function parseSecondsToDuration($int) * @param string $link channel link * @return Array {"url": "DeHSfLqwqxg", "_type": "url", "ie_key": "Youtube", "id": "DeHSfLqwqxg", "title": "COMMERCIALS IN REAL LIFE"} */ - static function getReverseVideosJsonListFromLink($link) + public static function getReverseVideosJsonListFromLink($link) { $link = escapeshellarg($link); $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --skip-download --playlist-reverse --flat-playlist -j {$link}"; @@ -2333,7 +2351,7 @@ static function getReverseVideosJsonListFromLink($link) error_log("Get ReverseVideosJsonListFromLink List Error: $cmd \n" . print_r($output, true)); return false; } else { - $list = array(); + $list = []; foreach ($output as $value) { $list[] = json_decode($value); } @@ -2341,7 +2359,7 @@ static function getReverseVideosJsonListFromLink($link) } } - static function getTitleFromLink($link) + public static function getTitleFromLink($link) { $prepend = ''; if (!isWindows()) { @@ -2363,7 +2381,7 @@ static function getTitleFromLink($link) return $response; } - static function getDurationFromLink($link) + public static function getDurationFromLink($link) { $link = escapeshellarg($link); $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --no-playlist --force-ipv4 --get-duration --skip-download {$link}"; @@ -2381,7 +2399,7 @@ static function getDurationFromLink($link) } } - static function getThumbsFromLink($link, $returnFileName = false) + public static function getThumbsFromLink($link, $returnFileName = false) { $link = str_replace(array('"', "'"), array('', ''), $link); $link = escapeshellarg($link); @@ -2399,8 +2417,7 @@ static function getThumbsFromLink($link, $returnFileName = false) if (!@filesize($returnTmpfname)) { if (@filesize($returnTmpfname . '.webp')) { $returnTmpfname = $returnTmpfname . '.webp'; - } else - if (@filesize($returnTmpfname . '.jpg')) { + } elseif (@filesize($returnTmpfname . '.jpg')) { $returnTmpfname = $returnTmpfname . '.jpg'; } } @@ -2414,7 +2431,7 @@ static function getThumbsFromLink($link, $returnFileName = false) } } - static function getDescriptionFromLink($link) + public static function getDescriptionFromLink($link) { if (empty($link)) { return ''; @@ -2433,14 +2450,14 @@ static function getDescriptionFromLink($link) } } - static function getYouTubeDLCommand($forceYoutubeDL = false) + public static function getYouTubeDLCommand($forceYoutubeDL = false) { global $global; if (!empty($global['youtube-dl'])) { return $global['youtube-dl'] . ' '; - } else if (empty($forceYoutubeDL) && file_exists("/usr/local/bin/yt-dlp")) { + } elseif (empty($forceYoutubeDL) && file_exists("/usr/local/bin/yt-dlp")) { return "/usr/local/bin/yt-dlp "; - } else if (file_exists("/usr/local/bin/youtube-dl")) { + } elseif (file_exists("/usr/local/bin/youtube-dl")) { return "/usr/local/bin/youtube-dl "; } else { return "youtube-dl "; diff --git a/objects/Format.php b/objects/Format.php index 0680f82f2..98cf8f327 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -11,31 +11,39 @@ class Format extends ObjectYPT { - protected $id, $name, $code, $created, $modified, $extension, $extension_from, $order; - - static function getSearchFieldsNames() + protected $id; + protected $name; + protected $code; + protected $created; + protected $modified; + protected $extension; + protected $extension_from; + protected $order; + + public static function getSearchFieldsNames() { return array('name'); } - static function getTableName() + public static function getTableName() { global $global; return $global['tablesPrefix'] . 'formats'; } - function loadFromOrder($order) + public function loadFromOrder($order) { $row = self::getFromOrder($order); - if (empty($row)) + if (empty($row)) { return false; + } foreach ($row as $key => $value) { $this->$key = $value; } return true; } - static protected function getFromOrder($order) + protected static function getFromOrder($order) { error_log("AVideo-Encoder Format::getFromOrder($order)"); global $global; @@ -54,7 +62,7 @@ static protected function getFromOrder($order) return $row; } - function run($pathFileName, $encoder_queue_id) + public function run($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::run($pathFileName, $encoder_queue_id)"); global $global; @@ -67,25 +75,25 @@ function run($pathFileName, $encoder_queue_id) if ($this->order == 88) { error_log("run:mp3ToSpectrumHLS"); $obj = $this->mp3ToSpectrumHLS($pathFileName, $encoder_queue_id); - } else if ($this->order == 89) { + } elseif ($this->order == 89) { error_log("run:mp3ToSpectrumMP4"); $obj = $this->mp3ToSpectrumMP4($pathFileName, $encoder_queue_id); - } else if ($this->order == 90 && empty($global['disableWebM'])) { + } elseif ($this->order == 90 && empty($global['disableWebM'])) { error_log("run:mp3ToSpectrumWEBM"); $obj = $this->mp3ToSpectrumWEBM($pathFileName, $encoder_queue_id); - } else if ($this->order == 70) { + } elseif ($this->order == 70) { error_log("run:runVideoToSpectrum"); $obj = $this->runVideoToSpectrum($pathFileName, $encoder_queue_id); - } else if ($this->order == 71) { + } elseif ($this->order == 71) { error_log("run:runVideoToAudio"); $obj = $this->runVideoToAudio($pathFileName, $encoder_queue_id); } elseif ($this->order == 72) { error_log("run:runBothVideo"); $obj = $this->runBothVideo($pathFileName, $encoder_queue_id); - } else if ($this->order == 73) { + } elseif ($this->order == 73) { error_log("run:runBothAudio"); $obj = $this->runBothAudio($pathFileName, $encoder_queue_id, $this->id); - } else if (in_array($this->order, $global['multiResolutionOrder']) && !in_array($this->order, $global['sendAll'])) { + } elseif (in_array($this->order, $global['multiResolutionOrder']) && !in_array($this->order, $global['sendAll'])) { error_log("run:runMultiResolution"); error_log("run:runMultiResolution" . json_encode($this->order)); error_log("run:runMultiResolution" . json_encode($global['sendAll'])); @@ -297,7 +305,7 @@ private function runBothAudio($pathFileName, $encoder_queue_id) return $obj; } - static private function preProcessHLS($destinationFile) + private static function preProcessHLS($destinationFile) { $parts = pathinfo($destinationFile); $destinationFile = "{$parts["dirname"]}/{$parts["filename"]}/"; @@ -329,12 +337,12 @@ static private function preProcessHLS($destinationFile) return $destinationFile; } - static function getResolution($pathFileName) + public static function getResolution($pathFileName) { global $_getResolution; if (!isset($_getResolution)) { - $_getResolution = array(); + $_getResolution = []; } if (!empty($_getResolution[$pathFileName])) { @@ -368,7 +376,7 @@ static function getResolution($pathFileName) return $resolution; } - static function getAudioTracks($pathFileName) + public static function getAudioTracks($pathFileName) { global $global; if (empty($global['enableMultipleLangs'])) { @@ -389,7 +397,7 @@ static function getAudioTracks($pathFileName) return 1080; } - $audioTracks = array(); + $audioTracks = []; foreach ($jsonObj->streams as $stream) { if (!empty($stream->tags) && !empty($stream->tags->language)) { $audioTracks[] = $stream->tags->language; @@ -400,12 +408,12 @@ static function getAudioTracks($pathFileName) return $audioTracks; } - static private function getDynamicCommandFromMP4($pathFileName, $encoder_queue_id) + private static function getDynamicCommandFromMP4($pathFileName, $encoder_queue_id) { return self::getDynamicCommandFromFormat($pathFileName, $encoder_queue_id, 31); } - static private function getDynamicCommandFromWebm($pathFileName, $encoder_queue_id) + private static function getDynamicCommandFromWebm($pathFileName, $encoder_queue_id) { return self::getDynamicCommandFromFormat($pathFileName, $encoder_queue_id, 32); } @@ -419,7 +427,7 @@ static private function getDynamicCommandFromWebm($pathFileName, $encoder_queue_ * 360p: 640x360 * 240p: 426x240 (preview) */ - static private function getAvailableConfigurations() + private static function getAvailableConfigurations() { $resolutions = array(240, 360, 480, 540, 720, 1080, 1440, 2160); $bandwidth = array(300000, 600000, 1000000, 1500000, 2000000, 4000000, 8000000, 12000000); @@ -434,15 +442,15 @@ static private function getAvailableConfigurations() ); } - static function getAvailableResolutions() + public static function getAvailableResolutions() { return self::getAvailableConfigurations()["resolutions"]; } - static function getAvailableResolutionsInfo() + public static function getAvailableResolutionsInfo() { global $config; - $resolutions = array(); + $resolutions = []; $availableResolutions = Format::getAvailableResolutions(); $selectedResolutions = $config->getSelectedResolutions(); foreach ($availableResolutions as $key => $resolution) { @@ -451,11 +459,11 @@ static function getAvailableResolutionsInfo() $label = "{$resolution}p "; if ($resolution == 720) { $label .= 'HD'; - } else if ($resolution == 1080) { + } elseif ($resolution == 1080) { $label .= 'FHD'; - } else if ($resolution == 1440) { + } elseif ($resolution == 1440) { $label .= 'FHD+'; - } else if ($resolution == 2160) { + } elseif ($resolution == 2160) { $label .= '4K'; } $label .= " "; @@ -470,7 +478,7 @@ static function getAvailableResolutionsInfo() return $resolutions; } - static function sanitizeResolutions($resolutions) + public static function sanitizeResolutions($resolutions) { if (is_array($resolutions)) { // resolutions need to be int values @@ -501,7 +509,7 @@ function ($value) { $resolutions = array_values($resolutions); } - // if the array contains valid $resolutions, then return it + // if the array contains valid $resolutions, then return it if (!empty($resolutions)) { return $resolutions; } @@ -509,7 +517,7 @@ function ($value) { return null; } - static private function getSelectedResolutions() + private static function getSelectedResolutions() { $result = array(480, 720, 1080, 2160); $config = new Configuration(); @@ -522,14 +530,14 @@ static private function getSelectedResolutions() return $result; } - static private function loadEncoderConfiguration() + private static function loadEncoderConfiguration() { $availableConfiguration = self::getAvailableConfigurations(); - $resolutions = array(); - $bandwidth = array(); - $audioBitrate = array(); - $videoFramerate = array(); + $resolutions = []; + $bandwidth = []; + $audioBitrate = []; + $videoFramerate = []; $selectedResolutions = self::getSelectedResolutions(); @@ -552,7 +560,7 @@ static private function loadEncoderConfiguration() ); } - static private function getDynamicCommandFromFormat($pathFileName, $encoder_queue_id, $format_id) + private static function getDynamicCommandFromFormat($pathFileName, $encoder_queue_id, $format_id) { $height = self::getResolution($pathFileName); //$audioTracks = self::getAudioTracks($pathFileName); @@ -567,7 +575,7 @@ static private function getDynamicCommandFromFormat($pathFileName, $encoder_queu error_log("Encoder:Format:: getDynamicCommandFromFormat($pathFileName, $format_id) [resolutions=" . json_encode($resolutions) . "] [height={$height}]"); $f = new Format($format_id); $code = $f->getCode(); // encoder command-line switches - // create command + // create command $command = get_ffmpeg() . ' -i "{$pathFileName}" '; $i = 0; @@ -587,7 +595,7 @@ static private function getDynamicCommandFromFormat($pathFileName, $encoder_queu $framerate = (!empty($videoFramerate[$i])) ? " -r {$videoFramerate[$i]} " : ""; eval("\$command .= \" $code\";"); - } else if ($height != $resolution) { + } elseif ($height != $resolution) { error_log("Encoder:Format:: getDynamicCommandFromFormat resolution {$resolution} was ignored, your upload file is {$height} we wil not up transcode your video"); break; } @@ -609,7 +617,7 @@ static private function getDynamicCommandFromFormat($pathFileName, $encoder_queu return $command; } - static private function preProcessDynamicHLS($pathFileName, $destinationFile) + private static function preProcessDynamicHLS($pathFileName, $destinationFile) { $height = self::getResolution($pathFileName); //$audioTracks = self::getAudioTracks($pathFileName); @@ -646,7 +654,7 @@ static private function preProcessDynamicHLS($pathFileName, $destinationFile) mkdir($file); $str .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($bandwidth[$key]) . PHP_EOL . "res{$value}/index.m3u8" . PHP_EOL; error_log("Encoder:Format:: preProcessDynamicHLS 1 mkdir [$file] "); - } else if ($height != $value) { + } elseif ($height != $value) { error_log("Encoder:Format:: preProcessDynamicHLS resolution {$value} was ignored, your upload file is {$height}p we wil not up transcode your video"); } } @@ -688,7 +696,7 @@ static private function preProcessDynamicHLS($pathFileName, $destinationFile) } eval("\$command .= \" $code\";"); error_log("Encoder:Format:: 2 preProcessDynamicHLS {$command}"); - } else if ($height != $value) { + } elseif ($height != $value) { error_log("Encoder:Format:: preProcessDynamicHLS 2 resolution {$value} was ignored, your upload file is {$height} we wil not up transcode your video"); } } @@ -701,7 +709,7 @@ static private function preProcessDynamicHLS($pathFileName, $destinationFile) return array($destinationFile, $command); } - static private function posProcessHLS($destinationFile, $encoder_queue_id) + private static function posProcessHLS($destinationFile, $encoder_queue_id) { // zip the directory $encoder = new Encoder($encoder_queue_id); @@ -715,7 +723,7 @@ static private function posProcessHLS($destinationFile, $encoder_queue_id) return file_exists($zipPath); } - static private function fixFile($pathFileName, $encoder_queue_id) + private static function fixFile($pathFileName, $encoder_queue_id) { // zip the directory $encoder = new Encoder($encoder_queue_id); @@ -739,7 +747,7 @@ static private function fixFile($pathFileName, $encoder_queue_id) return file_exists($pathFileName); } - static private function exec($format_id, $pathFileName, $destinationFile, $encoder_queue_id, $try = 0) + private static function exec($format_id, $pathFileName, $destinationFile, $encoder_queue_id, $try = 0) { global $global; $obj = new stdClass(); @@ -759,9 +767,9 @@ static private function exec($format_id, $pathFileName, $destinationFile, $encod } else { // use default 3 resolutions $destinationFile = self::preProcessHLS($destinationFile); } - } else if ($format_id == 31) { // it is MP4 + } elseif ($format_id == 31) { // it is MP4 $fc = self::getDynamicCommandFromMP4($pathFileName, $encoder_queue_id); - } else if ($format_id == 32) { // it is WebM + } elseif ($format_id == 32) { // it is WebM $fc = self::getDynamicCommandFromWebm($pathFileName, $encoder_queue_id); } $code = ''; @@ -805,7 +813,7 @@ static private function exec($format_id, $pathFileName, $destinationFile, $encod return $obj; } - static function progressFileHasVideosWithErrors($progressFilename) + public static function progressFileHasVideosWithErrors($progressFilename) { global $global; @@ -845,7 +853,7 @@ static function progressFileHasVideosWithErrors($progressFilename) return false; } - static function videoFileHasErrors($filename, $allowed_extensions = true) + public static function videoFileHasErrors($filename, $allowed_extensions = true) { global $global; if (!file_exists($filename)) { @@ -896,7 +904,7 @@ static function videoFileHasErrors($filename, $allowed_extensions = true) } } - static private function execOrder($format_order, $pathFileName, $destinationFile, $encoder_queue_id) + private static function execOrder($format_order, $pathFileName, $destinationFile, $encoder_queue_id) { if (empty($destinationFile)) { $obj = new stdClass(); @@ -949,7 +957,7 @@ static private function execOrder($format_order, $pathFileName, $destinationFile return $obj; } - static function getFromName($name) + public static function getFromName($name) { global $global; $name = strtolower(trim($name)); @@ -968,7 +976,7 @@ static function getFromName($name) return false; } - static function createIfNotExists($name) + public static function createIfNotExists($name) { if (empty($name)) { return false; @@ -986,42 +994,42 @@ static function createIfNotExists($name) return $row['id']; } - function getId() + public function getId() { return $this->id; } - function getName() + public function getName() { return $this->name; } - function getCode() + public function getCode() { return $this->code; } - function getCreated() + public function getCreated() { return $this->created; } - function getModified() + public function getModified() { return $this->modified; } - function getExtension() + public function getExtension() { return $this->extension; } - function setId($id) + public function setId($id) { $this->id = $id; } - function setName($name) + public function setName($name) { global $global; /** @@ -1030,7 +1038,7 @@ function setName($name) $this->name = $global['mysqli']->real_escape_string($name); } - function setCode($code) + public function setCode($code) { global $global; /** @@ -1039,17 +1047,17 @@ function setCode($code) $this->code = $global['mysqli']->real_escape_string($code); } - function setCreated($created) + public function setCreated($created) { $this->created = $created; } - function setModified($modified) + public function setModified($modified) { $this->modified = $modified; } - function setExtension($extension) + public function setExtension($extension) { global $global; /** @@ -1058,22 +1066,22 @@ function setExtension($extension) $this->extension = $global['mysqli']->real_escape_string($extension); } - function getExtension_from() + public function getExtension_from() { return $this->extension_from; } - function setExtension_from($extension_from) + public function setExtension_from($extension_from) { $this->extension_from = $extension_from; } - function getOrder() + public function getOrder() { return $this->order; } - function setOrder($order) + public function setOrder($order) { $this->order = $order; } diff --git a/objects/Object.php b/objects/Object.php index 68b554680..257d1d13e 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -2,28 +2,27 @@ interface ObjectInterface { - - static function getTableName(); - static function getSearchFieldsNames(); + public static function getTableName(); + public static function getSearchFieldsNames(); } + abstract class ObjectYPT implements ObjectInterface { - - private $fieldsName = array(); + private $fieldsName = []; protected function load($id) { $user = self::getFromDb($id); - if (empty($user)) + if (empty($user)) { return false; + } foreach ($user as $key => $value) { $this->$key = $value; } return true; } - - function __construct($id) + public function __construct($id) { if (!empty($id)) { // get data from id @@ -31,7 +30,7 @@ function __construct($id) } } - static protected function getFromDb($id) + protected static function getFromDb($id) { global $global; $id = intval($id); @@ -41,15 +40,10 @@ static protected function getFromDb($id) * @var array $global */ $res = $global['mysqli']->query($sql); - if ($res) { - $user = $res->fetch_assoc(); - } else { - $user = false; - } - return $user; + return $res ? $res->fetch_assoc() : false; } - static function getAll() + public static function getAll() { global $global; $sql = "SELECT * FROM " . static::getTableName() . " WHERE 1=1 "; @@ -61,7 +55,7 @@ static function getAll() * @var array $global */ $res = $global['mysqli']->query($sql); - $rows = array(); + $rows = []; if ($res) { while ($row = $res->fetch_assoc()) { $rows[] = $row; @@ -72,10 +66,9 @@ static function getAll() return $rows; } - - static function getTotal() + public static function getTotal() { - //will receive + //will receive //current=1&rowCount=10&sort[sender]=asc&searchPhrase= global $global; $sql = "SELECT id FROM " . static::getTableName() . " WHERE 1=1 "; @@ -92,15 +85,14 @@ static function getTotal() return $res->num_rows; } - - static function getSqlFromPost() + public static function getSqlFromPost() { global $global; $sql = self::getSqlSearchFromPost(); if (!empty($_POST['sort'])) { - $orderBy = array(); + $orderBy = []; foreach ($_POST['sort'] as $key => $value) { /** * @var array $global @@ -127,7 +119,7 @@ static function getSqlFromPost() return $sql; } - static function getSqlSearchFromPost() + public static function getSqlSearchFromPost() { $sql = ""; if (!empty($_POST['searchPhrase'])) { @@ -137,7 +129,7 @@ static function getSqlSearchFromPost() global $global; $search = $global['mysqli']->real_escape_string($_GET['q']); - $like = array(); + $like = []; $searchFields = static::getSearchFieldsNames(); foreach ($searchFields as $value) { $like[] = " {$value} LIKE '%{$search}%' "; @@ -152,17 +144,17 @@ static function getSqlSearchFromPost() return $sql; } - function save() + public function save() { global $global; $fieldsName = $this->getAllFields(); if (!empty($this->id)) { $sql = "UPDATE " . static::getTableName() . " SET "; - $fields = array(); + $fields = []; foreach ($fieldsName as $value) { if (strtolower($value) == 'created') { // do nothing - } else if (strtolower($value) == 'modified') { + } elseif (strtolower($value) == 'modified') { $fields[] = " {$value} = now() "; } else { $fields[] = " `{$value}` = '{$this->$value}' "; @@ -173,11 +165,11 @@ function save() } else { $sql = "INSERT INTO " . static::getTableName() . " ( "; $sql .= "`" . implode("`,`", $fieldsName) . "` )"; - $fields = array(); + $fields = []; foreach ($fieldsName as $value) { if (strtolower($value) == 'created' || strtolower($value) == 'modified') { $fields[] = " now() "; - } else if (!isset($this->$value)) { + } elseif (!isset($this->$value)) { $fields[] = " NULL "; } else { $fields[] = " '{$this->$value}' "; @@ -215,7 +207,7 @@ private function getAllFields() * @var array $global */ $res = $global['mysqli']->query($sql); - $rows = array(); + $rows = []; if ($res) { while ($row = $res->fetch_assoc()) { $rows[] = $row["COLUMN_NAME"]; @@ -226,7 +218,7 @@ private function getAllFields() return $rows; } - function delete() + public function delete() { global $global; if (!empty($this->id)) { @@ -242,4 +234,4 @@ function delete() error_log("Id for table " . static::getTableName() . " not defined for deletion"); return false; } -} \ No newline at end of file +} diff --git a/objects/ServerMonitor.php b/objects/ServerMonitor.php index ef0a71d4c..f0f3ac092 100644 --- a/objects/ServerMonitor.php +++ b/objects/ServerMonitor.php @@ -1,8 +1,9 @@ command = "free"; exec($obj->command . " 2>&1", $output, $return_val); if ($return_val !== 0) { @@ -21,7 +22,8 @@ static function getMemoryLinux($obj) { return $obj; } - static function getMemoryNetBSD($obj) { + public static function getMemoryNetBSD($obj) + { $obj->command = "/sbin/sysctl hw.pagesize; /usr/bin/vmstat -t"; exec($obj->command . " 2>&1", $output, $return_val); if ($return_val !== 0) { @@ -32,9 +34,9 @@ static function getMemoryNetBSD($obj) { $parts = explode(" = ", $output[0]); if ($parts[0] != "hw.pagesize") { $obj->error = "Get Memmory ERROR** (unknown page size)"; - } else if (($match = preg_split("/ +/", trim($output[3]))) === false) { + } elseif (($match = preg_split("/ +/", trim($output[3]))) === false) { $obj->error = "Get Memmory ERROR** (unepxected vmstat output)"; - } else if (!is_numeric($match[4]) || !is_numeric($match[5]) || !is_numeric($match[11])) { + } elseif (!is_numeric($match[4]) || !is_numeric($match[5]) || !is_numeric($match[11])) { $obj->error = "Get Memmory ERROR** (non numeric memory size?)"; } else { $page_size = $parts[1]; @@ -44,13 +46,15 @@ static function getMemoryNetBSD($obj) { } } - if (!empty($obj->error)) - $obj->error .= " " . print_r($output, true); + if (!empty($obj->error)) { + $obj->error .= " " . print_r($output, true); + } return $obj; } - static function getMemory() { + public static function getMemory() + { $obj = new stdClass(); $os = php_uname("s"); $getMemoryOsFunction = "getMemory" . $os; @@ -61,7 +65,7 @@ static function getMemory() { $obj = ServerMonitor::$getMemoryOsFunction($obj); } - if (empty($obj->error)) { + if (empty($obj->error)) { $obj->success = 1; $onePc = $obj->memTotalBytes / 100; $obj->memTotal = self::humanFileSize($obj->memTotalBytes); @@ -73,14 +77,17 @@ static function getMemory() { return $obj; } - static function humanFileSize($size, $unit = "") { - if ((!$unit && $size >= 1 << 30) || $unit == "GB") + public static function humanFileSize($size, $unit = "") + { + if ((!$unit && $size >= 1 << 30) || $unit == "GB") { return number_format($size / (1 << 30), 2) . "GB"; - if ((!$unit && $size >= 1 << 20) || $unit == "MB") + } + if ((!$unit && $size >= 1 << 20) || $unit == "MB") { return number_format($size / (1 << 20), 2) . "MB"; - if ((!$unit && $size >= 1 << 10) || $unit == "KB") + } + if ((!$unit && $size >= 1 << 10) || $unit == "KB") { return number_format($size / (1 << 10), 2) . "KB"; + } return number_format($size) . " bytes"; } - } diff --git a/objects/Streamer.php b/objects/Streamer.php index 30362d9cb..1391c2192 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -142,10 +142,10 @@ static function isURLAllowed($siteURL) { $allowed[] = "https://127.0.0.1/AVideo/"; $return = false; - + $siteURL = str_replace('https://', '', $siteURL); $siteURL = str_replace('http://', '', $siteURL); - + if (empty($allowed)) { $return = true; } else { @@ -157,7 +157,7 @@ static function isURLAllowed($siteURL) { if (substr($value, -1) !== '/') { $value .= "/"; } - + $value = str_replace('https://', '', $value); $value = str_replace('http://', '', $value); //var_dump($siteURL,$value); @@ -245,7 +245,5 @@ function getIsAdmin() { function setIsAdmin($isAdmin) { $this->isAdmin = $isAdmin; } - } - -} \ No newline at end of file +} diff --git a/objects/createSpiritsFromVideo.php b/objects/createSpiritsFromVideo.php index 9adda2593..1555c7375 100644 --- a/objects/createSpiritsFromVideo.php +++ b/objects/createSpiritsFromVideo.php @@ -33,12 +33,12 @@ $url = str_replace('https://gdrive.local/', 'http://192.168.0.2/', $url); /** - if(!isURL200($url)){ + if (!isURL200($url)){ $headers = get_headers($url); error_log("URL $url is not 200 code ". json_encode($headers)); return false; } - * + * */ error_log("CreateSpirits: creating directory {$dirname}"); $created = make_path($dirname); @@ -73,13 +73,13 @@ //error_log("CreateSpirits: ". json_encode($output)); //error_log("CreateSpirits: ". json_encode($return_var)); $dirSize = dirSize($dirname); -if($dirSize<100000){ +if ($dirSize<100000){ error_log("CreateSpirits: ERROR on dirsize={$dirSize} {$cmd}"); return false; } $images = glob($dirname . "*.png"); -$srcImagePaths = Array(); +$srcImagePaths = []; foreach ($images as $image) { $srcImagePaths[] = $image; @@ -114,5 +114,3 @@ error_log("CreateSpirits: removing directory {$dirname}"); //rmdir($dirname); -/* * - */ diff --git a/objects/functions.php b/objects/functions.php index b8590624d..e5360e2b8 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -37,7 +37,6 @@ function get_ffmpeg($ignoreGPU = false) { } function getFFmpegScaleToForceOriginalAspectRatio($width, $heigth) { - return "scale={$width}:{$heigth}:force_original_aspect_ratio=decrease,pad={$width}:{$heigth}:-1:-1:color=black"; } @@ -119,7 +118,7 @@ function url_get_contents($Url, $ctx = "", $timeout = 0) { error_log("Error on get Content"); } } - } else if (function_exists('curl_init')) { + } elseif (function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_USERAGENT, $agent); curl_setopt($ch, CURLOPT_URL, $Url); @@ -140,49 +139,44 @@ function url_get_contents($Url, $ctx = "", $timeout = 0) { function fetch_http_file_contents($url) { $hostname = parse_url($url, PHP_URL_HOST); - if ($hostname == FALSE) { - return FALSE; + if ($hostname == false) { + return false; } - $host_has_ipv6 = FALSE; - $host_has_ipv4 = FALSE; - $file_response = FALSE; + $host_has_ipv6 = false; + $host_has_ipv4 = false; + $file_response = false; $dns_records = @dns_get_record($hostname, DNS_AAAA + DNS_A); if (!empty($dns_records) && is_array($dns_records)) { foreach ($dns_records as $dns_record) { if (isset($dns_record['type'])) { switch ($dns_record['type']) { case 'AAAA': - $host_has_ipv6 = TRUE; + $host_has_ipv6 = true; break; case 'A': - $host_has_ipv4 = TRUE; + $host_has_ipv4 = true; break; } } } } - if ($host_has_ipv6 === TRUE) { + if ($host_has_ipv6 === true) { $file_response = file_get_intbound_contents($url, '[0]:0'); } - if ($host_has_ipv4 === TRUE && $file_response == FALSE) { + if ($host_has_ipv4 === true && $file_response == false) { $file_response = file_get_intbound_contents($url, '0:0'); } return $file_response; } function file_get_intbound_contents($url, $bindto_addr_family) { - $stream_context = stream_context_create( - array( - 'socket' => array( - 'bindto' => $bindto_addr_family - ), - 'http' => array( - 'timeout' => 20, - 'method' => 'GET' - ))); + $stream_context = stream_context_create([ + 'socket' => ['bindto' => $bindto_addr_family], + 'http' => ['timeout' => 20, 'method' => 'GET'] + ]); - return file_get_contents($url, FALSE, $stream_context); + return file_get_contents($url, false, $stream_context); } // Returns a file size limit in bytes based on the PHP upload_max_filesize @@ -216,12 +210,15 @@ function parse_size($size) { } function humanFileSize($size, $unit = "") { - if ((!$unit && $size >= 1 << 30) || $unit == "GB") + if ((!$unit && $size >= 1 << 30) || $unit == "GB") { return number_format($size / (1 << 30), 2) . "GB"; - if ((!$unit && $size >= 1 << 20) || $unit == "MB") + } + if ((!$unit && $size >= 1 << 20) || $unit == "MB") { return number_format($size / (1 << 20), 2) . "MB"; - if ((!$unit && $size >= 1 << 10) || $unit == "KB") + } + if ((!$unit && $size >= 1 << 10) || $unit == "KB") { return number_format($size / (1 << 10), 2) . "KB"; + } return number_format($size) . " bytes"; } @@ -243,8 +240,9 @@ function humanTiming($time) { ); foreach ($tokens as $unit => $text) { - if ($time < $unit) + if ($time < $unit) { continue; + } $numberOfUnits = floor($time / $unit); return $numberOfUnits . ' ' . $text . (($numberOfUnits > 1) ? 's' : ''); } @@ -264,18 +262,11 @@ function checkVideosDir() { } function isApache() { - if (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false) - return true; - else - return false; + return (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false); } function isPHP($version = "'7.0.0'") { - if (version_compare(PHP_VERSION, $version) >= 0) { - return true; - } else { - return false; - } + return (version_compare(PHP_VERSION, $version) >= 0); } function modRewriteEnabled() { @@ -285,9 +276,8 @@ function modRewriteEnabled() { $contents = ob_get_contents(); ob_end_clean(); return (strpos($contents, 'mod_rewrite') !== false); - } else { - return in_array('mod_rewrite', apache_get_modules()); } + return in_array('mod_rewrite', apache_get_modules()); } function isFFMPEG() { @@ -317,44 +307,28 @@ function getURLToApplication() { function check_max_execution_time() { $max_size = ini_get('max_execution_time'); $recomended_size = 7200; - if ($recomended_size > $max_size) { - return false; - } else { - return true; - } + return !($recomended_size > $max_size); } //post_max_size = 100M function check_post_max_size() { $max_size = parse_size(ini_get('post_max_size')); $recomended_size = parse_size('100M'); - if ($recomended_size > $max_size) { - return false; - } else { - return true; - } + return !($recomended_size > $max_size); } //upload_max_filesize = 100M function check_upload_max_filesize() { $max_size = parse_size(ini_get('upload_max_filesize')); $recomended_size = parse_size('100M'); - if ($recomended_size > $max_size) { - return false; - } else { - return true; - } + return !($recomended_size > $max_size); } //memory_limit = 100M function check_memory_limit() { $max_size = parse_size(ini_get('memory_limit')); $recomended_size = parse_size('512M'); - if ($recomended_size > $max_size) { - return false; - } else { - return true; - } + return !($recomended_size > $max_size); } function check_mysqlnd() { @@ -431,10 +405,11 @@ function status($statusarray) { } } else { echo json_encode(array_map( - function ($text) { - return nl2br($text); - } - , $statusarray)); + function ($text) { + return nl2br($text); + }, + $statusarray + )); } } @@ -450,8 +425,9 @@ function croak($statusarray) { function parseDurationToSeconds($str) { $durationParts = explode(":", $str); - if (empty($durationParts[1])) + if (empty($durationParts[1])) { return 0; + } $minutes = (intval($durationParts[0]) * 60) + intval($durationParts[1]); return intval($durationParts[2]) + ($minutes * 60); } @@ -478,19 +454,19 @@ function decideFromPlugin() { return array("mp4" => 7, "webm" => 8); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { return array("mp4" => 80, "webm" => 87); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD)) { return array("mp4" => 77, "webm" => 84); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { return array("mp4" => 79, "webm" => 86); } if ( - empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { return array("mp4" => 78, "webm" => 85); } if (empty($advancedCustom->doNotShowEncoderResolutionLow)) { @@ -519,65 +495,60 @@ function decideFormatOrder() { error_log("decideFormatOrder: auto HLS"); $_SESSION['format'] = 'inputAutoHLS'; return (6); - } else - if (!empty($_POST['inputAutoMP4']) && strtolower($_POST['inputAutoMP4']) !== "false") { + } elseif (!empty($_POST['inputAutoMP4']) && strtolower($_POST['inputAutoMP4']) !== "false") { error_log("decideFormatOrder: auto MP4"); $_SESSION['format'] = 'inputAutoMP4'; return (7); - } else - if (empty($global['disableWebM']) && !empty($_POST['inputAutoWebm']) && strtolower($_POST['inputAutoWebm']) !== "false") { + } elseif (empty($global['disableWebM']) && !empty($_POST['inputAutoWebm']) && strtolower($_POST['inputAutoWebm']) !== "false") { error_log("decideFormatOrder: auto WebM"); $_SESSION['format'] = 'inputAutoWebm'; return (8); - } else - if (!empty($_POST['inputAutoAudio']) && strtolower($_POST['inputAutoAudio']) !== "false") { + } elseif (!empty($_POST['inputAutoAudio']) && strtolower($_POST['inputAutoAudio']) !== "false") { error_log("decideFormatOrder: auto Audio"); $_SESSION['format'] = 'inputAutoAudio'; return (60); - } else - if (!empty($_POST['inputHLS']) && strtolower($_POST['inputHLS']) !== "false") { + } elseif (!empty($_POST['inputHLS']) && strtolower($_POST['inputHLS']) !== "false") { error_log("decideFormatOrder: Multi bitrate HLS encrypted"); return (9); - } else - if (empty($_POST['webm']) || $_POST['webm'] === 'false') { + } elseif (empty($_POST['webm']) || $_POST['webm'] === 'false') { // mp4 only if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { // all resolutions error_log("decideFormatOrder: MP4 All"); return (80); - } else if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + } elseif ( + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 Low - HD"); return (79); - } else if ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + } elseif ( + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 SD - HD"); return (78); - } else if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + } elseif ( + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { error_log("decideFormatOrder: MP4 Low SD"); return (77); - } else if ( - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + } elseif ( + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 HD"); return (76); - } else if ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + } elseif ( + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { error_log("decideFormatOrder: MP4 SD"); return (75); - } else if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' + } elseif ( + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' ) { error_log("decideFormatOrder: MP4 LOW"); return (74); @@ -588,36 +559,36 @@ function decideFormatOrder() { } else { // mp4 and webm if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { // all resolutions return (87); - } else if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + } elseif ( + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (86); - } else if ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + } elseif ( + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (85); - } else if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + } elseif ( + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { return (84); - } else if ( - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + } elseif ( + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (83); - } else if ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + } elseif ( + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { return (82); - } else if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' + } elseif ( + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' ) { return (81); } else { @@ -631,7 +602,7 @@ function decideFormatOrder() { function getUpdatesFiles() { global $config, $global; $files1 = scandir($global['systemRootPath'] . "update"); - $updateFiles = array(); + $updateFiles = []; foreach ($files1 as $value) { preg_match("/updateDb.v([0-9.]*).sql/", $value, $match); if (!empty($match)) { @@ -655,8 +626,8 @@ function ip_is_private($ip) { $long_ip = ip2long($ip); if ($long_ip != -1) { - foreach ($pri_addrs AS $pri_addr) { - list ($start, $end) = explode('|', $pri_addr); + foreach ($pri_addrs as $pri_addr) { + list($start, $end) = explode('|', $pri_addr); // IF IS PRIVATE if ($long_ip >= ip2long($start) && $long_ip <= ip2long($end)) { @@ -697,7 +668,8 @@ function zipDirectory($destinationFile) { // Create recursive directory iterator /** @var SplFileInfo[] $files */ $files = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY + new RecursiveDirectoryIterator($rootPath), + RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $name => $file) { @@ -810,10 +782,11 @@ function rrmdir($dir) { $objects = scandir($dir); foreach ($objects as $object) { if ($object != "." && $object != "..") { - if (is_dir($dir . "/" . $object)) + if (is_dir($dir . "/" . $object)) { rrmdir($dir . "/" . $object); - else + } else { unlink($dir . "/" . $object); + } } } @rmdir($dir); @@ -886,7 +859,7 @@ function _session_id($PHPSESSID) { } } -function _session_start(Array $options = array()) { +function _session_start(array $options = array()) { global $global; try { if (session_status() == PHP_SESSION_NONE) { @@ -978,7 +951,7 @@ function execAsync($command) { // If windows, else if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { //$pid = system($command . " > NUL"); - //pclose($pid = popen("start /B ". $command, "r")); + //pclose($pid = popen("start /B ". $command, "r")); error_log($command); $pid = exec($command, $output, $retval); error_log('execAsync: ' . json_encode($output) . ' ' . $retval); @@ -1059,9 +1032,9 @@ function isURL200($url) { $result = false; foreach ($headers as $value) { if ( - strpos($value, '200') || - strpos($value, '302') || - strpos($value, '304') + strpos($value, '200') || + strpos($value, '302') || + strpos($value, '304') ) { $result = true; } @@ -1131,8 +1104,8 @@ function isURLaVODVideo($url) { } // If the main playlist has an ENDLIST tag, it's a VOD - if (preg_match('/#EXT-X-ENDLIST/i', $content) || - preg_match('/#EXT-X-PLAYLIST-TYPE:\s*VOD/i', $content) || + if (preg_match('/#EXT-X-ENDLIST/i', $content) || + preg_match('/#EXT-X-PLAYLIST-TYPE:\s*VOD/i', $content) || preg_match('/URI=".+enc_[0-9a-z]+.key/i', $content)) { return true; // VOD content } @@ -1181,16 +1154,16 @@ function _rename($originalFile, $newName) { return false; } -function _sys_get_temp_dir(){ +function _sys_get_temp_dir() { global $global, $_sys_get_temp_dir; - if(isset($_sys_get_temp_dir)){ + if (isset($_sys_get_temp_dir)) { return $_sys_get_temp_dir; } $dir = sys_get_temp_dir(); $tmpfname = tempnam($dir, 'test'); - if(!file_put_contents($tmpfname, time())){ + if (!file_put_contents($tmpfname, time())) { $dir = "{$global['systemRootPath']}videos/tmp/"; - if(!is_dir($dir)){ + if (!is_dir($dir)) { mkdir($dir, 0777, true); } } @@ -1199,38 +1172,37 @@ function _sys_get_temp_dir(){ return $dir; } -function _get_temp_file($prefix=''){ +function _get_temp_file($prefix='') { return tempnam(_sys_get_temp_dir(), $prefix); } -function convertDates(){ - if(empty($_REQUEST['timezone'])){ +function convertDates() { + if (empty($_REQUEST['timezone'])) { return false; } $timezone = $_REQUEST['timezone']; - + unset($_REQUEST['timezone']); - if(!empty($_GET['releaseDate'])){ + if (!empty($_GET['releaseDate'])) { $_GET['releaseDate'] = convertToServerDate($_GET['releaseDate'], $timezone); } - if(!empty($_POST['releaseDate'])){ + if (!empty($_POST['releaseDate'])) { $_POST['releaseDate'] = convertToServerDate($_POST['releaseDate'], $timezone); } - if(!empty($_REQUEST['releaseDate'])){ + if (!empty($_REQUEST['releaseDate'])) { $_REQUEST['releaseDate'] = convertToServerDate($_REQUEST['releaseDate'], $timezone); } } -function convertToServerDate($originalDateTime, $fromTimezone){ - +function convertToServerDate($originalDateTime, $fromTimezone) { $serverTimezone = date_default_timezone_get(); $dateTime = new DateTime($originalDateTime, new DateTimeZone($fromTimezone)); - // Convert the datetime to the server's timezone - $dateTime->setTimezone(new DateTimeZone($serverTimezone)); - - // Print the converted datetime - return $dateTime->format('Y-m-d H:i:s'); -} \ No newline at end of file + // Convert the datetime to the server's timezone + $dateTime->setTimezone(new DateTimeZone($serverTimezone)); + + // Print the converted datetime + return $dateTime->format('Y-m-d H:i:s'); +} diff --git a/objects/getImage.php b/objects/getImage.php index 07629b127..0386ebc86 100644 --- a/objects/getImage.php +++ b/objects/getImage.php @@ -1,7 +1,8 @@ = $ageInSeconds)){ + if (!$filemtime || (time() - $filemtime >= $ageInSeconds)) { return true; } return false; } -if(empty($_GET['format'])){ +if (empty($_GET['format'])) { $_GET['format'] = 'jpg'; } @@ -35,53 +37,52 @@ function fileOlderThen($file, $ageInSeconds){ testTime(__LINE__); -if(preg_match('/(youtube.com|youtu.be|vimeo.com|rumble.com)/', $url)){ +if (preg_match('/(youtube.com|youtu.be|vimeo.com|rumble.com)/', $url)) { require_once $global['systemRootPath'] . 'objects/Encoder.php'; header('Content-Type: image/jpg'); die(Encoder::getThumbsFromLink($url)); -}else -if($_GET['format'] === 'png'){ +} elseif ($_GET['format'] === 'png') { header('Content-Type: image/x-png'); $destination .= ".".$_GET['format']; $exec = get_ffmpeg()." -i \"{$url}\" -f image2 " . "-vf ".getFFmpegScaleToForceOriginalAspectRatio(640, 360)." " . "-vframes 1 -y {$destination}"; $destinationTmpFile = "{$global['systemRootPath']}view/img/OnAir.png"; -}else if($_GET['format'] === 'jpg'){ +} elseif ($_GET['format'] === 'jpg') { header('Content-Type: image/jpg'); $destination .= ".".$_GET['format']; $exec = get_ffmpeg()." -i \"{$url}\" -f image2 " . "-vf ".getFFmpegScaleToForceOriginalAspectRatio(640, 360)." " . "-vframes 1 -y {$destination}"; $destinationTmpFile = "{$global['systemRootPath']}view/img/OnAir.jpg"; -}else if($_GET['format'] === 'gif'){ +} elseif ($_GET['format'] === 'gif') { // gif image has the double lifetime $cache_life*=2; header('Content-Type: image/gif'); - $destination .= ".".$_GET['format']; + $destination .= ".".$_GET['format']; //Generate a palette: $ffmpegPallet =get_ffmpeg()." -y -t 3 -i \"{$url}\" -vf fps=10,".getFFmpegScaleToForceOriginalAspectRatio(320, 180).":flags=lanczos,palettegen {$destinationPallet}"; $ffmpegPallet = removeUserAgentIfNotURL($ffmpegPallet); $exec =get_ffmpeg()." -y -t 3 -i \"{$url}\" -i {$destinationPallet} -filter_complex \"fps=10,".getFFmpegScaleToForceOriginalAspectRatio(320, 180).":flags=lanczos[x];[x][1:v]paletteuse\" {$destination}"; $destinationTmpFile = "{$global['systemRootPath']}view/img/notfound.gif"; -}else if($_GET['format'] === 'webp'){ +} elseif ($_GET['format'] === 'webp') { // gif image has the double lifetime $cache_life*=2; header('Content-Type: image/webp'); - $destination .= ".".$_GET['format']; + $destination .= ".".$_GET['format']; $exec =get_ffmpeg()." -y -ss 3 -t 3 -i \"{$url}\" -vcodec libwebp -lossless 1 -vf fps=10,".getFFmpegScaleToForceOriginalAspectRatio(640, 360)." -q 60 -preset default -loop 0 -an -vsync 0 {$destination}"; $destinationTmpFile = "{$global['systemRootPath']}view/img/notfound.gif"; -}else{ +} else { error_log("ERROR Destination get Image {$_GET['format']} not suported"); die(); } testTime(__LINE__); $httpReferer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null; -if(!is_readable($destination)){ +if (!is_readable($destination)) { echo url_get_contents($destinationTmpFile); error_log("getImage {$httpReferer} Destination get Temp Image from {$url} {$_GET['format']}: {$destinationTmpFile}"); -}else{ +} else { // flush old image then encode echo url_get_contents($destination); //error_log("getImage {$httpReferer} Destination get Image from {$url} {$_GET['format']}: {$destination}"); @@ -92,25 +93,25 @@ function fileOlderThen($file, $ageInSeconds){ ob_flush(); $exec = removeUserAgentIfNotURL($exec); -if(!file_exists($destination) || fileOlderThen($destination, $cache_life) || !empty($_GET['renew'])){ - if(!empty($ffmpegPallet)){ +if (!file_exists($destination) || fileOlderThen($destination, $cache_life) || !empty($_GET['renew'])) { + if (!empty($ffmpegPallet)) { execAsync($ffmpegPallet); - error_log("Create Gif Pallet: {$ffmpegPallet}"); - if(is_readable($destinationPallet)){ + error_log("Create Gif Pallet: {$ffmpegPallet}"); + if (is_readable($destinationPallet)) { execAsync($exec); error_log("Create Gif with Ppallet: {$exec}"); - }else{ + } else { $cmdGif = get_ffmpeg()." -y -t 3 -i \"{$url}\" -vf fps=10,".getFFmpegScaleToForceOriginalAspectRatio(320, 180)." {$destination}"; $cmdGif = removeUserAgentIfNotURL($cmdGif); execAsync($cmdGif); error_log("Create Gif no Pallet: {$cmdGif}"); } - }else{ + } else { execAsync($exec); error_log("Exec get Image: {$exec} ".__FILE__.' '. json_encode($_SERVER['REMOTE_ADDR'])); } -}else{ - +} else { + } testTime(__LINE__); -die(); \ No newline at end of file +die(); diff --git a/objects/getImageMP4.php b/objects/getImageMP4.php index 30d808c7e..7b032e58c 100644 --- a/objects/getImageMP4.php +++ b/objects/getImageMP4.php @@ -20,7 +20,7 @@ function testTime($line) { header('Access-Control-Allow-Origin: *'); $url = base64_decode($_GET['base64Url']); -if(!isURLaVODVideo($url)){ +if (!isURLaVODVideo($url)) { error_log("ERROR URL is not a VOD {$url}"); die(); } @@ -42,15 +42,15 @@ function testTime($line) { $url = escapeshellarg($url); error_log("getImageMP4 Starts: {$url}"); -if ($type == 'audio') { +if ($type === 'audio') { //ffmpeg -i inputfile.mp3 -lavfi showspectrumpic=s=800x400:mode=separate spectrogram.png if ($_GET['format'] === 'jpg') { header('Content-Type: image/jpg'); $destination .= "." . $_GET['format']; - } else if ($_GET['format'] === 'gif') { + } elseif ($_GET['format'] === 'gif') { header('Content-Type: image/gif'); $destination .= "." . $_GET['format']; - } else if ($_GET['format'] === 'webp') { + } elseif ($_GET['format'] === 'webp') { // gif image has the double lifetime $cache_life *= 2; header('Content-Type: image/webp'); @@ -65,7 +65,7 @@ function testTime($line) { $cmd = removeUserAgentIfNotURL($cmd); exec($cmd); error_log("Create image from audio: {$cmd}"); -} else if(preg_match('/(youtube.com|youtu.be|vimeo.com|rumble.com)/', $url)){ +} elseif (preg_match('/(youtube.com|youtu.be|vimeo.com|rumble.com)/', $url)) { require_once $global['systemRootPath'] . 'objects/Encoder.php'; header('Content-Type: image/jpg'); die(Encoder::getThumbsFromLink($url)); @@ -82,7 +82,7 @@ function testTime($line) { $exec = get_ffmpeg() . " -ss {$duration} -i {$url} -f image2 " . "-vf ".getFFmpegScaleToForceOriginalAspectRatio(640, 360)." " . "-vframes 1 -y {$destination}"; - } else if ($_GET['format'] === 'gif') { + } elseif ($_GET['format'] === 'gif') { // gif image has the double lifetime $cache_life *= 2; header('Content-Type: image/gif'); @@ -90,7 +90,7 @@ function testTime($line) { //Generate a palette: $ffmpegPallet = get_ffmpeg() . " -y -ss {$duration} -t 3 -i {$url} -vf fps=10,".getFFmpegScaleToForceOriginalAspectRatio(320, 180).":flags=lanczos,palettegen {$destinationPallet}"; $exec = get_ffmpeg() . " -y -ss {$duration} -t 3 -i {$url} -i {$destinationPallet} -filter_complex \"fps=10,".getFFmpegScaleToForceOriginalAspectRatio(320, 180).":flags=lanczos[x];[x][1:v]paletteuse\" {$destination}"; - } else if ($_GET['format'] === 'webp') { + } elseif ($_GET['format'] === 'webp') { // gif image has the double lifetime $cache_life *= 2; header('Content-Type: image/webp'); @@ -101,7 +101,7 @@ function testTime($line) { error_log("ERROR Destination get Image {$_GET['format']} not suported"); die(); } - + $exec = removeUserAgentIfNotURL($exec); testTime(__LINE__); if (!empty($ffmpegPallet)) { diff --git a/objects/getLinkInfo.json.php b/objects/getLinkInfo.json.php index ed41cc783..da555985e 100644 --- a/objects/getLinkInfo.json.php +++ b/objects/getLinkInfo.json.php @@ -3,8 +3,8 @@ header('Content-Type: application/json'); require_once dirname(__FILE__) . '/../videos/configuration.php'; require_once '../objects/Encoder.php'; -if(empty($_GET['base64Url'])){ - +if (empty($_GET['base64Url'])){ + } $link = base64_decode($_GET['base64Url']); //echo base64_decode($_GET['base64Url']), "
    "; @@ -23,7 +23,7 @@ $obj->msg = $title['output']; $obj->title = $title['output']; -if($title['error']){ +if ($title['error']){ $obj->title = false; } @@ -33,4 +33,4 @@ $obj->thumbs64 = base64_encode(Encoder::getThumbsFromLink($link)); $resp = json_encode($obj); -echo $resp; \ No newline at end of file +echo $resp; diff --git a/objects/include_config.php b/objects/include_config.php index 5270034c3..6d39edae5 100644 --- a/objects/include_config.php +++ b/objects/include_config.php @@ -1,7 +1,7 @@ error = "User and Password can not be blank"; - die(json_encode($object)); +if (empty($_POST['user']) || empty($_POST['pass'])) { + $object->error = 'User and Password can not be blank'; + die(json_encode($object)); } -if(!Streamer::isURLAllowed($_POST['siteURL'])){ - $object->error = "This streamer site is not allowed"; +if (!Streamer::isURLAllowed($_POST['siteURL'])) { + $object->error = 'This streamer site is not allowed'; die(json_encode($object)); } -error_log("login.json: Login::run"); +error_log('login.json: Login::run'); Login::run($_POST['user'], $_POST['pass'], $_POST['siteURL'], $_POST['encodedPass']); -if(!empty($_SESSION['login'])){ +if (!empty($_SESSION['login'])) { $json = json_encode($_SESSION['login']); -}else{ - $object->error = "Your site is banned"; +} else { + $object->error = 'Your site is banned'; die(json_encode($object)); } -header("Content-length: ". strlen($json)); -echo $json; \ No newline at end of file +header('Content-length: ' . strlen($json)); +echo $json; diff --git a/objects/security.php b/objects/security.php index 71533cac1..0d91ef13f 100644 --- a/objects/security.php +++ b/objects/security.php @@ -2,7 +2,6 @@ require_once $global['systemRootPath'] . 'objects/functions.php'; - // filter some security here $securityFilter = array('error', 'catName', 'type', 'channelName', 'captcha', 'showOnly', 'key', 'link', 'email', 'country', 'region', 'videoName'); $securityFilterInt = array('isAdmin', 'priority', 'totalClips', 'rowCount'); @@ -10,8 +9,6 @@ $securityRemoveNonChars = array('resolution', 'format', 'videoDirectory'); $filterURL = array('videoURL', 'siteURL', 'redirectUri', 'encoderURL'); - - if (!empty($_FILES)) { foreach ($_FILES as $key => $value) { $_FILES[$key]['name'] = preg_replace('/[^a-z0-9.,()+& #-]/i', '', cleanString($_FILES[$key]['name'])); @@ -73,15 +70,15 @@ // all variables with _id at the end will be forced to be interger foreach ($scanThis as $key => $value) { if (preg_match('/_id$/i', $key)) { - if(empty($value)){ + if (empty($value)){ $scanThis[$key] = 0; - }else + }else if (is_numeric($value)) { $scanThis[$key] = intval($value); } else { - if(is_string($value)){ + if (is_string($value)){ $json = json_decode($value); - if(empty($json)){ + if (empty($json)){ $json = json_decode("[$value]"); } }else{ diff --git a/view/index_formats.php b/view/index_formats.php index e44467a4e..65024b9ce 100644 --- a/view/index_formats.php +++ b/view/index_formats.php @@ -83,9 +83,9 @@ if (empty($_COOKIE['format'])) { $_COOKIE['format'] = 'inputAutoHLS'; } - ?> + ?>
    - >
    @@ -101,7 +101,7 @@ if (empty($_COOKIE['format'])) { $_COOKIE['format'] = 'inputAutoMP4'; } - ?> + ?>
    > @@ -116,7 +116,7 @@ } if (empty($global['disableWebM']) && empty($advancedCustom->doNotShowEncoderAutomaticWebm)) { $countEncodeOptions++; - ?> + ?>
    > @@ -131,7 +131,7 @@ } if (empty($advancedCustom->doNotShowEncoderAutomaticAudio)) { // disabled for now $countEncodeOptions++; - ?> + ?>
    > @@ -144,12 +144,12 @@
    + ?>
    - + \ No newline at end of file diff --git a/view/queue.json.php b/view/queue.json.php index 50eb703da..f903c3411 100644 --- a/view/queue.json.php +++ b/view/queue.json.php @@ -6,9 +6,9 @@ require_once '../objects/Login.php'; header('Content-Type: application/json'); $rows = Encoder::getAll(true); -$resolutions = array('Low', 'SD', 'HD'); -if(!is_array($rows)){ - $rows = array(); +$resolutions = ['Low', 'SD', 'HD']; +if (!is_array($rows)) { + $rows = []; } foreach ($rows as $key => $value) { $f = new Format($rows[$key]['formats_id']); @@ -21,19 +21,19 @@ foreach ($files as $file) { $rows[$key]['mp4_filesize_'] = filesize($file); } - + $file_ = Encoder::getTmpFileName($rows[$key]['id'], 'm3u8', $value2); if (file_exists($file_)) { $rows[$key]['hls_filesize_' . $value2] = filesize($file_); $rows[$key]['hls_filesize_human_' . $value2] = humanFileSize($rows[$key]['mp4_filesize_' . $value2]); } - + $file_ = Encoder::getTmpFileName($rows[$key]['id'], 'zip', $value2); if (file_exists($file_)) { $rows[$key]['zip_filesize_' . $value2] = filesize($file_); $rows[$key]['zip_filesize_human_' . $value2] = humanFileSize($rows[$key]['mp4_filesize_' . $value2]); } - + $file_ = Encoder::getTmpFileName($rows[$key]['id'], 'mp4', $value2); if (file_exists($file_)) { $rows[$key]['mp4_filesize_' . $value2] = filesize($file_); @@ -45,13 +45,13 @@ $rows[$key]['webm_filesize_' . $value2] = filesize($file_); $rows[$key]['webm_filesize_human_' . $value2] = humanFileSize($rows[$key]['webm_filesize_' . $value2]); } - } - + } + if (!empty($file) && is_dir($file)) { $rows[$key]['hls_filesize'] = directorysize($file); $rows[$key]['hls_filesize_human'] = humanFileSize($rows[$key]['hls_filesize']); } - + $rows[$key]['encoding_status'] = Encoder::getVideoConversionStatus($rows[$key]['id']); } $rows = array_values($rows); diff --git a/view/queue.php b/view/queue.php index 2ea8fdf00..6d63c6287 100644 --- a/view/queue.php +++ b/view/queue.php @@ -54,7 +54,7 @@ if (!empty($_POST['audioOnly']) && $_POST['audioOnly'] !== 'false') { if (!empty($_POST['spectrum']) && $_POST['spectrum'] !== 'false') { - $e->setFormats_idFromOrder(70); // video to spectrum [(6)MP4 to MP3] -> [(5)MP3 to spectrum] -> [(2)MP4 to webm] + $e->setFormats_idFromOrder(70); // video to spectrum [(6)MP4 to MP3] -> [(5)MP3 to spectrum] -> [(2)MP4 to webm] } else { $e->setFormats_idFromOrder(71); } @@ -79,7 +79,7 @@ } } $e->setReturn_vars(json_encode($obj)); - + error_log("queue: will save"); $id = $e->save(); error_log("queue: save done [$id]"); diff --git a/view/saveConfig.php b/view/saveConfig.php index bd3196788..1320526f7 100644 --- a/view/saveConfig.php +++ b/view/saveConfig.php @@ -9,7 +9,7 @@ $obj = new stdClass(); $obj->error = true; -if(!Login::isAdmin()){ +if (!Login::isAdmin()){ $obj->msg = "You are not admin"; die(json_encode($obj)); } @@ -17,7 +17,7 @@ if (empty($global['disableConfigurations'])) { if (!empty($_POST['formats'])) { foreach ($_POST['formats'] as $value) { - if (empty($value)) { + if (empty($value)) { continue; } $id = $value[0]; diff --git a/view/upload.php b/view/upload.php index c459028af..5b8673968 100644 --- a/view/upload.php +++ b/view/upload.php @@ -1,5 +1,5 @@ msg = "This user can not upload files"; - } else - if (!($streamers_id = Login::getStreamerId())) { + } elseif (!($streamers_id = Login::getStreamerId())) { $obj->msg = "There is no streamer site"; } else { $e->setStreamers_id($streamers_id); @@ -65,7 +64,7 @@ if (!empty($_POST['audioOnly']) && $_POST['audioOnly'] !== 'false') { if (!empty($_POST['spectrum']) && $_POST['spectrum'] !== 'false') { error_log("Upload.php set format 11"); - $e->setFormats_id(11); // video to spectrum [(6)MP4 to MP3] -> [(5)MP3 to spectrum] -> [(2)MP4 to webm] + $e->setFormats_id(11); // video to spectrum [(6)MP4 to MP3] -> [(5)MP3 to spectrum] -> [(2)MP4 to webm] } else { error_log("Upload.php set format 12"); $e->setFormats_id(12); @@ -78,15 +77,13 @@ if (!empty($_POST['inputAutoHLS']) && strtolower($_POST['inputAutoHLS']) !== "false") { error_log("Upload.php set format 33"); $e->setFormats_id(33); - } else - if (!empty($_POST['inputAutoMP4']) && strtolower($_POST['inputAutoMP4']) !== "false") { + } elseif (!empty($_POST['inputAutoMP4']) && strtolower($_POST['inputAutoMP4']) !== "false") { error_log("Upload.php set format 33"); $e->setFormats_id(34); - } else - if (empty($global['disableWebM']) && !empty($_POST['inputAutoWebm']) && strtolower($_POST['inputAutoWebm']) !== "false") { + } elseif (empty($global['disableWebM']) && !empty($_POST['inputAutoWebm']) && strtolower($_POST['inputAutoWebm']) !== "false") { error_log("Upload.php set format 35"); $e->setFormats_id(35); - } else if (!empty($_POST['spectrum']) && $_POST['spectrum'] !== 'false') { + } elseif (!empty($_POST['spectrum']) && $_POST['spectrum'] !== 'false') { error_log("Upload.php set format 5"); $e->setFormats_id(5); } else { @@ -94,8 +91,9 @@ $e->setFormats_id(3); } } - if (!empty($_POST['override_status'])) + if (!empty($_POST['override_status'])) { $e->setOverride_status($_POST['override_status']); + } $obj = new stdClass(); $obj->videos_id = 0; diff --git a/view/videosListToLive.php b/view/videosListToLive.php index 5cce09017..be2847bac 100644 --- a/view/videosListToLive.php +++ b/view/videosListToLive.php @@ -47,9 +47,9 @@ $dir = "{$videosListToLivePath}{$domain}/"; make_path($dir); -// clear all get +// clear all get foreach ($_REQUEST as $key => $value) { - if(empty($_REQUEST[$value])){ + if (empty($_REQUEST[$value])) { continue; } $_REQUEST[$value] = str_replace('/[^a-z0-9.:/-]/i', '', trim($_REQUEST[$value])); @@ -109,12 +109,12 @@ } //var_dump($json); $counter = 0; -$videos = array(); +$videos = []; -$ffmpegInputs = array(); -$ffmpegFilters1 = array(); -$ffmpegFilters2 = array(); -$videos = array(); +$ffmpegInputs = []; +$ffmpegFilters1 = []; +$ffmpegFilters2 = []; +$videos = []; $timer = new stdClass(); $timer->videos_id = -1; @@ -143,7 +143,7 @@ eval('$ffmpegFilters2[] = " ' . $complexFilter2 . ' ";'); $videos[] = $value; $counter++; - } else if (!empty($recreateAllVideos) || !file_exists($outputFile)) { + } elseif (!empty($recreateAllVideos) || !file_exists($outputFile)) { if (isAudio($value->path)) { $cmd = get_ffmpeg() . " -i \"{$value->path}\" -filter_complex '[0:a]showwaves=s={$scale_width}x{$scale_height}:mode=line,format=yuv420p[v]' -map '[v]' -map 0:a " . " {$ffmpegParameters} -y {$outputFile} "; @@ -246,7 +246,7 @@ $channel->key = $_SESSION['login']->streamKey; $channel->live_servers_id = $obj->live_servers_id; $channel->embedlink = "{$channel->link}&embed=1"; -$channel->programme = array(); +$channel->programme = []; foreach ($videos as $value) { $programme = new stdClass(); @@ -298,13 +298,14 @@ die(json_encode($obj)); -function __exec($cmd, $async = false) { +function __exec($cmd, $async = false) +{ _log($cmd); ob_flush(); if (!$async) { if (isWindows()) { //$pid = system($command . " > NUL"); - pclose($pid = popen("start /B ". $cmd, "r")); + pclose($pid = popen("start /B ". $cmd, "r")); $return_val = 0; } else { $pid = exec($cmd . " > /dev/null 2>&1 & echo $!; ", $output, $return_val); @@ -319,18 +320,21 @@ function __exec($cmd, $async = false) { } } -function _log($msg) { +function _log($msg) +{ global $logFile; error_log("videoListToLive: " . $msg); //echo "
    " . $msg . "
    " . PHP_EOL; return file_put_contents($logFile, "[" . date("Y-m-d H:i:s") . "] " . $msg . PHP_EOL, FILE_APPEND); } -function isAudio($source) { +function isAudio($source) +{ return empty(isVideo($source)); } -function isVideo($source) { +function isVideo($source) +{ $cmd = get_ffprobe()." -i \"{$source}\" -show_streams -select_streams v:0 -show_entries stream=width,height -loglevel error"; exec($cmd . " 2>&1", $output, $return_val); $return = array("width" => 0, "height" => 0); @@ -342,8 +346,7 @@ function isVideo($source) { if (!empty($matches[1])) { $return["width"] = intval($matches[1]); } - } else - if (preg_match('/height=([0-9]+)/', $value, $matches)) { + } elseif (preg_match('/height=([0-9]+)/', $value, $matches)) { if (!empty($matches[1])) { $return["height"] = intval($matches[1]); } @@ -357,27 +360,28 @@ function isVideo($source) { return false; } -function createWaterMark($webSiteRootURL, $path) { +function createWaterMark($webSiteRootURL, $path) +{ global $scale_width,$scale_height; $imgPath = "{$path}watermark.png"; if (file_exists($imgPath)) { //return $imgPath; } - $backGround = imagecreatetruecolor($scale_width,$scale_height); + $backGround = imagecreatetruecolor($scale_width, $scale_height); imagesavealpha($backGround, true); $color = imagecolorallocatealpha($backGround, 0, 0, 0, 127); imagefill($backGround, 0, 0, $color); $logo = imagecreatefrompng("{$webSiteRootURL}videos/favicon.png"); - //$logo = imagecreatefrompng("{$webSiteRootURL}videos/userPhoto/logo.png"); + //$logo = imagecreatefrompng("{$webSiteRootURL}videos/userPhoto/logo.png"); $opacity = 0.4; imagealphablending($logo, false); // imagesavealpha can only be used by doing this for some reason - imagesavealpha($logo, true); // this one helps you keep the alpha. + imagesavealpha($logo, true); // this one helps you keep the alpha. $transparency = 1 - $opacity; - imagefilter($logo, IMG_FILTER_COLORIZE, 0, 0, 0, 127 * $transparency); // the fourth parameter is alpha + imagefilter($logo, IMG_FILTER_COLORIZE, 0, 0, 0, 127 * $transparency); // the fourth parameter is alpha imagecopyresized($backGround, $logo, 1220, 5, 0, 0, 50, 50, 180, 180); - //imagecopy($backGround, $logo, 1000, 25, 0, 0, 250, 70); + //imagecopy($backGround, $logo, 1000, 25, 0, 0, 250, 70); imagepng($backGround, $imgPath); return $imgPath; diff --git a/view/watermark.php b/view/watermark.php index 6a51f6ac3..db4ab09c1 100644 --- a/view/watermark.php +++ b/view/watermark.php @@ -22,7 +22,7 @@ session_write_close(); if (!empty($global['mysqli'])) { - + /** * @var array $global * @var object $global['mysqli'] @@ -175,7 +175,7 @@ if ($obj->isMobile) { $encFileURL .= "?isMobile=1"; } - + if (canConvert($outputPath)) { //$cmd = "rm -fr {$outputTextPath}"; // this will make other process stops and saves CPU resources //__exec($cmd); @@ -201,14 +201,14 @@ //$randomizeTimeX = random_int(100, 180); //$randomizeTimeY = random_int(100, 180); - $commands = array(); + $commands = []; $allFiles = getAllTSFilesInDir($localFileDownloadDir); $watermarkingArray = getRandomSymlinkTSFileArray($localFileDownloadDir, $maxElements); error_log("Watermark: we will watermark " . count($watermarkingArray) . " " . json_encode($watermarkingArray)); - //$allFiles = array(); + //$allFiles = []; $timeSpent = 0; $count = 0; $totalTimeStart = microtime(true); @@ -258,13 +258,13 @@ if (file_exists("{$outputPath}/003.ts")) { //error_log("Watermark: file 003.ts"); break; - } else if ($tries > 10) { + } elseif ($tries > 10) { //error_log("Watermark: file tries > 10"); break; } sleep(1); } - } else if (file_exists($jsonFile)) { + } elseif (file_exists($jsonFile)) { $json = json_decode(file_get_contents($jsonFile)); if (is_object($json)) { $json->lastUpdate = time(); @@ -303,13 +303,13 @@ function getIndexM3U8($tries = 0, $getFirstSegments = 0) { } else { echo $line; } - } else if (preg_match('/[0-9]+.ts/', $line)) { + } elseif (preg_match('/[0-9]+.ts/', $line)) { $count++; if (!empty($getFirstSegments) && $count > $getFirstSegments) { return false; } echo "{$outputURL}/{$line}"; - } else if (preg_match('/enc_watermarked.key/', $line)) { + } elseif (preg_match('/enc_watermarked.key/', $line)) { $json = json_decode(file_get_contents($jsonFile)); $isMobile = !empty($_REQUEST['isMobile']); if (is_object($json) && $isMobile) { @@ -328,7 +328,7 @@ function getIndexM3U8($tries = 0, $getFirstSegments = 0) { if (file_exists($keyInfoFile)) { unlink($keyInfoFile); } - } else if (is_dir($outputPath)) { + } elseif (is_dir($outputPath)) { echo "#EXTM3U #EXT-X-VERSION:3 @@ -369,7 +369,7 @@ function getIndexM3U8($tries = 0, $getFirstSegments = 0) { function getTSFiles($dir) { global $hls_time, $text, $outputURL; if ($dh = opendir($dir)) { - $files = array(); + $files = []; $ignoreFiles = array('.', '..', 'index.m3u8', 'enc_watermarked.key', '.keyInfo', '.obj.log'); while (($file = readdir($dh)) !== false) { if (!in_array($file, $ignoreFiles) && !preg_match('/.json/', $file)) { @@ -509,11 +509,11 @@ function canConvert($dir) { if (is_object($json) && !empty($json->pid)) { /* // if index exist or it still processing, do not convert again - if(file_exists($outputHLS_index)){ + if (file_exists($outputHLS_index)) { error_log("canConvert: $outputHLS_index exists"); return false; } - * + * */ if (!allTSFilesAreSymlinks($dir)) { error_log("canConvert: NOT allTSFilesAreSymlinks"); @@ -664,7 +664,7 @@ function getAllTSFilesInDir($dir) { if (!empty($getAllTSFilesInDir)) { return $getAllTSFilesInDir; } - $files = array(); + $files = []; if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if ($file == '.' || $file == '..' || !preg_match('/\.ts$/', $file)) { @@ -754,8 +754,8 @@ function createWatermarkFFMPEG($inputHLS_ts, $outputHLS_ts, $watermarkIt = true) //error_log("Watermark: {$inputHLS_ts} will have watermark"); @unlink($outputHLS_ts); $command .= " -vf \"drawtext=fontfile=font.ttf:fontsize={$watermark_fontsize}:fontcolor={$watermark_color}@{$watermark_opacity}:text='{$text}' " - . ' :x=if(eq(mod(n\,' . $randX . ')\,0)\,rand(0\,(W-tw))\,x) ' - . ' :y=if(eq(mod(n\,' . $randY . ')\,0)\,rand(0\,(H-th))\\,y) " ' + . ' :x=if (eq(mod(n\,' . $randX . ')\,0)\,rand(0\,(W-tw))\,x) ' + . ' :y=if (eq(mod(n\,' . $randY . ')\,0)\,rand(0\,(H-th))\\,y) " ' . " {$watermarkCodec} -copyts "; } else { if (file_exists($keyInfoFile) && file_exists($encFile)) { diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index f1c1ec667..754f870f6 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -17,8 +17,7 @@ Login::run($_GET['user'], $_GET['pass'], $_GET['webSiteRootURL'], true); } -function addVideo($link, $streamers_id, $title = "") -{ +function addVideo($link, $streamers_id, $title = "") { $obj = new stdClass(); // remove list parameter from $link = preg_replace('~(\?|&)list=[^&]*~', '$1', $link); @@ -68,11 +67,11 @@ function addVideo($link, $streamers_id, $title = "") $e->setPriority($s->getPriority()); //$e->setNotifyURL($global['AVideoURL'] . "aVideoEncoder.json"); - $encoders_ids = array(); + $encoders_ids = []; if (!empty($_POST['audioOnly']) && $_POST['audioOnly'] !== 'false') { if (!empty($_POST['spectrum']) && $_POST['spectrum'] !== 'false') { - $e->setFormats_idFromOrder(70); // video to spectrum [(6)MP4 to MP3] -> [(5)MP3 to spectrum] -> [(2)MP4 to webm] + $e->setFormats_idFromOrder(70); // video to spectrum [(6)MP4 to MP3] -> [(5)MP3 to spectrum] -> [(2)MP4 to webm] } else { $e->setFormats_idFromOrder(71); } From e080ac1de2959664aab644382c010199a6d742fd Mon Sep 17 00:00:00 2001 From: Caleb Mazalevskis Date: Fri, 21 Apr 2023 01:30:26 +0800 Subject: [PATCH 072/416] Not needed file. --- model/EncoderModel.mwb.bak | Bin 15618 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 model/EncoderModel.mwb.bak diff --git a/model/EncoderModel.mwb.bak b/model/EncoderModel.mwb.bak deleted file mode 100644 index 381f1b7e5baaeda6fc416d795aa60ae0b09a8dcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15618 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 From 2a1010cca97a09bc1aff7f13224cdf39490fd7d5 Mon Sep 17 00:00:00 2001 From: Caleb Mazalevskis Date: Fri, 21 Apr 2023 01:33:56 +0800 Subject: [PATCH 073/416] Refactor. --- install/deleteSystemdPrivate.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/install/deleteSystemdPrivate.php b/install/deleteSystemdPrivate.php index 79efc3daa..0bb868405 100644 --- a/install/deleteSystemdPrivate.php +++ b/install/deleteSystemdPrivate.php @@ -3,21 +3,21 @@ die('Command Line only'); } -function humanFileSize($size, $unit = "") -{ - if ((!$unit && $size >= 1 << 30) || $unit == "GB") { - return number_format($size / (1 << 30), 2) . "GB"; +function humanFileSize($size, $unit = '') { + + if ((!$unit && $size >= 1 << 30) || $unit === 'GB') { + return number_format($size / (1 << 30), 2) . 'GB'; } - if ((!$unit && $size >= 1 << 20) || $unit == "MB") { - return number_format($size / (1 << 20), 2) . "MB"; + if ((!$unit && $size >= 1 << 20) || $unit === 'MB') { + return number_format($size / (1 << 20), 2) . 'MB'; } - if ((!$unit && $size >= 1 << 10) || $unit == "KB") { - return number_format($size / (1 << 10), 2) . "KB"; + if ((!$unit && $size >= 1 << 10) || $unit === 'KB') { + return number_format($size / (1 << 10), 2) . 'KB'; } - return number_format($size) . " bytes"; + return number_format($size) . ' bytes'; } set_time_limit(300); @@ -40,5 +40,5 @@ function humanFileSize($size, $unit = "") } $humanFSize = humanFileSize($totalFilesize); -echo " ----- " . PHP_EOL; +echo ' ----- ' . PHP_EOL; echo "Total deleted {$humanFSize}" . PHP_EOL; From fdbb1d568554de3668e51e0d86962592fb77ca4d Mon Sep 17 00:00:00 2001 From: Caleb Mazalevskis Date: Fri, 21 Apr 2023 01:36:17 +0800 Subject: [PATCH 074/416] Refactor. --- locale/function.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/locale/function.php b/locale/function.php index 73d3bf551..429b16617 100644 --- a/locale/function.php +++ b/locale/function.php @@ -5,7 +5,7 @@ // Set Language variable if (isset($_POST['lang']) && !empty($_POST['lang'])) { $_SESSION['lang'] = $_POST['lang']; - if (isset($_SESSION['lang']) && $_SESSION['lang'] == $_POST['lang']) { + if (isset($_SESSION['lang']) && $_SESSION['lang'] === $_POST['lang']) { echo ''; @@ -23,7 +23,7 @@ // Generate the command to install the package $command = "sudo apt-get install $package_name"; - echo "Install the PHP lib: "; + echo 'Install the PHP lib: '; echo $command; exit; } @@ -31,8 +31,7 @@ $locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); $langBrowser = str_replace('-', '_', $locale); -function detecting_lang($languageBrowser, $default = 'en_US') -{ +function detecting_lang($languageBrowser, $default = 'en_US') { return !file_exists('../locale/' . $languageBrowser . '.php') ? $default : basename($languageBrowser, '.php'); } @@ -44,15 +43,14 @@ function detecting_lang($languageBrowser, $default = 'en_US') include $_SESSION['lang'] . '.php'; } -function display_lang($decoded_json, $searchKey) -{ +function display_lang($decoded_json, $searchKey) { foreach ($decoded_json as $key => $val) { $value = $decoded_json[$key]['value']; $label = $decoded_json[$key]['label']; $flag = $decoded_json[$key]['flag']; if ($value == $searchKey) { echo "\n" : ">\n"; + echo (isset($_SESSION['lang']) && $_SESSION['lang'] === $value) ? " selected>\n" : ">\n"; } } } From 6c6b334c37b805ee63ac02a8905814fabb31be21 Mon Sep 17 00:00:00 2001 From: Caleb Mazalevskis Date: Fri, 21 Apr 2023 01:39:59 +0800 Subject: [PATCH 075/416] Add linting to help detect syntax errors. --- .github/workflows/validate.yml | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/validate.yml diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 000000000..e6683e987 --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,45 @@ +name: Validate/Lint + +on: [push, pull_request] + +permissions: + contents: read + +jobs: + build: + runs-on: ${{ matrix.operating-system }} + + strategy: + matrix: + operating-system: [ubuntu-latest] + php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2'] + name: PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extensions: pcre + + - name: Lint + run: | + lintPaths=() + lintPaths+=("${GITHUB_WORKSPACE}") + for lintPath in "${lintPaths[@]}" + do + for file in `find "$lintPath"` + do + EXTENSION="${file##*.}" + if [ "$EXTENSION" == "php" ] || [ "$EXTENSION" == "phtml" ] + then + RESULTS=`php -l "$file"` + if [ "$RESULTS" != "No syntax errors detected in $file" ] + then + echo $RESULTS + fi + fi + done + done From ca6ac7d693e4702953a63e4650c1b51e99d738dc Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 21 Apr 2023 11:54:58 -0300 Subject: [PATCH 076/416] Update --- objects/createSpiritsFromVideo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/createSpiritsFromVideo.php b/objects/createSpiritsFromVideo.php index 9adda2593..0b871ec5e 100644 --- a/objects/createSpiritsFromVideo.php +++ b/objects/createSpiritsFromVideo.php @@ -15,7 +15,7 @@ $baseName = $argv[7]; $force = intval(@$argv[8]); -if ($step <= 0) { +if ($step <= 0.01) { $step = 0.01; } From cd747466123e52e6062610b89da274d995589cb1 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 21 Apr 2023 15:45:15 -0300 Subject: [PATCH 077/416] Update --- objects/createSpiritsFromVideo.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/objects/createSpiritsFromVideo.php b/objects/createSpiritsFromVideo.php index 129f86772..636a81d38 100644 --- a/objects/createSpiritsFromVideo.php +++ b/objects/createSpiritsFromVideo.php @@ -15,7 +15,7 @@ $baseName = $argv[7]; $force = intval(@$argv[8]); -if ($step <= 0.01) { +if ($step <= 0) { $step = 0.01; } @@ -63,7 +63,8 @@ $mapHeight = $tileHeight * (ceil($numberOfTiles / 10)); $cmd = get_ffmpeg() . " -i \"{$url}\" -map 0:v:0 -vf fps=1/{$step}," - . getFFmpegScaleToForceOriginalAspectRatio($tileWidth, $tileHeight) . " " + . getFFmpegScaleToForceOriginalAspectRatio($tileWidth, $tileHeight) . + " -frames:v 100 " . " \"{$dirname}out%03d.png\" 2>&1 "; $cmd = removeUserAgentIfNotURL($cmd); From d1718533767e4400ed3237bf91bbb2d08a38372b Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 21 Apr 2023 15:48:27 -0300 Subject: [PATCH 078/416] Update --- objects/Login.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/objects/Login.php b/objects/Login.php index 0ad5bf355..c6e556f98 100644 --- a/objects/Login.php +++ b/objects/Login.php @@ -228,9 +228,9 @@ static function getStreamerUserId() { static function getStreamerId() { if (!static::isLogged()) { - return false; + return 0; } - return $_SESSION['login']->streamers_id; + return intval($_SESSION['login']->streamers_id); } } From 96ad4014339f9c20ced3343ca24f2640122328a5 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 21 Apr 2023 17:53:59 -0300 Subject: [PATCH 079/416] Update --- objects/Format.php | 1 + 1 file changed, 1 insertion(+) diff --git a/objects/Format.php b/objects/Format.php index 98cf8f327..8a7b5ee16 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -800,6 +800,7 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod } } } else { + error_log("AVideo-Encoder Format::exec Success progressFile={$progressFile}"); $obj->error = false; } } From c0939f73bdcb1e6a17ac06847f3b796dafdf0bed Mon Sep 17 00:00:00 2001 From: Caleb Mazalevskis Date: Sun, 23 Apr 2023 19:14:53 +0800 Subject: [PATCH 080/416] Do things the same way as with AVideo repo. At the main AVideo repo, the Australian English file includes in the US English file to use as a fallback. Let's do the same here. --- locale/en_AU.php | 129 ++--------------------------------------------- 1 file changed, 4 insertions(+), 125 deletions(-) diff --git a/locale/en_AU.php b/locale/en_AU.php index 877d00bf2..678d6bb65 100644 --- a/locale/en_AU.php +++ b/locale/en_AU.php @@ -1,126 +1,5 @@ Date: Sun, 23 Apr 2023 19:25:35 +0800 Subject: [PATCH 081/416] Fix typo. Unckeck->Uncheck. --- locale/ar_SA.php | 2 +- locale/cs.php | 2 +- locale/da_DK.php | 2 +- locale/de.php | 2 +- locale/el_GR.php | 2 +- locale/en_US.php | 2 +- locale/es.php | 2 +- locale/es_CL.php | 2 +- locale/fr.php | 2 +- locale/he_IL.php | 2 +- locale/hi_IN.php | 2 +- locale/hu_HU.php | 2 +- locale/it.php | 2 +- locale/ja_JP.php | 2 +- locale/ko_KR.php | 2 +- locale/nl.php | 2 +- locale/pl.php | 2 +- locale/pt.php | 2 +- locale/pt_BR.php | 2 +- locale/ru.php | 2 +- locale/si.php | 2 +- locale/sv_SE.php | 2 +- locale/th.php | 2 +- locale/tr.php | 2 +- locale/zh.php | 2 +- locale/zh_Hant_TW.php | 2 +- view/index.php | 2 +- 27 files changed, 27 insertions(+), 27 deletions(-) diff --git a/locale/ar_SA.php b/locale/ar_SA.php index 877d00bf2..0db610f3e 100644 --- a/locale/ar_SA.php +++ b/locale/ar_SA.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/cs.php b/locale/cs.php index 8a76fa0f0..cff079a2f 100644 --- a/locale/cs.php +++ b/locale/cs.php @@ -92,7 +92,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'Toto je kanål, jste si jisti, že chcete ståhnout vťechna videa na tomto kanålu?'; $t['Title'] = 'Titul'; $t['URL'] = 'Adresa URL'; -$t['Unckeck all to make it public'] = 'Odťkrtněte vťe, aby bylo zveřejněno'; +$t['Uncheck all to make it public'] = 'Odťkrtněte vťe, aby bylo zveřejněno'; $t['Unlisted but Searchable'] = 'Nezařazené, ale prohledåvatelné'; $t['Unlisted'] = 'Nezařazené'; $t['Update AVideo System'] = 'Aktualizace systému AVideo'; diff --git a/locale/da_DK.php b/locale/da_DK.php index 877d00bf2..0db610f3e 100644 --- a/locale/da_DK.php +++ b/locale/da_DK.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/de.php b/locale/de.php index 29aa47081..7460edbef 100644 --- a/locale/de.php +++ b/locale/de.php @@ -92,7 +92,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'Dies ist ein Kanal, sind Sie sicher, dass Sie alle Videos auf diesem Kanal herunterladen möchten?'; $t['Title'] = 'Titel'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Alles freischalten, um es zu veröffentlichen'; +$t['Uncheck all to make it public'] = 'Alles freischalten, um es zu veröffentlichen'; $t['Unlisted but Searchable'] = 'Nicht aufgelistet, aber durchsuchbar'; $t['Unlisted'] = 'Ungelistet'; $t['Update AVideo System'] = 'AVideo-System aktualisieren'; diff --git a/locale/el_GR.php b/locale/el_GR.php index 877d00bf2..0db610f3e 100644 --- a/locale/el_GR.php +++ b/locale/el_GR.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/en_US.php b/locale/en_US.php index 877d00bf2..0db610f3e 100644 --- a/locale/en_US.php +++ b/locale/en_US.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/es.php b/locale/es.php index 877d00bf2..0db610f3e 100644 --- a/locale/es.php +++ b/locale/es.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/es_CL.php b/locale/es_CL.php index 877d00bf2..0db610f3e 100644 --- a/locale/es_CL.php +++ b/locale/es_CL.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/fr.php b/locale/fr.php index 877d00bf2..0db610f3e 100644 --- a/locale/fr.php +++ b/locale/fr.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/he_IL.php b/locale/he_IL.php index 877d00bf2..0db610f3e 100644 --- a/locale/he_IL.php +++ b/locale/he_IL.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/hi_IN.php b/locale/hi_IN.php index 877d00bf2..0db610f3e 100644 --- a/locale/hi_IN.php +++ b/locale/hi_IN.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/hu_HU.php b/locale/hu_HU.php index 877d00bf2..0db610f3e 100644 --- a/locale/hu_HU.php +++ b/locale/hu_HU.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/it.php b/locale/it.php index 877d00bf2..0db610f3e 100644 --- a/locale/it.php +++ b/locale/it.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/ja_JP.php b/locale/ja_JP.php index 06e2da3a5..72237fae9 100644 --- a/locale/ja_JP.php +++ b/locale/ja_JP.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'これはチャンネルです。このチャンネルのすべてのビデオをダウンロードしてよろしいですか?'; $t['Title'] = 'タイトル'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'すべてのチェックを外して公開する'; +$t['Uncheck all to make it public'] = 'すべてのチェックを外して公開する'; $t['Unlisted'] = '非公開'; $t['Unlisted but Searchable'] = '非公開だが検索可能'; $t['Update'] = '更新'; diff --git a/locale/ko_KR.php b/locale/ko_KR.php index 877d00bf2..0db610f3e 100644 --- a/locale/ko_KR.php +++ b/locale/ko_KR.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/nl.php b/locale/nl.php index 877d00bf2..0db610f3e 100644 --- a/locale/nl.php +++ b/locale/nl.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/pl.php b/locale/pl.php index ee3ed2eaa..c369d2112 100644 --- a/locale/pl.php +++ b/locale/pl.php @@ -92,7 +92,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'To jest kanał, czy na pewno chcesz pobrać wszystkie filmy z tego kanału?'; $t['Title'] = 'Tytuł'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Odznacz wszystkie, aby upublicznić'; +$t['Uncheck all to make it public'] = 'Odznacz wszystkie, aby upublicznić'; $t['Unlisted but Searchable'] = 'Nienotowane, ale możliwe do wyszukania!'; $t['Unlisted'] = 'Nie katalogowany'; $t['Update AVideo System'] = 'Aktualizacja systemu AVideo'; diff --git a/locale/pt.php b/locale/pt.php index cc38ce189..63d66e8f4 100644 --- a/locale/pt.php +++ b/locale/pt.php @@ -90,7 +90,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'Isto é um canal, tem certeza de que deseja baixar todos os vídeos deste canal?'; $t['Title'] = 'Título'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Desmarque tudo para tornar público'; +$t['Uncheck all to make it public'] = 'Desmarque tudo para tornar público'; $t['Unlisted'] = 'Não listado'; $t['Unlisted but Searchable'] = 'Não listado mas pesquisável'; $t['Update'] = 'Atualizar'; diff --git a/locale/pt_BR.php b/locale/pt_BR.php index cc38ce189..63d66e8f4 100644 --- a/locale/pt_BR.php +++ b/locale/pt_BR.php @@ -90,7 +90,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'Isto é um canal, tem certeza de que deseja baixar todos os vídeos deste canal?'; $t['Title'] = 'Título'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Desmarque tudo para tornar público'; +$t['Uncheck all to make it public'] = 'Desmarque tudo para tornar público'; $t['Unlisted'] = 'Não listado'; $t['Unlisted but Searchable'] = 'Não listado mas pesquisável'; $t['Update'] = 'Atualizar'; diff --git a/locale/ru.php b/locale/ru.php index 4a831a63e..5899dc207 100644 --- a/locale/ru.php +++ b/locale/ru.php @@ -92,7 +92,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'Это канал, вы уверены, что хотите загрузить все видео на этом канале?'; $t['Title'] = 'Название'; $t['URL'] = 'URL-адрес'; -$t['Unckeck all to make it public'] = 'Разйлокируйте все, чтойы сделать их ойщедоступными'; +$t['Uncheck all to make it public'] = 'Разйлокируйте все, чтойы сделать их ойщедоступными'; $t['Unlisted but Searchable'] = 'Не включенные в список, но доступные для поиска'; $t['Unlisted'] = 'Без списка'; $t['Update AVideo System'] = 'Ойновление аудиовидеосистемы'; diff --git a/locale/si.php b/locale/si.php index 877d00bf2..0db610f3e 100644 --- a/locale/si.php +++ b/locale/si.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/sv_SE.php b/locale/sv_SE.php index 877d00bf2..0db610f3e 100644 --- a/locale/sv_SE.php +++ b/locale/sv_SE.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/th.php b/locale/th.php index 877d00bf2..0db610f3e 100644 --- a/locale/th.php +++ b/locale/th.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/tr.php b/locale/tr.php index 877d00bf2..0db610f3e 100644 --- a/locale/tr.php +++ b/locale/tr.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/zh.php b/locale/zh.php index 877d00bf2..0db610f3e 100644 --- a/locale/zh.php +++ b/locale/zh.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/locale/zh_Hant_TW.php b/locale/zh_Hant_TW.php index 877d00bf2..0db610f3e 100644 --- a/locale/zh_Hant_TW.php +++ b/locale/zh_Hant_TW.php @@ -91,7 +91,7 @@ $t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'This is a Channel, are you sure you want to download all videos on this channel?'; $t['Title'] = 'Title'; $t['URL'] = 'URL'; -$t['Unckeck all to make it public'] = 'Unckeck all to make it public'; +$t['Uncheck all to make it public'] = 'Uncheck all to make it public'; $t['Unlisted'] = 'Unlisted'; $t['Unlisted but Searchable'] = 'Unlisted but Searchable'; $t['Update'] = 'Update'; diff --git a/view/index.php b/view/index.php index 64f38f7c0..b6ba4011e 100644 --- a/view/index.php +++ b/view/index.php @@ -415,7 +415,7 @@ function reloadIfIsNotEditingUserGroup() { } ?>
    -
    +
    From 0828897a5ddf6ebb52c95df4e76f4aec69323bb4 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 24 Apr 2023 12:34:37 -0300 Subject: [PATCH 082/416] update --- objects/Encoder.php | 26 ++++++++++++++++++++++---- objects/Format.php | 4 +++- objects/Streamer.php | 6 ++++++ objects/Upload.php | 7 ++++++- view/run.php | 1 + 5 files changed, 38 insertions(+), 6 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 42337f0af..822c2bb6d 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -865,6 +865,7 @@ public function isWorkerRunning() private static function setStatusError($queue_id, $msg, $notifyIsDone = false) { + error_log("setStatusError($queue_id, $msg, $notifyIsDone) " . json_encode(debug_backtrace())); $q = new Encoder($queue_id); $q->setStatus(Encoder::$STATUS_ERROR); $q->setStatus_obs($msg); @@ -950,6 +951,21 @@ public function deleteQueue($notifyStreamer = false) } } + public function getNewVideosId(){ + global $global; + $target = 'aVideoEncoder.json'; + + $f = new Format($this->getFormats_id()); + $format = $f->getExtension(); + $postFields = array( + 'format'=>$format, + 'title'=>$this->getTitle(), + 'videoDownloadedLink'=>$this->getVideoDownloadedLink(), + 'encoderURL'=>$global['webSiteRootURL'], + ); + return self::sendToStreamer($target, $postFields, false, $this); + } + public static function run($try = 0) { global $global; @@ -977,6 +993,11 @@ public static function run($try = 0) } else { $encoder = new Encoder($rowNext['id']); $return_vars = json_decode($encoder->getReturn_vars()); + if (empty($return_vars->videos_id)) { + $encoder->getNewVideosId(); + $encoder = new Encoder($encoder->getId()); + $return_vars = json_decode($encoder->getReturn_vars()); + } $encoder->setStatus_obs("Start in " . date("Y-m-d H:i:s")); $encoder->save(); $objFile = static::downloadFile($encoder->getId()); @@ -1028,10 +1049,6 @@ public static function run($try = 0) } $obj->error = false; $obj->msg = $resp->code; - $videos_id = 0; - if (!empty($return_vars->videos_id)) { - $videos_id = $return_vars->videos_id; - } // notify AVideo it is done $response = $encoder->send(); if (!$response->error) { @@ -1745,6 +1762,7 @@ public static function sendSpectrumFromMP3($file, $return_vars, $encoder) public static function sendToStreamer($target, $postFields, $return_vars = false, $encoder = null) { + //var_dump("sendToStreamer($target, $postFields, $return_vars = false, $encoder = null)" . json_encode(debug_backtrace()));exit; $time_start = microtime(true); error_log("sendToStreamer to {$target} "); $removeAfterSend = array('spectrumimage', 'rawVideo', 'image', 'gifimage', 'webpimage', 'video'); diff --git a/objects/Format.php b/objects/Format.php index 8a7b5ee16..875afe807 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -794,8 +794,10 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod if (empty($try) && self::fixFile($pathFileName, $encoder_queue_id)) { self::exec($format_id, $pathFileName, $destinationFile, $encoder_queue_id, $try + 1); } else { + $msg = json_encode($output); + error_log("AVideo-Encoder Format::exec " . $msg.' '.json_encode(debug_backtrace()) ); $encoder->setStatus(Encoder::$STATUS_ERROR); - $encoder->setStatus_obs(json_encode($output)); + $encoder->setStatus_obs($msg); $encoder->save(); } } diff --git a/objects/Streamer.php b/objects/Streamer.php index 1391c2192..30a634070 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -18,6 +18,9 @@ static function getTableName() { private static function get($user, $siteURL) { global $global; + if(empty($global)){ + $global = []; + } $sql = "SELECT * FROM " . static::getTableName() . " WHERE user = '{$user}' AND lower(siteURL) = lower('{$siteURL}') LIMIT 1"; //echo $sql;exit; $res = $global['mysqli']->query($sql); @@ -31,6 +34,9 @@ private static function get($user, $siteURL) { private static function getFirst() { global $global; + if(empty($global)){ + $global = []; + } $sql = "SELECT * FROM " . static::getTableName() . " LIMIT 1"; $res = $global['mysqli']->query($sql); diff --git a/objects/Upload.php b/objects/Upload.php index fb64de102..f405650f0 100644 --- a/objects/Upload.php +++ b/objects/Upload.php @@ -24,6 +24,9 @@ static function getSearchFieldsNames() static function loadFromEncoder($encoders_id, $resolution, $format) { global $global; + if(empty($global)){ + $global = []; + } $sql = "SELECT * FROM " . static::getTableName() . " WHERE `encoders_id` = $encoders_id AND `resolution` = '$resolution' AND `format`= '$format' LIMIT 1"; $global['lastQuery'] = $sql; $res = $global['mysqli']->query($sql); @@ -75,7 +78,9 @@ static function create($encoders_id, $file) static function deleteFile($encoders_id) { global $global; - + if(empty($global)){ + $global = []; + } $sql = "SELECT * FROM " . static::getTableName() . " WHERE `encoders_id` = $encoders_id"; $global['lastQuery'] = $sql; $res = $global['mysqli']->query($sql); diff --git a/view/run.php b/view/run.php index 56272050e..42eda0734 100644 --- a/view/run.php +++ b/view/run.php @@ -1,4 +1,5 @@ Date: Wed, 3 May 2023 14:59:35 -0300 Subject: [PATCH 083/416] update --- objects/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/functions.php b/objects/functions.php index e5360e2b8..72a08f67c 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1098,7 +1098,7 @@ function addPrefixIntoQuery($query, $tablesPrefix) { function isURLaVODVideo($url) { $parts = explode('?', $url); if (preg_match('/m3u8?$/i', $parts[0])) { - $content = file_get_contents($url); + $content = @file_get_contents($url); if (empty($content)) { return false; // Can't determine if the video is VOD or live, as the content is empty } From c33040a1bc8e6f033dd362df9e7cd361e3116606 Mon Sep 17 00:00:00 2001 From: daniel Date: Mon, 17 Jul 2023 12:13:35 -0300 Subject: [PATCH 084/416] Make sure you try again if fails --- objects/Object.php | 77 ++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/objects/Object.php b/objects/Object.php index 257d1d13e..9db04ffac 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -1,17 +1,17 @@ load($id); } } - protected static function getFromDb($id) - { + protected static function getFromDb($id) { global $global; $id = intval($id); $sql = "SELECT * FROM " . static::getTableName() . " WHERE id = $id LIMIT 1"; @@ -43,8 +41,7 @@ protected static function getFromDb($id) return $res ? $res->fetch_assoc() : false; } - public static function getAll() - { + public static function getAll() { global $global; $sql = "SELECT * FROM " . static::getTableName() . " WHERE 1=1 "; @@ -66,8 +63,7 @@ public static function getAll() return $rows; } - public static function getTotal() - { + public static function getTotal() { //will receive //current=1&rowCount=10&sort[sender]=asc&searchPhrase= global $global; @@ -81,12 +77,10 @@ public static function getTotal() */ $res = $global['mysqli']->query($sql); - return $res->num_rows; } - public static function getSqlFromPost() - { + public static function getSqlFromPost() { global $global; $sql = self::getSqlSearchFromPost(); @@ -119,8 +113,7 @@ public static function getSqlFromPost() return $sql; } - public static function getSqlSearchFromPost() - { + public static function getSqlSearchFromPost() { $sql = ""; if (!empty($_POST['searchPhrase'])) { $_GET['q'] = $_POST['searchPhrase']; @@ -144,8 +137,7 @@ public static function getSqlSearchFromPost() return $sql; } - public function save() - { + public function save() { global $global; $fieldsName = $this->getAllFields(); if (!empty($this->id)) { @@ -197,29 +189,39 @@ public function save() } } - private function getAllFields() - { + private function getAllFields() { global $global, $mysqlDatabase; $sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{$mysqlDatabase}' AND TABLE_NAME = '" . static::getTableName() . "'"; - //echo $sql; $global['lastQuery'] = $sql; - /** - * @var array $global - */ - $res = $global['mysqli']->query($sql); - $rows = []; - if ($res) { - while ($row = $res->fetch_assoc()) { - $rows[] = $row["COLUMN_NAME"]; + + $attempts = 0; + $retryLimit = 1; // Maximum number of retry attempts + + while ($attempts <= $retryLimit) { + try { + $res = $global['mysqli']->query($sql); + + if ($res) { + $rows = []; + while ($row = $res->fetch_assoc()) { + $rows[] = $row["COLUMN_NAME"]; + } + return $rows; + } else { + throw new mysqli_sql_exception('(' . $global['mysqli']->errno . ') ' . $global['mysqli']->error); + } + } catch (mysqli_sql_exception $e) { + if ($attempts < $retryLimit) { + $attempts++; + sleep(5); // Delay for 5 seconds before retrying + } else { + die($e->getMessage()); + } } - } else { - die($sql . '\nError : (' . $global['mysqli']->errno . ') ' . $global['mysqli']->error); } - return $rows; } - public function delete() - { + public function delete() { global $global; if (!empty($this->id)) { $sql = "DELETE FROM " . static::getTableName() . " "; @@ -234,4 +236,5 @@ public function delete() error_log("Id for table " . static::getTableName() . " not defined for deletion"); return false; } + } From f954220ca6878ad071aa4ed8a0c8aa004b336678 Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 19 Jul 2023 12:17:39 -0300 Subject: [PATCH 085/416] https://github.com/WWBN/AVideo/issues/8177 --- objects/Encoder.php | 1 + 1 file changed, 1 insertion(+) diff --git a/objects/Encoder.php b/objects/Encoder.php index 822c2bb6d..04d94c017 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -1786,6 +1786,7 @@ public static function sendToStreamer($target, $postFields, $return_vars = false $postFields['return_vars'] = $return_vars_str; if (!empty($return_vars->releaseDate)) { $postFields['releaseDate'] = $return_vars->releaseDate; + $postFields['releaseTime'] = strtotime($return_vars->releaseDate); } if (!empty($return_vars->videos_id)) { $postFields['videos_id'] = $return_vars->videos_id; From 935564a88f552c505ad8461498af09e47f1be40c Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 25 Jul 2023 15:20:37 -0300 Subject: [PATCH 086/416] https://github.com/WWBN/AVideo/issues/8200 --- view/css/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/view/css/style.css b/view/css/style.css index f78a0f4bd..9b037b8e8 100644 --- a/view/css/style.css +++ b/view/css/style.css @@ -146,6 +146,7 @@ body { .availableResolutionsLabels { text-align: center; + overflow: auto; } .availableResolutionsLabels .label { From 2ef5ae9d484112824140b15d99b6f50c84893ea8 Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 10 Aug 2023 18:18:46 -0300 Subject: [PATCH 087/416] Speed up the error checking --- objects/Format.php | 190 ++++++++++++++++----------------------------- 1 file changed, 68 insertions(+), 122 deletions(-) diff --git a/objects/Format.php b/objects/Format.php index 875afe807..6e80c2873 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -8,8 +8,7 @@ require_once $global['systemRootPath'] . 'objects/Upload.php'; } - class Format extends ObjectYPT - { + class Format extends ObjectYPT { protected $id; protected $name; @@ -20,19 +19,16 @@ class Format extends ObjectYPT protected $extension_from; protected $order; - public static function getSearchFieldsNames() - { + public static function getSearchFieldsNames() { return array('name'); } - public static function getTableName() - { + public static function getTableName() { global $global; return $global['tablesPrefix'] . 'formats'; } - public function loadFromOrder($order) - { + public function loadFromOrder($order) { $row = self::getFromOrder($order); if (empty($row)) { return false; @@ -43,8 +39,7 @@ public function loadFromOrder($order) return true; } - protected static function getFromOrder($order) - { + protected static function getFromOrder($order) { error_log("AVideo-Encoder Format::getFromOrder($order)"); global $global; $sql = "SELECT * FROM " . static::getTableName() . " WHERE `order` = $order LIMIT 1"; @@ -62,8 +57,7 @@ protected static function getFromOrder($order) return $row; } - public function run($pathFileName, $encoder_queue_id) - { + public function run($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::run($pathFileName, $encoder_queue_id)"); global $global; $obj = new stdClass(); @@ -106,8 +100,7 @@ public function run($pathFileName, $encoder_queue_id) return $obj; } - private function runMultiResolution($pathFileName, $encoder_queue_id, $order) - { + private function runMultiResolution($pathFileName, $encoder_queue_id, $order) { error_log("AVideo-Encoder Format::runMultiResolution($pathFileName, $encoder_queue_id, $order)"); global $global; $path_parts = pathinfo($pathFileName); @@ -149,15 +142,13 @@ private function runMultiResolution($pathFileName, $encoder_queue_id, $order) return $obj; } - private function sendImages($file, $encoder_queue_id) - { + private function sendImages($file, $encoder_queue_id) { $encoder = new Encoder($encoder_queue_id); $return_vars = json_decode($encoder->getReturn_vars()); return Encoder::sendImages($file, $return_vars, $encoder); } - private function mp3ToSpectrum($pathFileName, $encoder_queue_id) - { + private function mp3ToSpectrum($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::mp3ToSpectrum($pathFileName, $encoder_queue_id)"); global $global; $path_parts = pathinfo($pathFileName); @@ -168,8 +159,7 @@ private function mp3ToSpectrum($pathFileName, $encoder_queue_id) return self::exec(5, $pathFileName, $destinationFile, $encoder_queue_id); } - private function mp3ToSpectrumHLS($pathFileName, $encoder_queue_id) - { + private function mp3ToSpectrumHLS($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::mp3ToSpectrumHLS($pathFileName, $encoder_queue_id)"); global $global; $path_parts = pathinfo($pathFileName); @@ -186,8 +176,7 @@ private function mp3ToSpectrumHLS($pathFileName, $encoder_queue_id) return $obj; } - private function mp3ToSpectrumMP4($pathFileName, $encoder_queue_id) - { + private function mp3ToSpectrumMP4($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::mp3ToSpectrumHLS($pathFileName, $encoder_queue_id)"); global $global; $path_parts = pathinfo($pathFileName); @@ -204,8 +193,7 @@ private function mp3ToSpectrumMP4($pathFileName, $encoder_queue_id) return $obj; } - private function mp3ToSpectrumWEBM($pathFileName, $encoder_queue_id) - { + private function mp3ToSpectrumWEBM($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::mp3ToSpectrumWEBM($pathFileName, $encoder_queue_id)"); global $global; $path_parts = pathinfo($pathFileName); @@ -222,8 +210,7 @@ private function mp3ToSpectrumWEBM($pathFileName, $encoder_queue_id) return $obj; } - private function runVideoToSpectrum($pathFileName, $encoder_queue_id) - { + private function runVideoToSpectrum($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::runVideoToSpectrum($pathFileName, $encoder_queue_id)"); global $global; $path_parts = pathinfo($pathFileName); @@ -253,8 +240,7 @@ private function runVideoToSpectrum($pathFileName, $encoder_queue_id) return $obj; } - private function runVideoToAudio($pathFileName, $encoder_queue_id) - { + private function runVideoToAudio($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::runVideoToAudio($pathFileName, $encoder_queue_id)"); $path_parts = pathinfo($pathFileName); //$destinationFile = $path_parts['dirname'] . "/" . $path_parts['filename'] . "_converted"; @@ -271,8 +257,7 @@ private function runVideoToAudio($pathFileName, $encoder_queue_id) return $obj; } - private function runBothVideo($pathFileName, $encoder_queue_id) - { + private function runBothVideo($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::runBothVideo($pathFileName, $encoder_queue_id)"); $path_parts = pathinfo($pathFileName); //$destinationFile = $path_parts['dirname'] . "/" . $path_parts['filename'] . "_converted"; @@ -288,8 +273,7 @@ private function runBothVideo($pathFileName, $encoder_queue_id) return $obj; } - private function runBothAudio($pathFileName, $encoder_queue_id) - { + private function runBothAudio($pathFileName, $encoder_queue_id) { error_log("AVideo-Encoder Format::runBothAudio($pathFileName, $encoder_queue_id)"); $path_parts = pathinfo($pathFileName); //$destinationFile = $path_parts['dirname'] . "/" . $path_parts['filename'] . "_converted"; @@ -305,8 +289,7 @@ private function runBothAudio($pathFileName, $encoder_queue_id) return $obj; } - private static function preProcessHLS($destinationFile) - { + private static function preProcessHLS($destinationFile) { $parts = pathinfo($destinationFile); $destinationFile = "{$parts["dirname"]}/{$parts["filename"]}/"; // create a directory @@ -337,8 +320,7 @@ private static function preProcessHLS($destinationFile) return $destinationFile; } - public static function getResolution($pathFileName) - { + public static function getResolution($pathFileName) { global $_getResolution; if (!isset($_getResolution)) { @@ -376,8 +358,7 @@ public static function getResolution($pathFileName) return $resolution; } - public static function getAudioTracks($pathFileName) - { + public static function getAudioTracks($pathFileName) { global $global; if (empty($global['enableMultipleLangs'])) { return array(); @@ -408,13 +389,11 @@ public static function getAudioTracks($pathFileName) return $audioTracks; } - private static function getDynamicCommandFromMP4($pathFileName, $encoder_queue_id) - { + private static function getDynamicCommandFromMP4($pathFileName, $encoder_queue_id) { return self::getDynamicCommandFromFormat($pathFileName, $encoder_queue_id, 31); } - private static function getDynamicCommandFromWebm($pathFileName, $encoder_queue_id) - { + private static function getDynamicCommandFromWebm($pathFileName, $encoder_queue_id) { return self::getDynamicCommandFromFormat($pathFileName, $encoder_queue_id, 32); } @@ -427,8 +406,7 @@ private static function getDynamicCommandFromWebm($pathFileName, $encoder_queue_ * 360p: 640x360 * 240p: 426x240 (preview) */ - private static function getAvailableConfigurations() - { + private static function getAvailableConfigurations() { $resolutions = array(240, 360, 480, 540, 720, 1080, 1440, 2160); $bandwidth = array(300000, 600000, 1000000, 1500000, 2000000, 4000000, 8000000, 12000000); $audioBitrate = array(128, 128, 128, 192, 192, 192, 192, 192); @@ -442,13 +420,11 @@ private static function getAvailableConfigurations() ); } - public static function getAvailableResolutions() - { + public static function getAvailableResolutions() { return self::getAvailableConfigurations()["resolutions"]; } - public static function getAvailableResolutionsInfo() - { + public static function getAvailableResolutionsInfo() { global $config; $resolutions = []; $availableResolutions = Format::getAvailableResolutions(); @@ -478,15 +454,14 @@ public static function getAvailableResolutionsInfo() return $resolutions; } - public static function sanitizeResolutions($resolutions) - { + public static function sanitizeResolutions($resolutions) { if (is_array($resolutions)) { // resolutions need to be int values $resolutions = array_map( - function ($value) { - return (int) $value; - }, - $resolutions + function ($value) { + return (int) $value; + }, + $resolutions ); // check if all the int values are real resolutions @@ -517,8 +492,7 @@ function ($value) { return null; } - private static function getSelectedResolutions() - { + private static function getSelectedResolutions() { $result = array(480, 720, 1080, 2160); $config = new Configuration(); if (isset($config)) { @@ -530,8 +504,7 @@ private static function getSelectedResolutions() return $result; } - private static function loadEncoderConfiguration() - { + private static function loadEncoderConfiguration() { $availableConfiguration = self::getAvailableConfigurations(); $resolutions = []; @@ -560,8 +533,7 @@ private static function loadEncoderConfiguration() ); } - private static function getDynamicCommandFromFormat($pathFileName, $encoder_queue_id, $format_id) - { + private static function getDynamicCommandFromFormat($pathFileName, $encoder_queue_id, $format_id) { $height = self::getResolution($pathFileName); //$audioTracks = self::getAudioTracks($pathFileName); $advancedCustom = getAdvancedCustomizedObjectData(); @@ -617,8 +589,7 @@ private static function getDynamicCommandFromFormat($pathFileName, $encoder_queu return $command; } - private static function preProcessDynamicHLS($pathFileName, $destinationFile) - { + private static function preProcessDynamicHLS($pathFileName, $destinationFile) { $height = self::getResolution($pathFileName); //$audioTracks = self::getAudioTracks($pathFileName); // TODO: This method should be refactored to use loadEncoderConfiguration instead of getAvailableConfigurations... @@ -709,8 +680,7 @@ private static function preProcessDynamicHLS($pathFileName, $destinationFile) return array($destinationFile, $command); } - private static function posProcessHLS($destinationFile, $encoder_queue_id) - { + private static function posProcessHLS($destinationFile, $encoder_queue_id) { // zip the directory $encoder = new Encoder($encoder_queue_id); $encoder->setStatus(Encoder::$STATUS_PACKING); @@ -723,8 +693,7 @@ private static function posProcessHLS($destinationFile, $encoder_queue_id) return file_exists($zipPath); } - private static function fixFile($pathFileName, $encoder_queue_id) - { + private static function fixFile($pathFileName, $encoder_queue_id) { // zip the directory $encoder = new Encoder($encoder_queue_id); $encoder->setStatus(Encoder::$STATUS_FIXING); @@ -747,8 +716,7 @@ private static function fixFile($pathFileName, $encoder_queue_id) return file_exists($pathFileName); } - private static function exec($format_id, $pathFileName, $destinationFile, $encoder_queue_id, $try = 0) - { + private static function exec($format_id, $pathFileName, $destinationFile, $encoder_queue_id, $try = 0) { global $global; $obj = new stdClass(); $obj->error = true; @@ -795,7 +763,7 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod self::exec($format_id, $pathFileName, $destinationFile, $encoder_queue_id, $try + 1); } else { $msg = json_encode($output); - error_log("AVideo-Encoder Format::exec " . $msg.' '.json_encode(debug_backtrace()) ); + error_log("AVideo-Encoder Format::exec " . $msg . ' ' . json_encode(debug_backtrace())); $encoder->setStatus(Encoder::$STATUS_ERROR); $encoder->setStatus_obs($msg); $encoder->save(); @@ -816,8 +784,7 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod return $obj; } - public static function progressFileHasVideosWithErrors($progressFilename) - { + public static function progressFileHasVideosWithErrors($progressFilename) { global $global; if (empty($progressFilename)) { @@ -856,8 +823,7 @@ public static function progressFileHasVideosWithErrors($progressFilename) return false; } - public static function videoFileHasErrors($filename, $allowed_extensions = true) - { + public static function videoFileHasErrors($filename, $allowed_extensions = true) { global $global; if (!file_exists($filename)) { error_log("videoFileHasErrors: file not exists {$filename}"); @@ -868,22 +834,22 @@ public static function videoFileHasErrors($filename, $allowed_extensions = true) return false; } - $errorLogFile = $filename . '.error.log'; + $errorLogFile = tempnam(sys_get_temp_dir(), 'video_error_log'); - /** - * -allowed_extensions ALL is required - * key' is not a common multimedia extension, blocked for security reasons. - If you wish to override this adjust allowed_extensions, you can set it to 'ALL' to allow all - */ $complement = ''; if ($allowed_extensions) { $complement = '-allowed_extensions ALL'; } + $skipFramesOption = ''; + $durationOption = ''; + //$skipFramesOption = '-vf "select=not(mod(n\,1000))"'; + $durationOption = '-t 10'; // check the first 10 seconds + if (isWindows()) { - $command = get_ffmpeg() . " {$complement} -v error -i \"{$filename}\" -f null - >\"{$errorLogFile}\" 2>&1 "; + $command = get_ffmpeg() . " {$complement} {$skipFramesOption} {$durationOption} -v error -i \"{$filename}\" -f null - >\"{$errorLogFile}\" 2>&1 "; } else { - $command = get_ffmpeg() . " {$complement} -v error -i \"{$filename}\" -f null - 2>\"{$errorLogFile}\" "; + $command = get_ffmpeg() . " {$complement} {$skipFramesOption} {$durationOption} -v error -i \"{$filename}\" -f null - 2>\"{$errorLogFile}\" "; } $command = removeUserAgentIfNotURL($command); exec($command); @@ -897,9 +863,6 @@ public static function videoFileHasErrors($filename, $allowed_extensions = true) unlink($errorLogFile); if (!empty($content)) { - if ($allowed_extensions) { - return self::videoFileHasErrors($filename, false); - } error_log("videoFileHasErrors: errors found on video file {$filename} " . PHP_EOL . $content); return true; } else { @@ -907,8 +870,7 @@ public static function videoFileHasErrors($filename, $allowed_extensions = true) } } - private static function execOrder($format_order, $pathFileName, $destinationFile, $encoder_queue_id) - { + private static function execOrder($format_order, $pathFileName, $destinationFile, $encoder_queue_id) { if (empty($destinationFile)) { $obj = new stdClass(); $obj->error = true; @@ -960,8 +922,7 @@ private static function execOrder($format_order, $pathFileName, $destinationFile return $obj; } - public static function getFromName($name) - { + public static function getFromName($name) { global $global; $name = strtolower(trim($name)); $sql = "SELECT * FROM " . static::getTableName() . " WHERE LOWER(name) = '{$name}' LIMIT 1"; @@ -979,8 +940,7 @@ public static function getFromName($name) return false; } - public static function createIfNotExists($name) - { + public static function createIfNotExists($name) { if (empty($name)) { return false; } @@ -997,43 +957,35 @@ public static function createIfNotExists($name) return $row['id']; } - public function getId() - { + public function getId() { return $this->id; } - public function getName() - { + public function getName() { return $this->name; } - public function getCode() - { + public function getCode() { return $this->code; } - public function getCreated() - { + public function getCreated() { return $this->created; } - public function getModified() - { + public function getModified() { return $this->modified; } - public function getExtension() - { + public function getExtension() { return $this->extension; } - public function setId($id) - { + public function setId($id) { $this->id = $id; } - public function setName($name) - { + public function setName($name) { global $global; /** * @var array $global @@ -1041,8 +993,7 @@ public function setName($name) $this->name = $global['mysqli']->real_escape_string($name); } - public function setCode($code) - { + public function setCode($code) { global $global; /** * @var array $global @@ -1050,18 +1001,15 @@ public function setCode($code) $this->code = $global['mysqli']->real_escape_string($code); } - public function setCreated($created) - { + public function setCreated($created) { $this->created = $created; } - public function setModified($modified) - { + public function setModified($modified) { $this->modified = $modified; } - public function setExtension($extension) - { + public function setExtension($extension) { global $global; /** * @var array $global @@ -1069,24 +1017,22 @@ public function setExtension($extension) $this->extension = $global['mysqli']->real_escape_string($extension); } - public function getExtension_from() - { + public function getExtension_from() { return $this->extension_from; } - public function setExtension_from($extension_from) - { + public function setExtension_from($extension_from) { $this->extension_from = $extension_from; } - public function getOrder() - { + public function getOrder() { return $this->order; } - public function setOrder($order) - { + public function setOrder($order) { $this->order = $order; } + } + } From 428091149c74a2d86c6ae501e8e9f14011748fdc Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 10 Aug 2023 23:28:50 -0300 Subject: [PATCH 088/416] Update --- objects/Object.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/objects/Object.php b/objects/Object.php index 9db04ffac..0970cda76 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -190,7 +190,7 @@ public function save() { } private function getAllFields() { - global $global, $mysqlDatabase; + global $global, $mysqlHost, $mysqlUser, $mysqlPass, $mysqlDatabase; $sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{$mysqlDatabase}' AND TABLE_NAME = '" . static::getTableName() . "'"; $global['lastQuery'] = $sql; @@ -214,6 +214,7 @@ private function getAllFields() { if ($attempts < $retryLimit) { $attempts++; sleep(5); // Delay for 5 seconds before retrying + $global['mysqli'] = new mysqli($mysqlHost, $mysqlUser, $mysqlPass, $mysqlDatabase); } else { die($e->getMessage()); } From ae7df631f755041a3bd3fa0d4457a865bb289725 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 11 Aug 2023 08:31:12 -0300 Subject: [PATCH 089/416] Update --- view/releaseDate.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/view/releaseDate.php b/view/releaseDate.php index b2654ad2a..00edf1feb 100644 --- a/view/releaseDate.php +++ b/view/releaseDate.php @@ -22,7 +22,7 @@ $relaseOptions[] = "{$i} " . __('Hours'); } foreach ($relaseOptions as $value) { - echo ""; + echo ""; } ?> @@ -34,7 +34,7 @@ $relaseOptions[] = "{$i} " . __('Days'); } foreach ($relaseOptions as $value) { - echo ""; + echo ""; } ?> @@ -47,7 +47,7 @@ } foreach ($relaseOptions as $value) { - echo ""; + echo ""; } ?> @@ -60,7 +60,7 @@ } foreach ($relaseOptions as $value) { - echo ""; + echo ""; } ?> From 2ee954353c0f79aedb248ee90824b8774dc8f748 Mon Sep 17 00:00:00 2001 From: daniel Date: Sun, 13 Aug 2023 13:31:22 -0300 Subject: [PATCH 090/416] https://github.com/WWBN/AVideo/issues/8313 --- objects/Format.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/objects/Format.php b/objects/Format.php index 6e80c2873..4eb142055 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -852,7 +852,11 @@ public static function videoFileHasErrors($filename, $allowed_extensions = true) $command = get_ffmpeg() . " {$complement} {$skipFramesOption} {$durationOption} -v error -i \"{$filename}\" -f null - 2>\"{$errorLogFile}\" "; } $command = removeUserAgentIfNotURL($command); - exec($command); + exec($command, $output, $return_var); + if ($return_var !== 0) { + error_log("videoFileHasErrors: could not exec [{$command}] ".json_encode($output)); + return false; + } if (!file_exists($errorLogFile)) { error_log("videoFileHasErrors: error.log file not exists {$errorLogFile}"); From a9609a600932d23dbbfa4cacc290df11dc2fcaa1 Mon Sep 17 00:00:00 2001 From: daniel Date: Sun, 13 Aug 2023 13:34:23 -0300 Subject: [PATCH 091/416] https://github.com/WWBN/AVideo/issues/8313 --- objects/Format.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/objects/Format.php b/objects/Format.php index 4eb142055..845ac8c68 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -867,6 +867,9 @@ public static function videoFileHasErrors($filename, $allowed_extensions = true) unlink($errorLogFile); if (!empty($content)) { + if ($allowed_extensions) { + return self::videoFileHasErrors($filename, false); + } error_log("videoFileHasErrors: errors found on video file {$filename} " . PHP_EOL . $content); return true; } else { From d5c2c8a0e0730883099f5eba1aea221e03519799 Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 15 Aug 2023 18:00:57 -0300 Subject: [PATCH 092/416] https://github.com/WWBN/AVideo/issues/8300#issuecomment-1679377173 --- view/releaseDate.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/view/releaseDate.php b/view/releaseDate.php index 00edf1feb..922dfd119 100644 --- a/view/releaseDate.php +++ b/view/releaseDate.php @@ -29,38 +29,38 @@ " . __($value) . ""; + echo ""; } ?> " . __($value) . ""; + echo ""; } ?> " . __($value) . ""; + echo ""; } ?> From 4726706213f98e23d40b9eebf01acfa87539e195 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 25 Aug 2023 10:09:10 -0300 Subject: [PATCH 093/416] https://github.com/WWBN/AVideo/issues/8355#issuecomment-1692309660 --- view/releaseDate.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/view/releaseDate.php b/view/releaseDate.php index 922dfd119..b0619b4ca 100644 --- a/view/releaseDate.php +++ b/view/releaseDate.php @@ -1,4 +1,9 @@ disableReleaseDate)){ + return ''; +} global $releaseDateJSandCSSAdded; if (empty($releaseDateId)) { $releaseDateId = 'releaseDate'; From 910f64dd406ddef49849c31171a536ba90f15999 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 8 Sep 2023 12:05:04 -0300 Subject: [PATCH 094/416] Update --- objects/Object.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/objects/Object.php b/objects/Object.php index 0970cda76..bf326a3b5 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -159,7 +159,9 @@ public function save() { $sql .= "`" . implode("`,`", $fieldsName) . "` )"; $fields = []; foreach ($fieldsName as $value) { - if (strtolower($value) == 'created' || strtolower($value) == 'modified') { + if (strtolower($value) == 'id' && empty($this->$value)) { + $fields[] = " NULL "; + } else if (strtolower($value) == 'created' || strtolower($value) == 'modified') { $fields[] = " now() "; } elseif (!isset($this->$value)) { $fields[] = " NULL "; From 4953b7af026b54086b31e235e51b323b657e133b Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 8 Sep 2023 12:08:43 -0300 Subject: [PATCH 095/416] Update --- objects/Object.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/objects/Object.php b/objects/Object.php index bf326a3b5..0045e1ebc 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -166,7 +166,16 @@ public function save() { } elseif (!isset($this->$value)) { $fields[] = " NULL "; } else { - $fields[] = " '{$this->$value}' "; + if(preg_match('/_id$/', $value)){ + $id = intval($this->$value); + if(empty($id)){ + $fields[] = " NULL "; + }else{ + $fields[] = " {$id} "; + } + }else{ + $fields[] = " '{$this->$value}' "; + } } } $sql .= " VALUES (" . implode(", ", $fields) . ")"; From 175383cf79a2660e58b5d0c70b3c53496b63ea35 Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 27 Sep 2023 20:05:15 -0300 Subject: [PATCH 096/416] Update --- view/index.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/view/index.php b/view/index.php index b6ba4011e..6da414214 100644 --- a/view/index.php +++ b/view/index.php @@ -3,7 +3,13 @@ if (!file_exists($config)) { header("Location: install/index.php"); } - +if (!class_exists('CURLFile')) { + $phpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION; + echo "The CURLFile class is not found. You might need the PHP cURL extension.
    "; + echo "You can try installing it with:
    "; + echo "sudo apt-get install php{$phpVersion}-curl
    "; + exit; +} if (!empty($_POST['webSiteRootURL'])) { $_GET['webSiteRootURL'] = $_POST['webSiteRootURL']; } From 01e0667da84e0b3ab5a9f2976514bb4f6dcc4d86 Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 27 Sep 2023 20:05:20 -0300 Subject: [PATCH 097/416] Update --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 04d94c017..bf9b5454f 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -1643,7 +1643,7 @@ public static function sendFileToDownload($file, $return_vars, $format, $encoder public static function sendImages($file, $return_vars, $encoder) { global $global; - + $obj = new stdClass(); $obj->error = true; $obj->file = $file; From 72d0f3a635dcb66e48a0a81df8a289b5e86edf4c Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 27 Sep 2023 20:07:41 -0300 Subject: [PATCH 098/416] Update --- view/index.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/view/index.php b/view/index.php index 6da414214..d3037cb5d 100644 --- a/view/index.php +++ b/view/index.php @@ -3,13 +3,6 @@ if (!file_exists($config)) { header("Location: install/index.php"); } -if (!class_exists('CURLFile')) { - $phpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION; - echo "The CURLFile class is not found. You might need the PHP cURL extension.
    "; - echo "You can try installing it with:
    "; - echo "sudo apt-get install php{$phpVersion}-curl
    "; - exit; -} if (!empty($_POST['webSiteRootURL'])) { $_GET['webSiteRootURL'] = $_POST['webSiteRootURL']; } From de7d9229b726c831bd15f4336d9aa3addedfead6 Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 27 Sep 2023 20:07:46 -0300 Subject: [PATCH 099/416] Update --- objects/Encoder.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/objects/Encoder.php b/objects/Encoder.php index bf9b5454f..c01a670f7 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2,6 +2,17 @@ if (empty($global)) { $global=[]; } + +if (!class_exists('CURLFile')) { + $phpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION; + $msg = "The CURLFile class is not found. You might need the PHP cURL extension.
    "; + $msg .= "You can try installing it with:
    "; + $msg .= "sudo apt-get install php{$phpVersion}-curl
    "; + echo $msg; + error_log($msg); + exit; +} + global $sentImage; $sentImage = []; require_once $global['systemRootPath'] . 'objects/Format.php'; From 5e6f35373a0862dc9d9c6c2332069ca2afdaf3d6 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 29 Sep 2023 09:43:36 -0300 Subject: [PATCH 100/416] Update --- view/index_formats.php | 1 + 1 file changed, 1 insertion(+) diff --git a/view/index_formats.php b/view/index_formats.php index 65024b9ce..e4f8a065d 100644 --- a/view/index_formats.php +++ b/view/index_formats.php @@ -52,6 +52,7 @@ text-transform: uppercase; letter-spacing: 1px; color: #079ad9; + font-size: 0.8em; } .radio-tile-group .input-container .radio-button + .radio-tile { transition: 0.3s; From 6a492b12be3e7b7c11535dc38c9c311f1d873662 Mon Sep 17 00:00:00 2001 From: pravynandas Date: Thu, 12 Oct 2023 23:56:12 -0400 Subject: [PATCH 101/416] Files with UPPER case extensions not listing in bulk upload This fix will take the same allowed list to be considered in it's current original case (can be mixed), lower case format and also upper case format. Since it is also possible that some formats are mixed case (Ex: Mov instead of MOV) it is better to take all three cases (though may have duplicates in $fileStr, does not hurt.). --- view/listFiles.json.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/view/listFiles.json.php b/view/listFiles.json.php index 985d4022d..1d08bd88a 100644 --- a/view/listFiles.json.php +++ b/view/listFiles.json.php @@ -13,7 +13,10 @@ //var_dump($path, file_exists($path)); if (file_exists($path)) { if (defined( 'GLOB_BRACE' )) { - $filesStr = "{*." . implode(",*.", $global['allowed']) . "}"; + $extn = implode(",*.", $global['allowed']); + $extnLower = strtolower($extn); + $extnUpper = strtoupper($extn); + $filesStr = "{*." . $extn . ",*" . $extnLower . ",*" . $extnUpper . "}"; //var_dump($filesStr); //echo $files; $video_array = glob($path . $filesStr, GLOB_BRACE); From 4dcbb0356d8d461eb8c4bb71bdc1659fb5170d72 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 13 Oct 2023 14:33:47 -0300 Subject: [PATCH 102/416] Update --- objects/Object.php | 1 + 1 file changed, 1 insertion(+) diff --git a/objects/Object.php b/objects/Object.php index 0045e1ebc..0c207b306 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -174,6 +174,7 @@ public function save() { $fields[] = " {$id} "; } }else{ + $this->$value = addcslashes($this->$value, "'"); $fields[] = " '{$this->$value}' "; } } From 3f043865990688ebcc530367ee8d6f2ce8cbfcb6 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 13 Oct 2023 14:40:20 -0300 Subject: [PATCH 103/416] Fix --- view/listFiles.json.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/view/listFiles.json.php b/view/listFiles.json.php index 1d08bd88a..4e6cd4b80 100644 --- a/view/listFiles.json.php +++ b/view/listFiles.json.php @@ -2,7 +2,11 @@ require_once dirname(__FILE__) . '/../videos/configuration.php'; require_once $global['systemRootPath'] . 'objects/Login.php'; header('Content-Type: application/json'); + +// Ensure extensions are in lowercase and unique +$global['allowed'] = array_map('strtolower', $global['allowed']); $global['allowed'] = array_unique($global['allowed']); + $files = array(); if(Login::canBulkEncode()){ if (!empty($_POST['path'])) { @@ -10,29 +14,26 @@ if (substr($path, -1) !== DIRECTORY_SEPARATOR) { $path .= DIRECTORY_SEPARATOR; } - //var_dump($path, file_exists($path)); + if (file_exists($path)) { - if (defined( 'GLOB_BRACE' )) { + if (defined('GLOB_BRACE')) { $extn = implode(",*.", $global['allowed']); $extnLower = strtolower($extn); $extnUpper = strtoupper($extn); $filesStr = "{*." . $extn . ",*" . $extnLower . ",*" . $extnUpper . "}"; - //var_dump($filesStr); - //echo $files; $video_array = glob($path . $filesStr, GLOB_BRACE); } else { - //var_dump($global['allowed']); $video_array = array(); foreach ($global['allowed'] as $value) { - $video_array += glob($path . "*." . $value); + $video_array = array_merge($video_array, glob($path . "*." . $value)); } } + $id = 0; foreach ($video_array as $key => $value) { $path_parts = pathinfo($value); $obj = new stdClass(); $obj->id = $id++; - //$obj->path_clean = ($value); $obj->path = _utf8_encode($value); $obj->name = _utf8_encode($path_parts['basename']); $files[] = $obj; From 8f87d9d7c2347e6a1b14f90cf31c42981c71f764 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 13 Oct 2023 14:42:16 -0300 Subject: [PATCH 104/416] Deduplication: Use an associative array to track already added files --- view/listFiles.json.php | 43 ++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/view/listFiles.json.php b/view/listFiles.json.php index 4e6cd4b80..677af9ca8 100644 --- a/view/listFiles.json.php +++ b/view/listFiles.json.php @@ -15,29 +15,32 @@ $path .= DIRECTORY_SEPARATOR; } + $video_array = array(); if (file_exists($path)) { - if (defined('GLOB_BRACE')) { - $extn = implode(",*.", $global['allowed']); - $extnLower = strtolower($extn); - $extnUpper = strtoupper($extn); - $filesStr = "{*." . $extn . ",*" . $extnLower . ",*" . $extnUpper . "}"; - $video_array = glob($path . $filesStr, GLOB_BRACE); - } else { - $video_array = array(); - foreach ($global['allowed'] as $value) { - $video_array = array_merge($video_array, glob($path . "*." . $value)); - } + foreach ($global['allowed'] as $value) { + $video_array = array_merge($video_array, glob($path . "*." . $value)); } - - $id = 0; - foreach ($video_array as $key => $value) { - $path_parts = pathinfo($value); - $obj = new stdClass(); - $obj->id = $id++; - $obj->path = _utf8_encode($value); - $obj->name = _utf8_encode($path_parts['basename']); - $files[] = $obj; + } + + // Deduplication: Use an associative array to track already added files + $addedFiles = []; + + $id = 0; + foreach ($video_array as $key => $value) { + // If file is already added, skip + if(isset($addedFiles[strtolower($value)])) { + continue; } + + // Mark the file as added + $addedFiles[strtolower($value)] = true; + + $path_parts = pathinfo($value); + $obj = new stdClass(); + $obj->id = $id++; + $obj->path = _utf8_encode($value); + $obj->name = _utf8_encode($path_parts['basename']); + $files[] = $obj; } } } From cbea34821d44ad7dc586d09e7e45f4cda9b37152 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 13 Oct 2023 14:46:02 -0300 Subject: [PATCH 105/416] Deduplication: Use an associative array to track already added files --- objects/Object.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Object.php b/objects/Object.php index 0c207b306..18e4dc000 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -174,7 +174,7 @@ public function save() { $fields[] = " {$id} "; } }else{ - $this->$value = addcslashes($this->$value, "'"); + $this->$value = str_replace("'", '', $this->$value); $fields[] = " '{$this->$value}' "; } } From 30d7534128f7df919d5bb6d5f7dced5f65a856d9 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 19 Oct 2023 09:24:01 -0300 Subject: [PATCH 106/416] Update --- objects/security.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/security.php b/objects/security.php index 0d91ef13f..5abe6a064 100644 --- a/objects/security.php +++ b/objects/security.php @@ -21,7 +21,7 @@ eval('$scanThis = &$_' . $value . ';'); if (!empty($scanThis['base64Url'])) { if (!filter_var(base64_decode($scanThis['base64Url']), FILTER_VALIDATE_URL)) { - _error_log('base64Url attack ' . json_encode($_SERVER), AVideoLog::$SECURITY); + error_log('base64Url attack ' . json_encode($_SERVER)); exit; } } From 3199cb1d9d83cfa0970d798884243a5e1ba67fbf Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 25 Oct 2023 10:33:41 -0300 Subject: [PATCH 107/416] Update fontawesome --- view/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view/index.php b/view/index.php index d3037cb5d..f656c08f9 100644 --- a/view/index.php +++ b/view/index.php @@ -62,7 +62,7 @@ - + From 05237b4a56c5c45df74eb5b5d7328fde472edd71 Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 26 Oct 2023 10:20:26 -0300 Subject: [PATCH 108/416] https://github.com/WWBN/AVideo/issues/8576 --- objects/functions.php | 100 ++++++++++++---------- view/index_shareVideos.php | 26 ++---- view/jquery-file-upload/form.php | 13 +-- view/jquery-file-upload/js/main.js | 4 +- view/mini-upload-form/assets/js/script.js | 2 +- view/mini-upload-form/form.php | 14 +-- 6 files changed, 72 insertions(+), 87 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 72a08f67c..03d6b67b2 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1,5 +1,4 @@ [ 'verify_peer' => false, @@ -405,10 +404,10 @@ function status($statusarray) { } } else { echo json_encode(array_map( - function ($text) { - return nl2br($text); - }, - $statusarray + function ($text) { + return nl2br($text); + }, + $statusarray )); } } @@ -447,26 +446,25 @@ function parseSecondsToDuration($seconds) { return secondsToVideoTime($seconds); } - function decideFromPlugin() { $advancedCustom = getAdvancedCustomizedObjectData(); if (!empty($advancedCustom->showOnlyEncoderAutomaticResolutions)) { return array("mp4" => 7, "webm" => 8); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { return array("mp4" => 80, "webm" => 87); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD)) { return array("mp4" => 77, "webm" => 84); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { return array("mp4" => 79, "webm" => 86); } if ( - empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { return array("mp4" => 78, "webm" => 85); } if (empty($advancedCustom->doNotShowEncoderResolutionLow)) { @@ -513,42 +511,42 @@ function decideFormatOrder() { } elseif (empty($_POST['webm']) || $_POST['webm'] === 'false') { // mp4 only if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { // all resolutions error_log("decideFormatOrder: MP4 All"); return (80); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 Low - HD"); return (79); } elseif ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 SD - HD"); return (78); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { error_log("decideFormatOrder: MP4 Low SD"); return (77); } elseif ( - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 HD"); return (76); } elseif ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { error_log("decideFormatOrder: MP4 SD"); return (75); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' ) { error_log("decideFormatOrder: MP4 LOW"); return (74); @@ -559,36 +557,36 @@ function decideFormatOrder() { } else { // mp4 and webm if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { // all resolutions return (87); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (86); } elseif ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (85); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { return (84); } elseif ( - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (83); } elseif ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { return (82); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' ) { return (81); } else { @@ -668,8 +666,8 @@ function zipDirectory($destinationFile) { // Create recursive directory iterator /** @var SplFileInfo[] $files */ $files = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($rootPath), - RecursiveIteratorIterator::LEAVES_ONLY + new RecursiveDirectoryIterator($rootPath), + RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $name => $file) { @@ -1032,9 +1030,9 @@ function isURL200($url) { $result = false; foreach ($headers as $value) { if ( - strpos($value, '200') || - strpos($value, '302') || - strpos($value, '304') + strpos($value, '200') || + strpos($value, '302') || + strpos($value, '304') ) { $result = true; } @@ -1105,8 +1103,8 @@ function isURLaVODVideo($url) { // If the main playlist has an ENDLIST tag, it's a VOD if (preg_match('/#EXT-X-ENDLIST/i', $content) || - preg_match('/#EXT-X-PLAYLIST-TYPE:\s*VOD/i', $content) || - preg_match('/URI=".+enc_[0-9a-z]+.key/i', $content)) { + preg_match('/#EXT-X-PLAYLIST-TYPE:\s*VOD/i', $content) || + preg_match('/URI=".+enc_[0-9a-z]+.key/i', $content)) { return true; // VOD content } @@ -1130,7 +1128,6 @@ function isURLaVODVideo($url) { return true; } - function _utf8_encode($string) { global $global; @@ -1172,7 +1169,7 @@ function _sys_get_temp_dir() { return $dir; } -function _get_temp_file($prefix='') { +function _get_temp_file($prefix = '') { return tempnam(_sys_get_temp_dir(), $prefix); } @@ -1195,7 +1192,6 @@ function convertDates() { } } - function convertToServerDate($originalDateTime, $fromTimezone) { $serverTimezone = date_default_timezone_get(); $dateTime = new DateTime($originalDateTime, new DateTimeZone($fromTimezone)); @@ -1206,3 +1202,19 @@ function convertToServerDate($originalDateTime, $fromTimezone) { // Print the converted datetime return $dateTime->format('Y-m-d H:i:s'); } + +function getCategoriesSelect($id) { + ?> + +
    - + @@ -148,16 +141,9 @@ function reloadIfIsNotEditingCategory() { ?>
    - + diff --git a/view/jquery-file-upload/form.php b/view/jquery-file-upload/form.php index bf375796c..2939bc7a0 100644 --- a/view/jquery-file-upload/form.php +++ b/view/jquery-file-upload/form.php @@ -16,16 +16,9 @@ ?>
    - + diff --git a/view/jquery-file-upload/js/main.js b/view/jquery-file-upload/js/main.js index afb138225..45ad2dd0d 100644 --- a/view/jquery-file-upload/js/main.js +++ b/view/jquery-file-upload/js/main.js @@ -152,7 +152,7 @@ $(function () { "inputAutoAudio": $('#inputAutoAudio').is(":checked"), "title": $('#title').val(), "description": $('#description').val(), - "categories_id": $('#categories_id').val(), + "categories_id": $('#categories_id_upload').val(), "callback": $('#callback').val(), "usergroups_id": $(".usergroups_id:checked").map(function () { return $(this).val(); @@ -183,7 +183,7 @@ $(function () { "inputAutoAudio": $('#inputAutoAudio').is(":checked"), "title": $('#title').val(), "description": $('#description').val(), - "categories_id": $('#categories_id').val(), + "categories_id": $('#categories_id_upload').val(), "releaseDate": $('#releaseDate').val(), "callback": $('#callback').val(), "timezone": timezone, diff --git a/view/mini-upload-form/assets/js/script.js b/view/mini-upload-form/assets/js/script.js index 1d0d503ea..e068b46da 100644 --- a/view/mini-upload-form/assets/js/script.js +++ b/view/mini-upload-form/assets/js/script.js @@ -51,7 +51,7 @@ $(function () { "inputHD": $('#inputHD').is(":checked"), "title": $('#title').val(), "description": $('#description').val(), - "categories_id": $('#categories_id').val(), + "categories_id": $('#categories_id_upload').val(), "releaseDate": $('#releaseDate').val(), "callback": $('#callback').val(), "timezone": timezone, diff --git a/view/mini-upload-form/form.php b/view/mini-upload-form/form.php index 321a256b5..6e3f353c0 100644 --- a/view/mini-upload-form/form.php +++ b/view/mini-upload-form/form.php @@ -1,3 +1,4 @@ +
    @@ -11,16 +12,9 @@ ?>
    - + From 62e69b8bb36ea9bc6c7fecacd5517cca074fa212 Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 26 Oct 2023 10:28:59 -0300 Subject: [PATCH 109/416] https://github.com/WWBN/AVideo/issues/8576 --- objects/functions.php | 20 +++++--- view/index_shareVideos.php | 56 -------------------- view/jquery-file-upload/form.php | 50 ------------------ view/js/main.js | 88 +++++++++++++++++++++++--------- view/mini-upload-form/form.php | 28 ---------- 5 files changed, 76 insertions(+), 166 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 03d6b67b2..ff644f75c 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1208,13 +1208,19 @@ function getCategoriesSelect($id) { categories, 'hierarchyAndName'), SORT_ASC, $_SESSION['login']->categories); - foreach ($_SESSION['login']->categories as $key => $value) { - echo ''; - } - ?> - + if (Login::canCreateCategory()) { + ?> + + - - - -
    - - - -
    - - - -
    - diff --git a/view/js/main.js b/view/js/main.js index 3d84c2232..474e124e6 100644 --- a/view/js/main.js +++ b/view/js/main.js @@ -5,37 +5,75 @@ var modal; * @param {type} href * @returns {Element|getLocation.l} * var l = getLocation("http://example.com/path"); -console.debug(l.hostname) ->> "example.com" -console.debug(l.pathname) ->> "/path" + console.debug(l.hostname) + >> "example.com" + console.debug(l.pathname) + >> "/path" */ -var getLocation = function(href) { +var getLocation = function (href) { var l = document.createElement("a"); l.href = href; return l; }; $(function () { - modal = modal || (function () { - var pleaseWaitDiv = $("#pleaseWaitDialog"); - if (pleaseWaitDiv.length === 0) { - pleaseWaitDiv = $('').appendTo('body'); + modal = modal || (function () { + var pleaseWaitDiv = $("#pleaseWaitDialog"); + if (pleaseWaitDiv.length === 0) { + pleaseWaitDiv = $('').appendTo('body'); + } + + return { + showPleaseWait: function () { + pleaseWaitDiv.modal(); + }, + hidePleaseWait: function () { + pleaseWaitDiv.modal('hide'); + }, + setProgress: function (valeur) { + pleaseWaitDiv.find('.progress-bar').css('width', valeur + '%').attr('aria-valuenow', valeur); + }, + setText: function (text) { + pleaseWaitDiv.find('h2').html(text); + }, + }; + })(); +}); + +var reloadIfIsNotEditingCategoryTimeout; +function addNewCategory(streamerURL) { + clearTimeout(reloadIfIsNotEditingCategoryTimeout); + avideoModalIframe(streamerURL + 'categories'); + reloadIfIsNotEditingCategoryTimeout = setTimeout(function () { + reloadIfIsNotEditingCategory(); + }, 500); +} + +function reloadIfIsNotEditingCategory() { + clearTimeout(reloadIfIsNotEditingCategoryTimeout); + if (!avideoModalIframeIsVisible()) { + loadCategories(); + } else { + reloadIfIsNotEditingCategoryTimeout = setTimeout(function () { + reloadIfIsNotEditingCategory(); + }, 500); } +} - return { - showPleaseWait: function () { - pleaseWaitDiv.modal(); - }, - hidePleaseWait: function () { - pleaseWaitDiv.modal('hide'); - }, - setProgress: function (valeur) { - pleaseWaitDiv.find('.progress-bar').css('width', valeur + '%').attr('aria-valuenow', valeur); - }, - setText: function (text) { - pleaseWaitDiv.find('h2').html(text); - }, - }; -})(); -}); \ No newline at end of file +function loadCategories(streamerURL) { + console.log('loadCategories'); + modal.showPleaseWait(); + $.ajax({ + url: streamerURL + 'objects/categories.json.php', + success: function (response) { + $('.categories_id').empty(); + for (var item in response.rows) { + if (typeof response.rows[item] != 'object') { + continue; + } + $('.categories_id').append(''); + } + modal.hidePleaseWait(); + } + }); +} \ No newline at end of file diff --git a/view/mini-upload-form/form.php b/view/mini-upload-form/form.php index 6e3f353c0..a54758552 100644 --- a/view/mini-upload-form/form.php +++ b/view/mini-upload-form/form.php @@ -15,34 +15,6 @@ - - - -
    Date: Thu, 26 Oct 2023 10:29:22 -0300 Subject: [PATCH 110/416] https://github.com/WWBN/AVideo/issues/8576 --- objects/functions.php | 1 - 1 file changed, 1 deletion(-) diff --git a/objects/functions.php b/objects/functions.php index ff644f75c..d5bb27e3a 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1206,7 +1206,6 @@ function convertToServerDate($originalDateTime, $fromTimezone) { function getCategoriesSelect($id) { ?> - group_name; ?> - -
    - -
    -
    - - - - - doNotAllowEncoderOverwriteStatus)) { - ?> -
    -
    -
    - -
    -
    doNotAllowUpdateVideoId)) { + //include $global['systemRootPath'].'view/streamerResources/videoPoster.php'; + include $global['systemRootPath'].'view/streamerResources/userGroups.php'; + include $global['systemRootPath'].'view/streamerResources/status.php'; + //include $global['systemRootPath'].'view/streamerResources/tags.php'; + //include $global['systemRootPath'].'view/streamerResources/videoOwner.php'; + include $global['systemRootPath'].'view/streamerResources/videosId.php'; + include $global['systemRootPath'].'view/streamerResources/resolutions.php'; + include $global['systemRootPath'].'view/streamerResources/info.php'; ?> -
    -
    -
    - - - -
    -
    - - - showOnlyEncoderAutomaticResolutions)) { - ?> -
    -
    -
    - doNotShowEncoderHLS)) { - ?> -
    - doNotShowEncoderResolutionLow)) { - ?> - - doNotShowEncoderResolutionSD)) { - ?> - - doNotShowEncoderResolutionHD)) { - ?> - - -
    -
    -
    -
    -
    - doNotShowExtractAudio)) { ?> -
    - - doNotShowCreateVideoSpectrum)) { ?> - - - - - -
    -
    - -
    -
    -
    -
    - :
    -
    -
    @@ -916,7 +678,7 @@ function removeQueueItem(id) { }); }); - var streamerURL = ""; + var streamerURL = ""; ', data: { - "videoURL": $('#inputVideoURL').val(), "audioOnly": $('#inputAudioOnly').is(":checked"), "spectrum": $('#inputAudioSpectrum').is(":checked"), "webm": $('#inputWebM').is(":checked"), "override_status": $('#override_status').val(), + "videoURL": $('#inputVideoURL').val(), "update_video_id": $('#update_video_id').val(), "inputHLS": $('#inputHLS').is(":checked"), "inputLow": $('#inputLow').is(":checked"), diff --git a/view/jquery-file-upload/form.php b/view/jquery-file-upload/form.php index f76ae1f72..1d50156b7 100644 --- a/view/jquery-file-upload/form.php +++ b/view/jquery-file-upload/form.php @@ -1,4 +1,8 @@ + + + user; ?>"> + pass; ?>">
    diff --git a/view/jquery-file-upload/js/main.js b/view/jquery-file-upload/js/main.js index 45ad2dd0d..fc9d7a434 100644 --- a/view/jquery-file-upload/js/main.js +++ b/view/jquery-file-upload/js/main.js @@ -13,7 +13,6 @@ $(function () { 'use strict'; - // Initialize the jQuery File Upload widget: $('#fileupload').fileupload({ // Uncomment the following to send cross-domain cookies: @@ -31,22 +30,22 @@ $(function () { buttons: true, dangerMode: true, }) - .then(function (confirm) { - if (confirm) { - $.getJSON('view/jquery-file-upload/server/php/', {file: data.files[0].name, PHPSESSID: PHPSESSID}, function (result) { - var file = result.file; - data.uploadedBytes = file && file.size; - $.blueimp.fileupload.prototype - .options.add.call(that, e, data); - }); - } - }); + .then(function (confirm) { + if (confirm) { + $.getJSON('view/jquery-file-upload/server/php/', { file: data.files[0].name, PHPSESSID: PHPSESSID }, function (result) { + var file = result.file; + data.uploadedBytes = file && file.size; + $.blueimp.fileupload.prototype + .options.add.call(that, e, data); + }); + } + }); } else { - $.getJSON('view/jquery-file-upload/server/php/', {file: data.files[0].name, PHPSESSID: PHPSESSID}, function (result) { + $.getJSON('view/jquery-file-upload/server/php/', { file: data.files[0].name, PHPSESSID: PHPSESSID }, function (result) { var file = result.file; data.uploadedBytes = file && file.size; $.blueimp.fileupload.prototype - .options.add.call(that, e, data); + .options.add.call(that, e, data); }); } @@ -57,23 +56,23 @@ $(function () { fail: function (e, data) { // jQuery Widget Factory uses "namespace-widgetname" since version 1.10.0: var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'), - retries = data.context.data('retries') || 0, - retry = function () { - $.getJSON('view/jquery-file-upload/server/php/', {file: data.files[0].name, PHPSESSID: PHPSESSID}) - .done(function (result) { - var file = result.file; - data.uploadedBytes = file && file.size; - // clear the previous data: - data.data = null; - data.submit(); - }) - .fail(function () { - fu._trigger('fail', e, data); - }); - }; + retries = data.context.data('retries') || 0, + retry = function () { + $.getJSON('view/jquery-file-upload/server/php/', { file: data.files[0].name, PHPSESSID: PHPSESSID }) + .done(function (result) { + var file = result.file; + data.uploadedBytes = file && file.size; + // clear the previous data: + data.data = null; + data.submit(); + }) + .fail(function () { + fu._trigger('fail', e, data); + }); + }; if (data.errorThrown !== 'abort' && - data.uploadedBytes < data.files[0].size && - retries < fu.options.maxRetries) { + data.uploadedBytes < data.files[0].size && + retries < fu.options.maxRetries) { retries += 1; data.context.data('retries', retries); window.setTimeout(retry, retries * fu.options.retryTimeout); @@ -81,89 +80,74 @@ $(function () { } data.context.removeData('retries'); $.blueimp.fileupload.prototype - .options.fail.call(this, e, data); + .options.fail.call(this, e, data); } }); // Enable iframe cross-domain access via redirect option: $('#fileupload').fileupload( - 'option', - 'redirect', - window.location.href.replace( - /\/[^\/]*$/, - '/cors/result.html?%s' - ) - ); + 'option', + 'redirect', + window.location.href.replace( + /\/[^\/]*$/, + '/cors/result.html?%s' + ) + ); - if (window.location.hostname === 'blueimp.github.io') { - // Demo settings: - $('#fileupload').fileupload('option', { - url: '//jquery-file-upload.appspot.com/', - // Enable image resizing, except for Android and Opera, - // which actually support image resizing, but fail to - // send Blob objects via XHR requests: - disableImageResize: /Android(?!.*Chrome)|Opera/ - .test(window.navigator.userAgent), - maxFileSize: 999000, - acceptFileTypes: /(\.|\/)(mp4|avi|mov|flv|mp3|wav|m4v|webm|wmv|mpg|mpeg|f4v|m4v|m4a|m2p|rm|vob|mkv|3gp)$/i - }); - // Upload server status check for browsers with CORS support: - if ($.support.cors) { - $.ajax({ - url: '//jquery-file-upload.appspot.com/', - type: 'HEAD' - }).fail(function () { - $('
    ') - .text('Upload server currently unavailable - ' + - new Date()) - .appendTo('#fileupload'); - }); + // Load existing files: + $('#fileupload').addClass('fileupload-processing'); + $.ajax({ + // Uncomment the following to send cross-domain cookies: + //xhrFields: {withCredentials: true}, + url: $('#fileupload').fileupload('option', 'url'), + dataType: 'json', + context: $('#fileupload')[0] + }).always(function () { + $(this).removeClass('fileupload-processing'); + }).done(function (result) { + $(this).fileupload('option', 'done') + .call(this, $.Event('done'), { result: result }); + }); + $('#fileupload').bind('fileuploadsubmit', async function (e, data) { + if($('#videos_id').val()==''){ + e.preventDefault(); + var response = await createVideo(); + console.log(response); + $('#videos_id').val(response.videos_id); + editVideos(response.videos_id); + data.submit(); + }else{ + data.formData = { + "audioOnly": $('#inputAudioOnly').is(":checked"), + "spectrum": $('#inputAudioSpectrum').is(":checked"), + "webm": $('#inputWebM').is(":checked"), + "override_status": $('#override_status').val(), + "videos_id": $('#videos_id').val(), + "update_video_id": $('#update_video_id').val(), + "inputHLS": $('#inputHLS').is(":checked"), + "inputLow": $('#inputLow').is(":checked"), + "inputSD": $('#inputSD').is(":checked"), + "inputHD": $('#inputHD').is(":checked"), + "inputAutoHLS": $('#inputAutoHLS').is(":checked"), + "inputAutoMP4": $('#inputAutoMP4').is(":checked"), + "inputAutoWebm": $('#inputAutoWebm').is(":checked"), + "inputAutoAudio": $('#inputAutoAudio').is(":checked"), + "title": $('#title').val(), + "description": $('#description').val(), + "categories_id": $('#categories_id_upload').val(), + "callback": $('#callback').val(), + "usergroups_id": $(".usergroups_id:checked").map(function () { + return $(this).val(); + }).get(), + PHPSESSID: PHPSESSID + }; } - } else { - // Load existing files: - $('#fileupload').addClass('fileupload-processing'); - $.ajax({ - // Uncomment the following to send cross-domain cookies: - //xhrFields: {withCredentials: true}, - url: $('#fileupload').fileupload('option', 'url'), - dataType: 'json', - context: $('#fileupload')[0] - }).always(function () { - $(this).removeClass('fileupload-processing'); - }).done(function (result) { - $(this).fileupload('option', 'done') - .call(this, $.Event('done'), {result: result}); - }); - } - $('#fileupload').bind('fileuploadsubmit', function (e, data) { - data.formData = { - "audioOnly": $('#inputAudioOnly').is(":checked"), - "spectrum": $('#inputAudioSpectrum').is(":checked"), - "webm": $('#inputWebM').is(":checked"), - "override_status": $('#override_status').val(), - "update_video_id": $('#update_video_id').val(), - "inputHLS": $('#inputHLS').is(":checked"), - "inputLow": $('#inputLow').is(":checked"), - "inputSD": $('#inputSD').is(":checked"), - "inputHD": $('#inputHD').is(":checked"), - "inputAutoHLS": $('#inputAutoHLS').is(":checked"), - "inputAutoMP4": $('#inputAutoMP4').is(":checked"), - "inputAutoWebm": $('#inputAutoWebm').is(":checked"), - "inputAutoAudio": $('#inputAutoAudio').is(":checked"), - "title": $('#title').val(), - "description": $('#description').val(), - "categories_id": $('#categories_id_upload').val(), - "callback": $('#callback').val(), - "usergroups_id": $(".usergroups_id:checked").map(function () { - return $(this).val(); - }).get(), - PHPSESSID: PHPSESSID - }; + }).bind('fileuploaddone', function (e, data) { //console.log(e); //console.log(data); - - console.log('fileuploaddone', data.result.files); + + console.log('fileuploaddone', data.result.files); $.ajax({ url: 'view/jquery-file-upload/server/php/fileuploadchunkdone.php?PHPSESSID=' + PHPSESSID, data: { @@ -172,6 +156,7 @@ $(function () { "spectrum": $('#inputAudioSpectrum').is(":checked"), "webm": $('#inputWebM').is(":checked"), "override_status": $('#override_status').val(), + "videos_id": $('#videos_id').val(), "update_video_id": $('#update_video_id').val(), "inputHLS": $('#inputHLS').is(":checked"), "inputLow": $('#inputLow').is(":checked"), @@ -194,8 +179,43 @@ $(function () { }, type: 'post', success: function (response) { + $('#videos_id').val(''); console.log(response); } }); }); }); + +async function createVideo() { + console.log("Form submit handler called"); + + try { + const response = await $.ajax({ + url: webSiteRootURL + 'objects/videoAddNew.json.php', + type: 'POST', + data: { + user: $('#user').val(), + pass: $('#pass').val(), + title: $('#title').val(), + description: $('#description').val(), + categories_id: $('#categories_id_upload').val(), + videoGroups: $(".usergroups_id:checked").map(function () { + return $(this).val(); + }).get(), + } + }); + + console.log("AJAX Success:", response); + // Return the AJAX response + return response; + } catch (error) { + alert('Error occurred during AJAX request.'); + console.error("AJAX Error", error); + // Handle the error here and optionally return or throw an error + throw error; + } +} + +function editVideos(videos_id) { + avideoModalIframe(webSiteRootURL +'view/managerVideosLight2.php?videos_id='+videos_id); +} \ No newline at end of file diff --git a/view/mini-upload-form/index.php b/view/mini-upload-form/index.php deleted file mode 100644 index 22c1aa2ca..000000000 --- a/view/mini-upload-form/index.php +++ /dev/null @@ -1,84 +0,0 @@ - - - - - <?php echo $config->getWebSiteTitle(); ?> :: <?php echo __("Upload your file"); ?> - - - - - - - - - - - - - - - -
    -
    -
    - -
    - - - - -
    - -
      - -
    - - - -
    -
    -
    -

    - - -

    -
    -
    getVideo_resolution()); ?>
    -
    -
    - - -
    - - - - - - - - - - - - - - - - - - diff --git a/view/streamerResources/info.php b/view/streamerResources/info.php new file mode 100644 index 000000000..d2f9222f0 --- /dev/null +++ b/view/streamerResources/info.php @@ -0,0 +1,18 @@ +
    +
    + +
    +
    +

    + + : + + + +

    +

    + + : +

    +
    +
    \ No newline at end of file diff --git a/view/streamerResources/resolutions.php b/view/streamerResources/resolutions.php new file mode 100644 index 000000000..8a7443c43 --- /dev/null +++ b/view/streamerResources/resolutions.php @@ -0,0 +1,83 @@ +showOnlyEncoderAutomaticResolutions)) { +?> +
    +
    +
    + doNotShowEncoderHLS)) { + ?> +
    + doNotShowEncoderResolutionLow)) { + ?> + + doNotShowEncoderResolutionSD)) { + ?> + + doNotShowEncoderResolutionHD)) { + ?> + + +
    +
    +
    +
    +
    + doNotShowExtractAudio)) { ?> +
    + + doNotShowCreateVideoSpectrum)) { ?> + + + + + +
    +
    + \ No newline at end of file diff --git a/view/streamerResources/status.php b/view/streamerResources/status.php new file mode 100644 index 000000000..4576d91a1 --- /dev/null +++ b/view/streamerResources/status.php @@ -0,0 +1,22 @@ +doNotAllowEncoderOverwriteStatus)) { +?> +
    +
    + + +
    +
    + +
    +
    + \ No newline at end of file diff --git a/view/streamerResources/tags.php b/view/streamerResources/tags.php new file mode 100644 index 000000000..bbdee7136 --- /dev/null +++ b/view/streamerResources/tags.php @@ -0,0 +1,28 @@ +streamerDetails->plugins->VideoTags); +if(!$videoTagsIsEnabled){ + return ''; +} +?> +
    +
    + + +
    +
    + // load the tag types
    + streamerDetails->plugins->VideoTags->videoTagsTypes as $key => $value) { + echo "{$value->name}
    "; + } + ?>
    + + // make it autosearch on the streamer for tags
    + +
    +
    + \ No newline at end of file diff --git a/view/streamerResources/userGroups.php b/view/streamerResources/userGroups.php new file mode 100644 index 000000000..75a44ff5c --- /dev/null +++ b/view/streamerResources/userGroups.php @@ -0,0 +1,79 @@ +userGroups) || !empty($global['hideUserGroups'])) { + return ''; +} +?> +
    +
    + + + + + + +
    +
    +
    + userGroups as $key => $value) { + ?> +
    + +
    + +
    +
    + +
    +
    + \ No newline at end of file diff --git a/view/streamerResources/videoOwner.php b/view/streamerResources/videoOwner.php new file mode 100644 index 000000000..eecf7eca1 --- /dev/null +++ b/view/streamerResources/videoOwner.php @@ -0,0 +1,33 @@ +streamerDetails->plugins->CustomizeUser->userCanChangeVideoOwner; +if ($_SESSION['login']->isStreamerAdmin) { + $userCanChangeVideoOwner = true; +} +if (empty($userCanChangeVideoOwner)) { + return ''; +} +?> +
    +
    + + +
    +
    + // check if user can change owner in the plugin
    +
    + // make it autosearch on the streamer for users
    + // + +
    +
    + \ No newline at end of file diff --git a/view/streamerResources/videoPoster.php b/view/streamerResources/videoPoster.php new file mode 100644 index 000000000..3bd131367 --- /dev/null +++ b/view/streamerResources/videoPoster.php @@ -0,0 +1,23 @@ +
    +
    + + +
    +
    + // Check if is portrait or landscape
    + plugin->portraitImage)){ + echo "is portrait"; + }else{ + echo "is lanscape"; + } + ?>
    + // Load cropie
    + +
    +
    + \ No newline at end of file diff --git a/view/streamerResources/videosId.php b/view/streamerResources/videosId.php new file mode 100644 index 000000000..86e814774 --- /dev/null +++ b/view/streamerResources/videosId.php @@ -0,0 +1,57 @@ +doNotAllowUpdateVideoId)) { + ?> +
    +
    +
    + + + +
    +
    + + + \ No newline at end of file diff --git a/view/upload.php b/view/upload.php index 5b8673968..a979bad66 100644 --- a/view/upload.php +++ b/view/upload.php @@ -104,9 +104,9 @@ if (!empty($_POST['update_video_id'])) { $obj->videos_id = $_POST['update_video_id']; } else { - $obj->videos_id = 0; + $obj->videos_id = intval(@$_POST['videos_id']); } - + //var_dump($obj->videos_id, $_POST);exit; $obj->releaseDate = @$_REQUEST['releaseDate']; // This raises an harmless error From 605cea698fd0fe19401e5a69acf7c3b5fb012cc9 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 2 Jan 2024 12:49:06 -0300 Subject: [PATCH 127/416] Update --- view/jquery-file-upload/js/main.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/view/jquery-file-upload/js/main.js b/view/jquery-file-upload/js/main.js index fc9d7a434..35fccb7e3 100644 --- a/view/jquery-file-upload/js/main.js +++ b/view/jquery-file-upload/js/main.js @@ -217,5 +217,8 @@ async function createVideo() { } function editVideos(videos_id) { - avideoModalIframe(webSiteRootURL +'view/managerVideosLight2.php?videos_id='+videos_id); + var url = webSiteRootURL +'view/managerVideosLight2.php?videos_id='+videos_id; + url += '&user='+$('#user').val(); + url += '&pass='+$('#pass').val(); + avideoModalIframe(url); } \ No newline at end of file From af4c70eff9a3fe972e7ce7f0a2d64be27364091f Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 4 Jan 2024 09:44:01 -0300 Subject: [PATCH 128/416] https://github.com/WWBN/AVideo/issues/8761 --- view/jquery-file-upload/js/main.js | 31 ++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/view/jquery-file-upload/js/main.js b/view/jquery-file-upload/js/main.js index 35fccb7e3..ccba19ea0 100644 --- a/view/jquery-file-upload/js/main.js +++ b/view/jquery-file-upload/js/main.js @@ -109,14 +109,19 @@ $(function () { .call(this, $.Event('done'), { result: result }); }); $('#fileupload').bind('fileuploadsubmit', async function (e, data) { - if($('#videos_id').val()==''){ + if ($('#videos_id').val() == '') { e.preventDefault(); var response = await createVideo(); - console.log(response); - $('#videos_id').val(response.videos_id); - editVideos(response.videos_id); + console.log(response); + if (!empty(response) && !empty(response.videos_id)) { + $('#videos_id').val(response.videos_id); + editVideos(response.videos_id); + }else{ + $('#videos_id').val(0); + } + data.submit(); - }else{ + } else { data.formData = { "audioOnly": $('#inputAudioOnly').is(":checked"), "spectrum": $('#inputAudioSpectrum').is(":checked"), @@ -179,7 +184,7 @@ $(function () { }, type: 'post', success: function (response) { - $('#videos_id').val(''); + $('#videos_id').val(''); console.log(response); } }); @@ -188,7 +193,7 @@ $(function () { async function createVideo() { console.log("Form submit handler called"); - + modal.showPleaseWait(); try { const response = await $.ajax({ url: webSiteRootURL + 'objects/videoAddNew.json.php', @@ -207,18 +212,20 @@ async function createVideo() { console.log("AJAX Success:", response); // Return the AJAX response + modal.hidePleaseWait(); return response; } catch (error) { - alert('Error occurred during AJAX request.'); + modal.hidePleaseWait(); + avideoToastError('Error occurred during AJAX request.'); console.error("AJAX Error", error); // Handle the error here and optionally return or throw an error - throw error; + return false; } } function editVideos(videos_id) { - var url = webSiteRootURL +'view/managerVideosLight2.php?videos_id='+videos_id; - url += '&user='+$('#user').val(); - url += '&pass='+$('#pass').val(); + var url = webSiteRootURL + 'view/managerVideosLight2.php?videos_id=' + videos_id; + url += '&user=' + $('#user').val(); + url += '&pass=' + $('#pass').val(); avideoModalIframe(url); } \ No newline at end of file From 09e7247102299ee4986baa4a268ad4c4b6784a2e Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 9 Jan 2024 10:44:34 -0300 Subject: [PATCH 129/416] Update timezone on release date --- objects/include_config.php | 4 ++++ view/index.php | 3 ++- view/jquery-file-upload/js/main.js | 11 +++++++---- view/js/setTimezoneCookie.js | 23 +++++++++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 view/js/setTimezoneCookie.js diff --git a/objects/include_config.php b/objects/include_config.php index 11c682dc0..e1a0b17f2 100644 --- a/objects/include_config.php +++ b/objects/include_config.php @@ -39,6 +39,10 @@ $offset = sprintf('%+d:%02d', $hrs * $sgn, $mins); $global['mysqli']->query("SET time_zone='$offset';"); +if(isset($_COOKIE['timezone'])) { + date_default_timezone_set($_COOKIE['timezone']); +} + session_set_cookie_params(86400); ini_set('session.gc_maxlifetime', 86400); ini_set('session.cookie_lifetime', 86400); diff --git a/view/index.php b/view/index.php index 3497d4280..49a814845 100644 --- a/view/index.php +++ b/view/index.php @@ -52,7 +52,8 @@ - + + diff --git a/view/jquery-file-upload/js/main.js b/view/jquery-file-upload/js/main.js index ccba19ea0..5ca7840e4 100644 --- a/view/jquery-file-upload/js/main.js +++ b/view/jquery-file-upload/js/main.js @@ -10,7 +10,7 @@ */ /* global $, window */ - +var selectedFileName = ""; $(function () { 'use strict'; // Initialize the jQuery File Upload widget: @@ -20,6 +20,7 @@ $(function () { url: 'view/jquery-file-upload/server/php/?PHPSESSID=' + PHPSESSID, maxChunkSize: 5000000, // 5 MB add: function (e, data) { + selectedFileName = data.files[0].name; var videos_id = $('#update_video_id').val(); var that = this; if (videos_id) { @@ -48,8 +49,6 @@ $(function () { .options.add.call(that, e, data); }); } - - }, maxRetries: 100, retryTimeout: 500, @@ -195,13 +194,17 @@ async function createVideo() { console.log("Form submit handler called"); modal.showPleaseWait(); try { + var title = $('#title').val(); + if(empty(title)){ + title = selectedFileName.replace(/\.[^/.]+$/, ""); + } const response = await $.ajax({ url: webSiteRootURL + 'objects/videoAddNew.json.php', type: 'POST', data: { user: $('#user').val(), pass: $('#pass').val(), - title: $('#title').val(), + title: title, description: $('#description').val(), categories_id: $('#categories_id_upload').val(), videoGroups: $(".usergroups_id:checked").map(function () { diff --git a/view/js/setTimezoneCookie.js b/view/js/setTimezoneCookie.js new file mode 100644 index 000000000..e501f2bcb --- /dev/null +++ b/view/js/setTimezoneCookie.js @@ -0,0 +1,23 @@ +function setTimezoneCookie() { + var timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + var existingTimezone = getCookie('timezone'); + + if (timezone !== existingTimezone) { + document.cookie = "timezone=" + timezone + ";path=/"; + window.location.reload(); // Refresh the page + } +} + +function getCookie(name) { + var cookieArr = document.cookie.split(";"); + for(var i = 0; i < cookieArr.length; i++) { + var cookiePair = cookieArr[i].split("="); + if (name == cookiePair[0].trim()) { + return decodeURIComponent(cookiePair[1]); + } + } + return null; +} + +// Call this function on page load +setTimezoneCookie(); From ffd472c2a7b153d641a0f1c35cc9096c92b6f193 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 15 Jan 2024 15:07:26 -0300 Subject: [PATCH 130/416] update --- view/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/index.php b/view/index.php index 49a814845..82ba65f19 100644 --- a/view/index.php +++ b/view/index.php @@ -984,7 +984,7 @@ function removeQueueItem(id) { }, formatters: { "priority": function(column, row) { - var tag = ""; for (i = 1; i <= 10; i++) { var selected = ""; if (row.priority == i) { @@ -996,7 +996,7 @@ function removeQueueItem(id) { return tag; }, "admin": function(column, row) { - var tag = ""; tag += ""; tag += ""; tag += ""; From a02765d9fecc336e832f2acc8d2017df65584c80 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 15 Jan 2024 15:09:36 -0300 Subject: [PATCH 131/416] Update --- view/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/index.php b/view/index.php index 82ba65f19..8e9ae412c 100644 --- a/view/index.php +++ b/view/index.php @@ -841,7 +841,7 @@ function removeQueueItem(id) { if (row.status != 'queue' && row.status != 'encoding') { reQueue = '' } - deleteQueue = '' + deleteQueue = '' if (row.status === 'done' || row.status === 'transferring') { sendFileQueue = '' } @@ -1003,7 +1003,7 @@ function removeQueueItem(id) { return tag; }, "commands": function(column, row) { - var deleteBtn = ''; + var deleteBtn = ''; return deleteBtn; } From 18949a17e32a2376c8f70e3e7066ca87c30d6f4a Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 18 Jan 2024 12:10:16 -0300 Subject: [PATCH 132/416] Updates --- install/index.php | 6 +++--- view/encodeProgressTemplate.html | 2 +- view/index.php | 10 +++++----- view/streamerResources/userGroups.php | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/install/index.php b/install/index.php index 41a660c2c..30b67f1b3 100644 --- a/install/index.php +++ b/install/index.php @@ -365,7 +365,7 @@
    +
    -
    URLUserPriorityAdmin
    + + + @@ -359,13 +359,13 @@ function changeLang() {
    @@ -849,7 +849,7 @@ function removeQueueItem(id) { edit = '' } - return '
    '+edit + sendFileQueue + reQueue + deleteQueue+'
    '; + return '
    ' + edit + sendFileQueue + reQueue + deleteQueue + '
    '; }, "dates": function(column, row) { return "Created: " + row.created + "
    Modified: " + row.modified; @@ -882,8 +882,8 @@ function removeQueueItem(id) { if (typeof json.videos_id !== 'undefined') { videos_id = json.videos_id; } - var title = '' + l.hostname + ' ' + row.priority + ''; - title += '
    ' + row.format + ' [' + videos_id + '] [' + row.id + ']'; + var title = '' + l.hostname + ' ' + row.priority + ''; + title += '
    ' + row.format + ' [' + row.id + ']'; for (const index in row.fileInfo) { if (typeof row.fileInfo[index].text === 'undefined') { @@ -1172,7 +1172,7 @@ function submitDownloadForm() { if (response.text) { let message = response.text; if (Array.isArray(message)) { - message = message.join(', '); // join all array elements into a string + message = message.join(', '); // join all array elements into a string } avideoAlert(response.title, message, response.type); avideoAlert(response.title, response.text, response.type); @@ -1198,4 +1198,4 @@ function resetAutocompleteVideosID() { - + \ No newline at end of file From 114a828b9a1f686954ae1353b47c820e95cbb72c Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 12:56:11 -0300 Subject: [PATCH 158/416] Update --- objects/functions.php | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index bb7532879..9f01b1709 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -963,22 +963,19 @@ function execAsync($command) { global $global; // If windows, else if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - //$pid = system($command . " > NUL"); - //pclose($pid = popen("start /B ". $command, "r")); error_log($command); $pid = exec($command, $output, $retval); error_log('execAsync: ' . json_encode($output) . ' ' . $retval); } else { - $newCmd = $command . " > /dev/null 2>&1 & echo $!; "; - // the command below was clearing the log - //$newCmd = $command . " > {$global['systemRootPath']}videos/avideo.log 2>&1 & "; - //error_log('execAsync start: ' . $newCmd); - $pid = exec($newCmd, $output, $retval); - //error_log('execAsync end : ' . json_encode($output) . ' ' . $retval); + $newCmd = "nohup " . $command . " > /dev/null 2>&1 & echo $!;"; + error_log('execAsync start: ' . $newCmd); + $pid = shell_exec($newCmd); + error_log('execAsync end : ' . $pid); } - return $pid; + return trim($pid); } + function execRun() { global $global; $php = getPHP() . " -f"; From 3d649b2ceb0215816bbe34affd9861fcfc00a662 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 13:23:31 -0300 Subject: [PATCH 159/416] Update --- objects/Encoder.php | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index b33b3b986..f8d74471e 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -685,34 +685,13 @@ public static function getVideoFile($videoURL, $queue_id, $downloadedFile, $dest public static function areDownloading() { - global $global; - $sql = "SELECT f.*, e.* FROM " . static::getTableName() . " e " - . " LEFT JOIN {$global['tablesPrefix']}formats f ON f.id = formats_id WHERE status = '" . Encoder::$STATUS_DOWNLOADED . "' OR status = '" . Encoder::$STATUS_DOWNLOADING . "' ORDER BY priority ASC, e.id ASC "; - - /** - * @var array $global - * @var object $global['mysqli'] - */ - $res = $global['mysqli']->query($sql); - $results = []; - if ($res) { - while ($result = $res->fetch_assoc()) { - $encoder = new Encoder($result['id']); - $result['return_vars'] = json_decode($result['return_vars']); - $s = new Streamer($result['streamers_id']); - $result['streamer_site'] = $s->getSiteURL(); - $result['streamer_priority'] = $s->getPriority(); - $results[] = $result; - } - } else { - die($sql . '\nError : (' . $global['mysqli']->errno . ') ' . $global['mysqli']->error); - } - return $results; + return self::getQueue($status = array(Encoder::$STATUS_DOWNLOADED, Encoder::$STATUS_DOWNLOADING)); } public static function areEncoding() { - return self::getQueue($status = array(Encoder::$STATUS_ENCODING, Encoder::$STATUS_DOWNLOADING)); + //return self::getQueue($status = array(Encoder::$STATUS_ENCODING, Encoder::$STATUS_DOWNLOADING)); + return self::getQueue($status = array(Encoder::$STATUS_ENCODING)); } public static function areDownloaded() From 8700ae7adfcc07a79a8d4fdac5e4d263895ea2a9 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 13:31:26 -0300 Subject: [PATCH 160/416] Update --- objects/functions.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 9f01b1709..11e512e70 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -962,15 +962,21 @@ function isPIDRunning($pid) { function execAsync($command) { global $global; // If windows, else + $log = strpos($command, 'run.php') === false; + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { error_log($command); $pid = exec($command, $output, $retval); error_log('execAsync: ' . json_encode($output) . ' ' . $retval); } else { $newCmd = "nohup " . $command . " > /dev/null 2>&1 & echo $!;"; - error_log('execAsync start: ' . $newCmd); + if($log){ + error_log('execAsync start: ' . $newCmd); + } $pid = shell_exec($newCmd); - error_log('execAsync end : ' . $pid); + if($log){ + error_log('execAsync end : ' . $pid); + } } return trim($pid); } From ab2f493b83e0abc0e18acc42497b874d6fc40f3f Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 14:58:23 -0300 Subject: [PATCH 161/416] Update --- objects/Encoder.php | 9 ++++++++- objects/Format.php | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index f8d74471e..7a4d3eec1 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -442,6 +442,7 @@ public static function getNext() public static function downloadFile($queue_id) { + global $global; $obj = new stdClass(); $q = new Encoder($queue_id); @@ -466,12 +467,18 @@ public static function downloadFile($queue_id) $obj->filename = $filename; $obj->pathFileName = $dstFilepath . $filename; + $downloading = static::areDownloading(); + if(!empty($downloading)){ + error_log("downloadFile: there are a file downloading"); + return $obj; + } + if (file_exists($obj->pathFileName)) { if ($q->getStatus() == 'queue') { self::setDownloaded($queue_id, $obj->pathFileName); } $obj->error = false; - //error_log("downloadFile: file already exists queue_id = {$queue_id} url = {$url} pathFileName = {$obj->pathFileName}"); + error_log("downloadFile: file already exists queue_id = {$queue_id} url = {$url} pathFileName = {$obj->pathFileName}"); return $obj; } diff --git a/objects/Format.php b/objects/Format.php index 8213801df..47c350a3e 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -847,9 +847,9 @@ public static function videoFileHasErrors($filename, $allowed_extensions = true) $durationOption = '-t 10'; // check the first 10 seconds if (isWindows()) { - $command = get_ffmpeg() . " {$complement} {$skipFramesOption} {$durationOption} -v error -i \"{$filename}\" -f null - >\"{$errorLogFile}\" 2>&1 "; + $command = get_ffmpeg() . " {$complement} {$skipFramesOption} {$durationOption} -v error -i \"{$filename}\" -f null - > \"{$errorLogFile}\" 2>&1 "; } else { - $command = get_ffmpeg() . " {$complement} {$skipFramesOption} {$durationOption} -v error -i \"{$filename}\" -f null - 2>\"{$errorLogFile}\" "; + $command = get_ffmpeg() . " {$complement} {$skipFramesOption} {$durationOption} -v error -i \"{$filename}\" -f null - 2> \"{$errorLogFile}\" "; } $command = removeUserAgentIfNotURL($command); exec($command, $output, $return_var); From a1225051addfc30ca4603324ba32d0a0462ab533 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 15:20:54 -0300 Subject: [PATCH 162/416] Update --- objects/Encoder.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 7a4d3eec1..ff8ee345d 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -573,9 +573,9 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile) //$cmd = "youtube-dl -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; - error_log("getYoutubeDl: Getting from Youtube DL {$cmd} " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); - $progressFile = "{$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt"; + error_log("getYoutubeDl: Getting from Youtube DL {$cmd} progressFile={$progressFile} " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); + exec($cmd . " 1> {$progressFile} 2>&1", $output, $return_val); error_log("getYoutubeDl: Getting from Youtube DL {$cmd} done {$progressFile} "); if ($return_val !== 0) { @@ -633,6 +633,7 @@ public static function getYoutubeDlProgress($queue_id) $obj = new stdClass(); $obj->filename = ""; $obj->progress = 0; + $obj->queue_id = $queue_id; $file = "{$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt"; if (!file_exists($file) || filesize($file) > 5000000) { return $obj; From 7459e2208ae55c52336c23abfa75d22dcf0617a1 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 15:26:11 -0300 Subject: [PATCH 163/416] Update --- view/status.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/view/status.php b/view/status.php index 028a79276..6e9ce41af 100644 --- a/view/status.php +++ b/view/status.php @@ -11,6 +11,7 @@ $obj->queue_size = 0; $obj->concurrent = 1; $obj->is_encoding = false; +$obj->is_downloading = false; $obj->queue_list = array(); $obj->msg = ""; $obj->encoding = new stdClass(); @@ -24,6 +25,7 @@ } $obj->encoding = Encoder::areEncoding(); $obj->downloaded = Encoder::areDownloaded(); +$obj->downloading = Encoder::areDownloading(); $obj->transferring = Encoder::areTransferring(); //$obj->transferring = Encoder::isTransferring(); $obj->queue_list = Encoder::getAllQueue(); @@ -41,7 +43,6 @@ $msg = (count($obj->encoding) == 1) ? "The file " : "The files "; for ($i = 0; $i < count($obj->encoding); $i++) { $obj->encoding_status[$i] = Encoder::getVideoConversionStatus($obj->encoding[$i]['id']); - $obj->download_status[$i] = Encoder::getYoutubeDlProgress($obj->encoding[$i]['id']); $msg .= "[{$obj->encoding[$i]['id']}] {$obj->encoding[$i]['filename']}"; if (count($obj->encoding) > 1 && $i < count($obj->encoding) - 1) { $msg .= ", "; @@ -51,6 +52,20 @@ $obj->msg = $msg; } +if (!empty($obj->downloading)) { + $obj->is_downloading = true; + $msg = (count($obj->downloading) == 1) ? "The file " : "The files "; + for ($i = 0; $i < count($obj->encoding); $i++) { + $obj->download_status[$i] = Encoder::getYoutubeDlProgress($obj->downloading[$i]['id']); + $msg .= "[{$obj->encoding[$i]['id']}] {$obj->encoding[$i]['filename']}"; + if (count($obj->downloading) > 1 && $i < count($obj->downloading) - 1) { + $msg .= ", "; + } + } + $msg .= (count($obj->encoding) == 1) ? " is downloading" : " are downloading"; + $obj->msg = $msg; +} + if (!empty($_GET['serverStatus'])) { require_once '../objects/ServerMonitor.php'; require_once '../objects/functions.php'; From 50d8fda05b4da9094d5a593f82637dc307f670d9 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 15:33:02 -0300 Subject: [PATCH 164/416] Update --- objects/Format.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Format.php b/objects/Format.php index 47c350a3e..dad3b4b26 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -58,7 +58,7 @@ protected static function getFromOrder($order) { } public function run($pathFileName, $encoder_queue_id) { - error_log("AVideo-Encoder Format::run($pathFileName, $encoder_queue_id)"); + error_log("AVideo-Encoder Format::run($pathFileName, $encoder_queue_id) ".json_encode(debug_backtrace())); global $global; $obj = new stdClass(); $obj->error = true; From 9a148870e3351042efde0ae9023e41850c6579ae Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 15:44:01 -0300 Subject: [PATCH 165/416] Update --- install/reencodeAllVideos.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/install/reencodeAllVideos.php b/install/reencodeAllVideos.php index d779b6086..2caad0702 100644 --- a/install/reencodeAllVideos.php +++ b/install/reencodeAllVideos.php @@ -6,7 +6,10 @@ if (!isCommandLineInterface()) { return die('Command Line only'); } - +/** + * @var array $global + * @var object $global['mysqli'] + */ $sql = "UPDATE {$global['tablesPrefix']}encoder_queue SET status = 'queue' where id > 0"; echo $sql . PHP_EOL; $insert_row = $global['mysqli']->query($sql); From 5f47f28b6af6b9ca968c875aae87c1130602765a Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 1 Mar 2024 17:23:10 -0300 Subject: [PATCH 166/416] uPDATE --- view/index.php | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/view/index.php b/view/index.php index 0ea1e7f57..fc08e9e19 100644 --- a/view/index.php +++ b/view/index.php @@ -593,20 +593,28 @@ function checkProgress() { for (i = 0; i < encodingNowIds.length; i++) { var id = encodingNowIds[i]; + var setText = true; + var text = ''; + try { + if (response.encoding_status[i].progress) { + setText = false; + setEncodingProgress(id, response.encoding_status[i].progress, text); + } + text = response.encoding[i].name + " [ ...]"; + } catch (error) { - var text = response.encoding[i].name + " [ ...]"; - if (response.download_status[i] && response.encoding_status[i].progress) { - text = response.encoding[i].name + " [" + response.encoding_status[i].from + " to " + response.encoding_status[i].to + "] " + response.encoding_status[i].remainTimeHuman; } - var setText = true; - if (response.encoding_status[i].progress) { - setText = false; - setEncodingProgress(id, response.encoding_status[i].progress, text); + try { + if (response.download_status[i] && response.encoding_status[i].progress) { + text = response.encoding[i].name + " [" + response.encoding_status[i].from + " to " + response.encoding_status[i].to + "] " + response.encoding_status[i].remainTimeHuman; + } + + if (response.download_status[i]) { + setDownloadProgress(id, response.download_status[i].progress, setText); + } + } catch (error) { } - if (response.download_status[i]) { - setDownloadProgress(id, response.download_status[i].progress, setText); - } } setTimeout(function() { From 749d69c2e024ad8fef3efe7580be2ee7364c5bce Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 19 Mar 2024 08:18:47 -0300 Subject: [PATCH 167/416] https://github.com/WWBN/AVideo/issues/8796 --- objects/Encoder.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/objects/Encoder.php b/objects/Encoder.php index ff8ee345d..1a0d8a434 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -107,6 +107,10 @@ public function save() $this->filename = ''; } + if(function_exists('mb_detect_encoding') && !mb_detect_encoding($this->title, 'UTF-8', true)){ + $this->title = mb_convert_encoding($this->title, 'UTF-8'); + } + if (empty($this->id) && (self::isPorn($this->fileURI) || self::isPorn($this->videoDownloadedLink) || self::isPorn($this->filename) || self::isPorn($this->title))) { if ($what = self::isPorn($this->fileURI)) { error_log("Encoder::save deny [$what] ".__LINE__); From 1385def161fb009d0e516d40ac729bc75dc1c93f Mon Sep 17 00:00:00 2001 From: Caleb Mazalevskis Date: Fri, 22 Mar 2024 17:43:12 +0800 Subject: [PATCH 168/416] L10N patch. --- locale/ar_SA.php | 6 +++--- locale/el_GR.php | 22 +++++++++++----------- locale/es.php | 24 ++++++++++++------------ locale/es_CL.php | 24 ++++++++++++------------ locale/fr.php | 22 +++++++++++----------- locale/he_IL.php | 24 ++++++++++++------------ locale/hi_IN.php | 24 ++++++++++++------------ locale/hu_HU.php | 22 +++++++++++----------- locale/it.php | 24 ++++++++++++------------ locale/ko_KR.php | 24 ++++++++++++------------ locale/pt.php | 17 +++++++++++++++++ locale/pt_BR.php | 17 +++++++++++++++++ locale/si.php | 22 +++++++++++----------- locale/sv_SE.php | 22 +++++++++++----------- locale/tr.php | 24 ++++++++++++------------ locale/zh.php | 24 ++++++++++++------------ locale/zh_Hant_TW.php | 24 ++++++++++++------------ 17 files changed, 200 insertions(+), 166 deletions(-) diff --git a/locale/ar_SA.php b/locale/ar_SA.php index 0db610f3e..1919d3fc8 100644 --- a/locale/ar_SA.php +++ b/locale/ar_SA.php @@ -106,8 +106,8 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; +$t['Year'] = 'سنة'; +$t['Years'] = 'سنوات'; $t['Yes'] = 'Yes'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; @@ -123,4 +123,4 @@ $t['more sites'] = 'more sites'; $t['second'] = 'second'; $t['week'] = 'week'; -$t['year'] = 'year'; +$t['year'] = 'سنة'; diff --git a/locale/el_GR.php b/locale/el_GR.php index 0db610f3e..a930214f5 100644 --- a/locale/el_GR.php +++ b/locale/el_GR.php @@ -106,9 +106,9 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = 'Έτος'; +$t['Years'] = 'Έτη'; +$t['Yes'] = 'Ναί'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; @@ -116,11 +116,11 @@ $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; $t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; -$t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['day'] = 'ημέρα'; +$t['hour'] = 'ώρα'; +$t['minute'] = 'λεπτό'; +$t['month'] = 'μήνας'; +$t['more sites'] = 'περισσότερους ιστότοπους'; +$t['second'] = 'δευτερόλεπτο'; +$t['week'] = 'εβδομάδα'; +$t['year'] = 'έτος'; diff --git a/locale/es.php b/locale/es.php index 0db610f3e..7012ebf9b 100644 --- a/locale/es.php +++ b/locale/es.php @@ -106,21 +106,21 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = 'Año'; +$t['Years'] = 'Años'; +$t['Yes'] = 'Sí'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; $t['Your maximum file size is:'] = 'Your maximum file size is:'; $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; -$t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; -$t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['Your user or password is wrong!'] = '¡Tu usuario o contraseña es incorrecto!'; +$t['day'] = 'día'; +$t['hour'] = 'hora'; +$t['minute'] = 'minuto'; +$t['month'] = 'mes'; +$t['more sites'] = 'más sitios'; +$t['second'] = 'segundo'; +$t['week'] = 'semana'; +$t['year'] = 'año'; diff --git a/locale/es_CL.php b/locale/es_CL.php index 0db610f3e..88334b3f7 100644 --- a/locale/es_CL.php +++ b/locale/es_CL.php @@ -106,21 +106,21 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = 'Año'; +$t['Years'] = 'Años'; +$t['Yes'] = 'Si'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; $t['Your maximum file size is:'] = 'Your maximum file size is:'; $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; -$t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; -$t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['Your user or password is wrong!'] = '¡Tu usuario o contraseña es incorrecto!'; +$t['day'] = 'día'; +$t['hour'] = 'hora'; +$t['minute'] = 'minuto'; +$t['month'] = 'mes'; +$t['more sites'] = 'más sitios'; +$t['second'] = 'segundo'; +$t['week'] = 'semana'; +$t['year'] = 'año'; diff --git a/locale/fr.php b/locale/fr.php index 0db610f3e..772e57526 100644 --- a/locale/fr.php +++ b/locale/fr.php @@ -106,21 +106,21 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = 'Année'; +$t['Years'] = 'Années'; +$t['Yes'] = 'Oui'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; $t['Your maximum file size is:'] = 'Your maximum file size is:'; $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; -$t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; +$t['Your user or password is wrong!'] = 'Votre utilisateur ou votre mot de passe est erroné !'; +$t['day'] = 'jour'; +$t['hour'] = 'heure'; $t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['month'] = 'mois'; +$t['more sites'] = 'plus de sites'; +$t['second'] = 'seconde'; +$t['week'] = 'semaine'; +$t['year'] = 'année'; diff --git a/locale/he_IL.php b/locale/he_IL.php index 0db610f3e..696b7c25e 100644 --- a/locale/he_IL.php +++ b/locale/he_IL.php @@ -106,21 +106,21 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = 'שנה'; +$t['Years'] = 'שנים'; +$t['Yes'] = 'כן'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; $t['Your maximum file size is:'] = 'Your maximum file size is:'; $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; -$t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; -$t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['Your user or password is wrong!'] = 'המשתמש או הסיסמה שלך שגויים!'; +$t['day'] = 'יום'; +$t['hour'] = 'שעה'; +$t['minute'] = 'דקה'; +$t['month'] = 'חודש'; +$t['more sites'] = 'אתרים נוספים'; +$t['second'] = 'השני'; +$t['week'] = 'שבוע'; +$t['year'] = 'שנה'; diff --git a/locale/hi_IN.php b/locale/hi_IN.php index 0db610f3e..2f654ec26 100644 --- a/locale/hi_IN.php +++ b/locale/hi_IN.php @@ -106,21 +106,21 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = 'साल'; +$t['Years'] = 'साल'; +$t['Yes'] = 'हाँ'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; $t['Your maximum file size is:'] = 'Your maximum file size is:'; $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; -$t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; -$t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['Your user or password is wrong!'] = 'आपका उपयोगकर्ता या पासवर्ड गलत है!'; +$t['day'] = 'दिन'; +$t['hour'] = 'घंटा'; +$t['minute'] = 'मिनट'; +$t['month'] = 'महीना'; +$t['more sites'] = 'अधिक साइटें'; +$t['second'] = 'सेकंड'; +$t['week'] = 'हफ्ता'; +$t['year'] = 'साल'; diff --git a/locale/hu_HU.php b/locale/hu_HU.php index 0db610f3e..cdb980f08 100644 --- a/locale/hu_HU.php +++ b/locale/hu_HU.php @@ -106,9 +106,9 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = 'Év'; +$t['Years'] = 'Évek'; +$t['Yes'] = 'Igen'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; @@ -116,11 +116,11 @@ $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; $t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; -$t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['day'] = 'nap'; +$t['hour'] = 'óra'; +$t['minute'] = 'perc'; +$t['month'] = 'hónap'; +$t['more sites'] = 'több webhely'; +$t['second'] = 'második'; +$t['week'] = 'hét'; +$t['year'] = 'év'; diff --git a/locale/it.php b/locale/it.php index 0db610f3e..f18b04618 100644 --- a/locale/it.php +++ b/locale/it.php @@ -106,21 +106,21 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = 'Anno'; +$t['Years'] = 'Anni'; +$t['Yes'] = 'Si'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; $t['Your maximum file size is:'] = 'Your maximum file size is:'; $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; -$t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; -$t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['Your user or password is wrong!'] = 'Il tuo utente o la tua password sono errati!'; +$t['day'] = 'giorno'; +$t['hour'] = 'ora'; +$t['minute'] = 'minuta'; +$t['month'] = 'mese'; +$t['more sites'] = 'più siti'; +$t['second'] = 'seconda'; +$t['week'] = 'settimana'; +$t['year'] = 'anno'; diff --git a/locale/ko_KR.php b/locale/ko_KR.php index 0db610f3e..c736ee8bc 100644 --- a/locale/ko_KR.php +++ b/locale/ko_KR.php @@ -106,21 +106,21 @@ $t['We could not find your streamer site!'] = 'We could not find your streamer site!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'We detected a total of %s pending updates, if you want to do it now click (Update Now) button'; $t['Will remove queue and the files when the encoder process is done'] = 'Will remove queue and the files when the encoder process is done'; -$t['Year'] = 'Year'; -$t['Years'] = 'Years'; -$t['Yes'] = 'Yes'; +$t['Year'] = '연도'; +$t['Years'] = '몇 해'; +$t['Yes'] = '네'; $t['You are running AVideo Encoder version %s!'] = 'You are running AVideo Encoder version %s!'; $t['You will overwrite the video ID:'] = 'You will overwrite the video ID:'; $t['Your encode video resolution is set to %s !'] = 'Your encode video resolution is set to %s !'; $t['Your maximum file size is:'] = 'Your maximum file size is:'; $t['Your system is up to date'] = 'Your system is up to date'; $t['Your update from file %s is done, click continue'] = 'Your update from file %s is done, click continue'; -$t['Your user or password is wrong!'] = 'Your user or password is wrong!'; -$t['day'] = 'day'; -$t['hour'] = 'hour'; -$t['minute'] = 'minute'; -$t['month'] = 'month'; -$t['more sites'] = 'more sites'; -$t['second'] = 'second'; -$t['week'] = 'week'; -$t['year'] = 'year'; +$t['Your user or password is wrong!'] = '사용자 또는 비밀번호가 잘못되었습니다!'; +$t['day'] = '하루'; +$t['hour'] = '시간'; +$t['minute'] = '극히 작은'; +$t['month'] = '달'; +$t['more sites'] = '더 많은 사이트'; +$t['second'] = '둘째'; +$t['week'] = '일주일'; +$t['year'] = '연도'; diff --git a/locale/pt.php b/locale/pt.php index 63d66e8f4..5bf296058 100644 --- a/locale/pt.php +++ b/locale/pt.php @@ -1,4 +1,5 @@ Date: Wed, 10 Apr 2024 10:34:45 -0300 Subject: [PATCH 169/416] https://github.com/WWBN/AVideo/issues/8971 --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 1a0d8a434..01dc9bff5 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -134,7 +134,7 @@ public function save() $this->worker_pid = intval($this->worker_pid); $this->setTitle($global['mysqli']->real_escape_string(str_replace('\\\\', '', stripslashes($this->getTitle())))); $this->setStatus_obs($global['mysqli']->real_escape_string(str_replace('\\\\', '', stripslashes($this->getStatus_obs())))); - error_log("Encoder::save id=(" . $this->getId() . ") title=(" . $this->getTitle() . ")"); + error_log("Encoder::save id=(" . $this->getId() . ") title=(" . $this->getTitle() . ") streamers_id={$this->streamers_id} "); return parent::save(); } From 15f6584a5d0b0fdb6d7b955d25481208cb63698f Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 18 Apr 2024 13:40:09 -0300 Subject: [PATCH 170/416] Remove sensitive data from status --- objects/functions.php | 21 +++++++++++++++++++++ view/status.php | 16 ++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/objects/functions.php b/objects/functions.php index 11e512e70..d14bfd2f2 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1274,3 +1274,24 @@ function checkZipArchiveAndVersion() { } } +function removeKeyFromJsonObject($jsonObject, $keyToRemove) { + // Decode the JSON object into an associative array + $array = json_decode($jsonObject, true); + + // Recursive function to remove the key from the array + function removeKey(&$array, $keyToRemove) { + foreach ($array as $key => &$value) { + if ($key == $keyToRemove) { + unset($array[$key]); + } elseif (is_array($value)) { + removeKey($value, $keyToRemove); + } + } + } + + // Call the recursive function + removeKey($array, $keyToRemove); + + // Encode the modified array back into JSON + return json_encode($array); +} diff --git a/view/status.php b/view/status.php index 6e9ce41af..3e9b7ffd6 100644 --- a/view/status.php +++ b/view/status.php @@ -72,5 +72,21 @@ $obj->memory = ServerMonitor::getMemory(); $obj->file_upload_max_size = get_max_file_size(); } + +$remove = array( + 'return_vars', + 'filename', + 'fileURI', + 'worker_pid', + 'worker_ppid', + 'videoDownloadedLink', + 'downloadedFileName', + 'code', +); + +foreach ($remove as $value) { + $obj = removeKeyFromJsonObject($obj, $value); +} + $resp = json_encode($obj); echo $resp; From c567c3ad23ada81849ca512fdad34598cab914b2 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 18 Apr 2024 13:41:38 -0300 Subject: [PATCH 171/416] Update --- objects/functions.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/objects/functions.php b/objects/functions.php index d14bfd2f2..992f038a7 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1275,6 +1275,9 @@ function checkZipArchiveAndVersion() { } function removeKeyFromJsonObject($jsonObject, $keyToRemove) { + if(!is_string($jsonObject)){ + $jsonObject = json_encode($jsonObject); + } // Decode the JSON object into an associative array $array = json_decode($jsonObject, true); From 4948eaf610bc425ad832abde5e93ca7fb3f4f977 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 18 Apr 2024 13:42:58 -0300 Subject: [PATCH 172/416] Update --- view/status.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/status.php b/view/status.php index 3e9b7ffd6..d77157bec 100644 --- a/view/status.php +++ b/view/status.php @@ -88,5 +88,5 @@ $obj = removeKeyFromJsonObject($obj, $value); } -$resp = json_encode($obj); -echo $resp; +//$resp = json_encode($obj); +echo $obj; From cce6b85b65e06b22e78953f13a4420aff0a2e18b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 18 Apr 2024 13:43:34 -0300 Subject: [PATCH 173/416] Update --- objects/functions.php | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 992f038a7..0555ccec7 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1274,6 +1274,17 @@ function checkZipArchiveAndVersion() { } } +// Recursive function to remove the key from the array +function removeKey(&$array, $keyToRemove) { + foreach ($array as $key => &$value) { + if ($key == $keyToRemove) { + unset($array[$key]); + } elseif (is_array($value)) { + removeKey($value, $keyToRemove); + } + } +} + function removeKeyFromJsonObject($jsonObject, $keyToRemove) { if(!is_string($jsonObject)){ $jsonObject = json_encode($jsonObject); @@ -1281,16 +1292,6 @@ function removeKeyFromJsonObject($jsonObject, $keyToRemove) { // Decode the JSON object into an associative array $array = json_decode($jsonObject, true); - // Recursive function to remove the key from the array - function removeKey(&$array, $keyToRemove) { - foreach ($array as $key => &$value) { - if ($key == $keyToRemove) { - unset($array[$key]); - } elseif (is_array($value)) { - removeKey($value, $keyToRemove); - } - } - } // Call the recursive function removeKey($array, $keyToRemove); From 81682b6e78b14378d715241bdafa636bd63a3b53 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 18 Apr 2024 13:46:37 -0300 Subject: [PATCH 174/416] Update --- objects/functions.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/objects/functions.php b/objects/functions.php index 0555ccec7..8a1a61100 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -655,6 +655,9 @@ function encryptPassword($password, $streamerURL) { function zipDirectory($destinationFile) { // Get real path for our folder $rootPath = realpath($destinationFile); + if(empty($rootPath)){ + error_log("zipDirectory: error on destination file: $destinationFile"); + } $zipPath = rtrim($destinationFile, "/") . ".zip"; // Initialize archive object $zip = new ZipArchive(); From 0e022c5c606c5eb3af98a0f72b05d004c6b27c3d Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 19 Apr 2024 16:22:41 -0300 Subject: [PATCH 175/416] https://github.com/WWBN/AVideo-Encoder/issues/531 --- objects/functions.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 8a1a61100..171ada218 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1262,6 +1262,11 @@ function checkZipArchiveAndVersion() { die("The ZipArchive class is not available in the web environment. You are currently using PHP version $phpVersion. Please install the PHP Zip extension for this version. On Ubuntu, you can do this by running: 'sudo apt install php" . $phpMajorMinorVersion . "-zip && sudo /etc/init.d/apache2 restart'"); } + // Check if shell_exec is disabled + if (in_array('shell_exec', array_map('trim', explode(',', ini_get('disable_functions'))))) { + die("Error: shell_exec() is disabled. Enable it to check for the Zip extension."); + } + // Check PHP CLI version and ZipArchive availability $cliVersionOutput = shell_exec('php -v'); preg_match('/^PHP\s+([0-9]+\.[0-9]+)/m', $cliVersionOutput, $matches); @@ -1271,8 +1276,12 @@ function checkZipArchiveAndVersion() { if (empty($cliZipCheckOutput)) { $cliZipCheckOutput = shell_exec('php -m | /bin/grep -i Zip'); if (empty($cliZipCheckOutput)) { - var_dump($cliZipCheckOutput); - die("The ZipArchive class is not available in the PHP CLI environment. The CLI is using PHP version $cliVersion. Please install the PHP Zip extension for this version. On Ubuntu, run: 'sudo apt install php" . $cliVersion . "-zip && sudo /etc/init.d/apache2 restart'"); + $phpModulesOutput = shell_exec('php -m'); + if (empty($phpModulesOutput)) { + die("Error: Unable to execute 'php -m'. Check if PHP CLI is configured correctly."); + } else { + die("The ZipArchive class is not available in the PHP CLI environment. Please install the PHP Zip extension."); + } } } } From fc411976a212cd80a15b24ad568f0c65eb620c6e Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 19 Apr 2024 22:21:29 -0300 Subject: [PATCH 176/416] https://github.com/WWBN/AVideo-Encoder/issues/531 --- objects/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 171ada218..d1726edb2 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1278,9 +1278,9 @@ function checkZipArchiveAndVersion() { if (empty($cliZipCheckOutput)) { $phpModulesOutput = shell_exec('php -m'); if (empty($phpModulesOutput)) { - die("Error: Unable to execute 'php -m'. Check if PHP CLI is configured correctly."); + error_log("Error: Unable to execute 'php -m'. Check if PHP CLI is configured correctly."); } else { - die("The ZipArchive class is not available in the PHP CLI environment. Please install the PHP Zip extension."); + error_log("The ZipArchive class is not available in the PHP CLI environment. Please install the PHP Zip extension."); } } } From 5888ce6b9a0552ba233232896e6bf5cfccfbae30 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 19 Apr 2024 22:21:49 -0300 Subject: [PATCH 177/416] https://github.com/WWBN/AVideo-Encoder/issues/531 --- objects/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index d1726edb2..171ada218 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1278,9 +1278,9 @@ function checkZipArchiveAndVersion() { if (empty($cliZipCheckOutput)) { $phpModulesOutput = shell_exec('php -m'); if (empty($phpModulesOutput)) { - error_log("Error: Unable to execute 'php -m'. Check if PHP CLI is configured correctly."); + die("Error: Unable to execute 'php -m'. Check if PHP CLI is configured correctly."); } else { - error_log("The ZipArchive class is not available in the PHP CLI environment. Please install the PHP Zip extension."); + die("The ZipArchive class is not available in the PHP CLI environment. Please install the PHP Zip extension."); } } } From 1c587d9141ea5a4a2df75e5646e904a76813dadc Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 19 Apr 2024 22:22:58 -0300 Subject: [PATCH 178/416] https://github.com/WWBN/AVideo-Encoder/issues/531 --- objects/functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 171ada218..d1726edb2 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1278,9 +1278,9 @@ function checkZipArchiveAndVersion() { if (empty($cliZipCheckOutput)) { $phpModulesOutput = shell_exec('php -m'); if (empty($phpModulesOutput)) { - die("Error: Unable to execute 'php -m'. Check if PHP CLI is configured correctly."); + error_log("Error: Unable to execute 'php -m'. Check if PHP CLI is configured correctly."); } else { - die("The ZipArchive class is not available in the PHP CLI environment. Please install the PHP Zip extension."); + error_log("The ZipArchive class is not available in the PHP CLI environment. Please install the PHP Zip extension."); } } } From 371283a57887278c4edd141260946dff627cf852 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 25 Apr 2024 13:30:05 -0300 Subject: [PATCH 179/416] Update --- objects/Encoder.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 01dc9bff5..10de3072b 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -1015,7 +1015,15 @@ public static function run($try = 0) $encoder->save(); $objFile = static::downloadFile($encoder->getId()); if ($objFile->error) { - if ($try <= $maxTries) { + $downloading = static::areDownloading(); + if(!empty($downloading)){ + $msg = "Encoder::run: There is something downloading now " . json_encode($objFile); + error_log($msg); + $encoder->setStatus(Encoder::$STATUS_QUEUE); + $encoder->setStatus_obs($msg); + $encoder->save(); + return false; + }else if ($try <= $maxTries) { $msg = "Encoder::run: Trying again: [$try] => Could not download the file " . json_encode($objFile); error_log($msg); $encoder->setStatus(Encoder::$STATUS_QUEUE); From 25251a3afb9e27f53df4675fa74db7eabf71ffe1 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 10:09:59 -0300 Subject: [PATCH 180/416] Update --- objects/Encoder.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 10de3072b..14d89a6b1 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -471,8 +471,7 @@ public static function downloadFile($queue_id) $obj->filename = $filename; $obj->pathFileName = $dstFilepath . $filename; - $downloading = static::areDownloading(); - if(!empty($downloading)){ + if(!self::canDownloadNow()){ error_log("downloadFile: there are a file downloading"); return $obj; } @@ -979,6 +978,17 @@ public function getNewVideosId(){ return self::sendToStreamer($target, $postFields, false, $this); } + static function canDownloadNow(){ + + $downloading = static::areDownloading(); + return empty($downloading); + } + + static function canEncodeNow(){ + $encoding = static::areEncoding(); + return count($encoding); + } + public static function run($try = 0) { global $global; @@ -1014,7 +1024,7 @@ public static function run($try = 0) $encoder->setStatus_obs("Start in " . date("Y-m-d H:i:s")); $encoder->save(); $objFile = static::downloadFile($encoder->getId()); - if ($objFile->error) { + if ($objFile->error && (!self::canEncodeNow() && !self::canDownloadNow())) { $downloading = static::areDownloading(); if(!empty($downloading)){ $msg = "Encoder::run: There is something downloading now " . json_encode($objFile); From 1573852cd2b97eb13252bab3266dad78cbb51a7b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 10:13:10 -0300 Subject: [PATCH 181/416] Update --- objects/Encoder.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 14d89a6b1..6af2ced49 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -986,7 +986,7 @@ static function canDownloadNow(){ static function canEncodeNow(){ $encoding = static::areEncoding(); - return count($encoding); + return empty($encoding); } public static function run($try = 0) @@ -1024,9 +1024,11 @@ public static function run($try = 0) $encoder->setStatus_obs("Start in " . date("Y-m-d H:i:s")); $encoder->save(); $objFile = static::downloadFile($encoder->getId()); - if ($objFile->error && (!self::canEncodeNow() && !self::canDownloadNow())) { - $downloading = static::areDownloading(); - if(!empty($downloading)){ + if ($objFile->error && !self::canEncodeNow() && !self::canDownloadNow()) { + if(!self::canEncodeNow()){ + $msg = "Encoder::run: There are something encoding now "; + } + if(!self::canDownloadNow()){ $msg = "Encoder::run: There is something downloading now " . json_encode($objFile); error_log($msg); $encoder->setStatus(Encoder::$STATUS_QUEUE); From 21971a773a435cad1535b0bbb05fe93500755f7f Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:31:48 -0300 Subject: [PATCH 182/416] Update --- objects/Encoder.php | 1 + view/listFiles.json.php | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/objects/Encoder.php b/objects/Encoder.php index 6af2ced49..f38015403 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -789,6 +789,7 @@ public static function getAllQueue() . "status = '" . Encoder::$STATUS_ERROR . "') "; $sql .= " ORDER BY priority ASC, e.id ASC "; + error_log($sql); /** * @var array $global * @var object $global['mysqli'] diff --git a/view/listFiles.json.php b/view/listFiles.json.php index 677af9ca8..a42258614 100644 --- a/view/listFiles.json.php +++ b/view/listFiles.json.php @@ -3,6 +3,10 @@ require_once $global['systemRootPath'] . 'objects/Login.php'; header('Content-Type: application/json'); +if(empty($global['allowed'])){ + $global['allowed'] = array(); +} + // Ensure extensions are in lowercase and unique $global['allowed'] = array_map('strtolower', $global['allowed']); $global['allowed'] = array_unique($global['allowed']); From af8c9e7783a34ac0842b71f5dfc5669071ce7e17 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:40:20 -0300 Subject: [PATCH 183/416] Update --- objects/Encoder.php | 2 +- objects/functions.php | 422 ++++++++++++++++++++++++++---------------- view/status.php | 2 +- 3 files changed, 267 insertions(+), 159 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index f38015403..f08d6c6bf 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -789,7 +789,7 @@ public static function getAllQueue() . "status = '" . Encoder::$STATUS_ERROR . "') "; $sql .= " ORDER BY priority ASC, e.id ASC "; - error_log($sql); + //error_log($sql); /** * @var array $global * @var object $global['mysqli'] diff --git a/objects/functions.php b/objects/functions.php index d1726edb2..6d15855a4 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -6,7 +6,8 @@ ], ]); -function local_get_contents($path) { +function local_get_contents($path) +{ if (function_exists('fopen')) { $myfile = fopen($path, "r") or die("Unable to open file!"); $text = fread($myfile, filesize($path)); @@ -16,7 +17,8 @@ function local_get_contents($path) { return @file_get_contents($path); } -function get_ffmpeg($ignoreGPU = false) { +function get_ffmpeg($ignoreGPU = false) +{ global $global; $complement = ''; $complement = ' -user_agent "' . getSelfUserAgent("FFMPEG") . '" '; @@ -35,11 +37,13 @@ function get_ffmpeg($ignoreGPU = false) { return $ffmpeg . $complement; } -function getFFmpegScaleToForceOriginalAspectRatio($width, $heigth) { +function getFFmpegScaleToForceOriginalAspectRatio($width, $heigth) +{ return "scale={$width}:{$heigth}:force_original_aspect_ratio=decrease,pad={$width}:{$heigth}:-1:-1:color=black"; } -function replaceFFMPEG($cmd) { +function replaceFFMPEG($cmd) +{ $cmd = removeUserAgentIfNotURL($cmd); if (preg_match('/-user_agent/', $cmd)) { return $cmd; @@ -47,14 +51,16 @@ function replaceFFMPEG($cmd) { return preg_replace('/^ffmpeg/i', get_ffmpeg(), $cmd); } -function removeUserAgentIfNotURL($cmd) { +function removeUserAgentIfNotURL($cmd) +{ if (!preg_match('/ -i +["\']?https?:/', $cmd)) { $cmd = preg_replace('/-user_agent "[^"]+"/', '', $cmd); } return $cmd; } -function get_ffprobe() { +function get_ffprobe() +{ global $global; //return 'ffmpeg -user_agent "'.getSelfUserAgent("FFMPEG").'" '; //return 'ffmpeg -headers "User-Agent: '.getSelfUserAgent("FFMPEG").'" '; @@ -68,7 +74,8 @@ function get_ffprobe() { return $ffmpeg; } -function getSelfUserAgent($complement = "") { +function getSelfUserAgent($complement = "") +{ global $global; $agent = 'AVideoEncoder '; $agent .= parse_url($global['webSiteRootURL'], PHP_URL_HOST); @@ -76,7 +83,8 @@ function getSelfUserAgent($complement = "") { return $agent; } -function url_get_contents($Url, $ctx = "", $timeout = 0) { +function url_get_contents($Url, $ctx = "", $timeout = 0) +{ global $global; $agent = getSelfUserAgent(); if (empty($ctx)) { @@ -135,7 +143,8 @@ function url_get_contents($Url, $ctx = "", $timeout = 0) { return remove_utf8_bom($content); } -function fetch_http_file_contents($url) { +function fetch_http_file_contents($url) +{ $hostname = parse_url($url, PHP_URL_HOST); if ($hostname == false) { @@ -169,7 +178,8 @@ function fetch_http_file_contents($url) { return $file_response; } -function file_get_intbound_contents($url, $bindto_addr_family) { +function file_get_intbound_contents($url, $bindto_addr_family) +{ $stream_context = stream_context_create([ 'socket' => ['bindto' => $bindto_addr_family], 'http' => ['timeout' => 20, 'method' => 'GET'] @@ -180,7 +190,8 @@ function file_get_intbound_contents($url, $bindto_addr_family) { // Returns a file size limit in bytes based on the PHP upload_max_filesize // and post_max_size -function file_upload_max_size() { +function file_upload_max_size() +{ static $max_size = -1; if ($max_size < 0) { @@ -197,7 +208,8 @@ function file_upload_max_size() { return $max_size; } -function parse_size($size) { +function parse_size($size) +{ $unit = preg_replace('/[^bkmgtpezy]/i', '', $size); // Remove the non-unit characters from the size. $size = preg_replace('/[^0-9\.]/', '', $size); // Remove the non-numeric characters from the size. if ($unit) { @@ -208,7 +220,8 @@ function parse_size($size) { } } -function humanFileSize($size, $unit = "") { +function humanFileSize($size, $unit = "") +{ if ((!$unit && $size >= 1 << 30) || $unit == "GB") { return number_format($size / (1 << 30), 2) . "GB"; } @@ -221,11 +234,13 @@ function humanFileSize($size, $unit = "") { return number_format($size) . " bytes"; } -function get_max_file_size() { +function get_max_file_size() +{ return humanFileSize(file_upload_max_size()); } -function humanTiming($time) { +function humanTiming($time) +{ $time = time() - $time; // to get the time since that moment $time = ($time < 1) ? 1 : $time; $tokens = array( @@ -247,7 +262,8 @@ function humanTiming($time) { } } -function checkVideosDir() { +function checkVideosDir() +{ $dir = "../videos"; if (file_exists($dir)) { if (is_writable($dir)) { @@ -260,15 +276,18 @@ function checkVideosDir() { } } -function isApache() { +function isApache() +{ return (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false); } -function isPHP($version = "'7.0.0'") { +function isPHP($version = "'7.0.0'") +{ return (version_compare(PHP_VERSION, $version) >= 0); } -function modRewriteEnabled() { +function modRewriteEnabled() +{ if (!function_exists('apache_get_modules')) { ob_start(); phpinfo(INFO_MODULES); @@ -279,23 +298,28 @@ function modRewriteEnabled() { return in_array('mod_rewrite', apache_get_modules()); } -function isFFMPEG() { +function isFFMPEG() +{ return trim(shell_exec('which ffmpeg')); } -function isYoutubeDL() { +function isYoutubeDL() +{ return trim(shell_exec('which youtube-dl')); } -function isExifToo() { +function isExifToo() +{ return trim(shell_exec('which exiftool')); } -function getPathToApplication() { +function getPathToApplication() +{ return str_replace("install/index.php", "", $_SERVER["SCRIPT_FILENAME"]); } -function getURLToApplication() { +function getURLToApplication() +{ $url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $url = explode("install/index.php", $url); $url = $url[0]; @@ -303,45 +327,52 @@ function getURLToApplication() { } //max_execution_time = 7200 -function check_max_execution_time() { +function check_max_execution_time() +{ $max_size = ini_get('max_execution_time'); $recomended_size = 7200; return !($recomended_size > $max_size); } //post_max_size = 100M -function check_post_max_size() { +function check_post_max_size() +{ $max_size = parse_size(ini_get('post_max_size')); $recomended_size = parse_size('100M'); return !($recomended_size > $max_size); } //upload_max_filesize = 100M -function check_upload_max_filesize() { +function check_upload_max_filesize() +{ $max_size = parse_size(ini_get('upload_max_filesize')); $recomended_size = parse_size('100M'); return !($recomended_size > $max_size); } //memory_limit = 100M -function check_memory_limit() { +function check_memory_limit() +{ $max_size = parse_size(ini_get('memory_limit')); $recomended_size = parse_size('512M'); return !($recomended_size > $max_size); } -function check_mysqlnd() { +function check_mysqlnd() +{ return function_exists('mysqli_fetch_all'); } -function base64DataToImage($imgBase64) { +function base64DataToImage($imgBase64) +{ $img = $imgBase64; $img = str_replace('data:image/png;base64,', '', $img); $img = str_replace(' ', '+', $img); return base64_decode($img); } -function getRealIpAddr() { +function getRealIpAddr() +{ if (!empty($_SERVER['HTTP_CLIENT_IP'])) { //check ip from share internet $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { //to check ip is pass from proxy @@ -352,7 +383,8 @@ function getRealIpAddr() { return $ip; } -function cleanString($text) { +function cleanString($text) +{ $utf8 = array( '/[áàâãªäą]/u' => 'a', '/[ÁÀÂÃÄĄ]/u' => 'A', @@ -387,7 +419,8 @@ function cleanString($text) { * if is set $_GET['ignoreCommandLineInterface'] will return false * @return boolean */ -function isCommandLineInterface() { +function isCommandLineInterface() +{ return (empty($_GET['ignoreCommandLineInterface']) && php_sapi_name() === 'cli'); } @@ -397,17 +430,18 @@ function isCommandLineInterface() { * @param array $statusarray associative array with type/message pairs * @return string */ -function status($statusarray) { +function status($statusarray) +{ if (isCommandLineInterface()) { foreach ($statusarray as $status => $message) { echo $status . ":" . $message . "\n"; } } else { echo json_encode(array_map( - function ($text) { - return nl2br($text); - }, - $statusarray + function ($text) { + return nl2br($text); + }, + $statusarray )); } } @@ -417,12 +451,14 @@ function ($text) { * * @param array $statusarray associative array with type/message pairs */ -function croak($statusarray) { +function croak($statusarray) +{ status($statusarray); die; } -function parseDurationToSeconds($str) { +function parseDurationToSeconds($str) +{ $durationParts = explode(":", $str); if (empty($durationParts[1])) { return 0; @@ -431,7 +467,8 @@ function parseDurationToSeconds($str) { return intval($durationParts[2]) + ($minutes * 60); } -function secondsToVideoTime($seconds) { +function secondsToVideoTime($seconds) +{ if (!is_numeric($seconds)) { return $seconds; } @@ -442,29 +479,35 @@ function secondsToVideoTime($seconds) { return sprintf('%02d:%02d:%02d', $hours, $mins, $secs); } -function parseSecondsToDuration($seconds) { +function parseSecondsToDuration($seconds) +{ return secondsToVideoTime($seconds); } -function decideFromPlugin() { +function decideFromPlugin() +{ $advancedCustom = getAdvancedCustomizedObjectData(); if (!empty($advancedCustom->showOnlyEncoderAutomaticResolutions)) { return array("mp4" => 7, "webm" => 8); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD) + ) { return array("mp4" => 80, "webm" => 87); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionSD) + ) { return array("mp4" => 77, "webm" => 84); } if ( - empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionLow) && empty($advancedCustom->doNotShowEncoderResolutionHD) + ) { return array("mp4" => 79, "webm" => 86); } if ( - empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD)) { + empty($advancedCustom->doNotShowEncoderResolutionSD) && empty($advancedCustom->doNotShowEncoderResolutionHD) + ) { return array("mp4" => 78, "webm" => 85); } if (empty($advancedCustom->doNotShowEncoderResolutionLow)) { @@ -483,7 +526,8 @@ function decideFromPlugin() { * Return the formats table column order * @return int */ -function decideFormatOrder() { +function decideFormatOrder() +{ global $global; if (!empty($_GET['webm']) && empty($_POST['webm'])) { $_POST['webm'] = $_GET['webm']; @@ -511,42 +555,42 @@ function decideFormatOrder() { } elseif (empty($_POST['webm']) || $_POST['webm'] === 'false') { // mp4 only if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { // all resolutions error_log("decideFormatOrder: MP4 All"); return (80); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 Low - HD"); return (79); } elseif ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 SD - HD"); return (78); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { error_log("decideFormatOrder: MP4 Low SD"); return (77); } elseif ( - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { error_log("decideFormatOrder: MP4 HD"); return (76); } elseif ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { error_log("decideFormatOrder: MP4 SD"); return (75); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' ) { error_log("decideFormatOrder: MP4 LOW"); return (74); @@ -557,36 +601,36 @@ function decideFormatOrder() { } else { // mp4 and webm if ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { // all resolutions return (87); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (86); } elseif ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' && + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (85); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' && + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { return (84); } elseif ( - !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' + !empty($_POST['inputHD']) && $_POST['inputHD'] !== 'false' ) { return (83); } elseif ( - !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' + !empty($_POST['inputSD']) && $_POST['inputSD'] !== 'false' ) { return (82); } elseif ( - !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' + !empty($_POST['inputLow']) && $_POST['inputLow'] !== 'false' ) { return (81); } else { @@ -597,7 +641,8 @@ function decideFormatOrder() { return 1; } -function getUpdatesFiles() { +function getUpdatesFiles() +{ global $config, $global; $files1 = scandir($global['systemRootPath'] . "update"); $updateFiles = []; @@ -612,7 +657,8 @@ function getUpdatesFiles() { return $updateFiles; } -function ip_is_private($ip) { +function ip_is_private($ip) +{ $pri_addrs = array( '10.0.0.0|10.255.255.255', // single class A network '172.16.0.0|172.31.255.255', // 16 contiguous class B network @@ -643,7 +689,8 @@ function ip_is_private($ip) { * @param String $streamerURL * @return String */ -function encryptPassword($password, $streamerURL) { +function encryptPassword($password, $streamerURL) +{ $url = "{$streamerURL}objects/encryptPass.json.php?pass=" . urlencode($password); $streamerEncrypt = json_decode(url_get_contents($url)); if (empty($streamerEncrypt) || empty($streamerEncrypt->encryptedPassword)) { @@ -652,10 +699,11 @@ function encryptPassword($password, $streamerURL) { return $streamerEncrypt->encryptedPassword; } -function zipDirectory($destinationFile) { +function zipDirectory($destinationFile) +{ // Get real path for our folder $rootPath = realpath($destinationFile); - if(empty($rootPath)){ + if (empty($rootPath)) { error_log("zipDirectory: error on destination file: $destinationFile"); } $zipPath = rtrim($destinationFile, "/") . ".zip"; @@ -670,8 +718,8 @@ function zipDirectory($destinationFile) { // Create recursive directory iterator /** @var SplFileInfo[] $files */ $files = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator($rootPath), - RecursiveIteratorIterator::LEAVES_ONLY + new RecursiveDirectoryIterator($rootPath), + RecursiveIteratorIterator::LEAVES_ONLY ); $countFiles = 0; $countFilesAdded = 0; @@ -681,7 +729,7 @@ function zipDirectory($destinationFile) { // Ensure the file is readable if (!$file->isDir() && is_readable($filePath)) { $relativePath = substr($filePath, strlen($rootPath) + 1); - + // Attempt to add the file to the archive if (!$zip->addFile($filePath, $relativePath)) { error_log("Failed to add file: $filePath"); @@ -696,7 +744,7 @@ function zipDirectory($destinationFile) { //error_log("Skipping directory or unreadable file: $filePath"); } } - + error_log("zipDirectory($destinationFile) added {$countFilesAdded} files of a total={$countFiles}"); // Zip archive will be created only after closing object @@ -704,7 +752,8 @@ function zipDirectory($destinationFile) { return $zipPath; } -function directorysize($dir) { +function directorysize($dir) +{ $command = "du -sb {$dir}"; exec($command . " 2>&1", $output, $return_val); @@ -731,7 +780,8 @@ function directorysize($dir) { * @param string $directory * @return integer */ -function dirSize($directory) { +function dirSize($directory) +{ $size = 0; foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file) { $size += $file->getSize(); @@ -739,7 +789,8 @@ function dirSize($directory) { return $size; } -function make_path($path) { +function make_path($path) +{ $created = false; if (substr($path, -1) !== DIRECTORY_SEPARATOR) { $path = pathinfo($path, PATHINFO_DIRNAME); @@ -757,7 +808,8 @@ function make_path($path) { * @global type $global * @param type $advancedCustom */ -function fixAdvancedCustom(&$advancedCustom) { +function fixAdvancedCustom(&$advancedCustom) +{ global $global; foreach ($global as $key => $value) { if (isset($advancedCustom->$key)) { @@ -766,7 +818,8 @@ function fixAdvancedCustom(&$advancedCustom) { } } -function json_error() { +function json_error() +{ switch (json_last_error()) { case JSON_ERROR_NONE: return ' - No errors'; @@ -792,7 +845,8 @@ function json_error() { } } -function rrmdir($dir) { +function rrmdir($dir) +{ if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { @@ -808,7 +862,8 @@ function rrmdir($dir) { } } -function xss_esc($text) { +function xss_esc($text) +{ if (empty($text)) { return ""; } @@ -819,13 +874,15 @@ function xss_esc($text) { return $result; } -function xss_esc_back($text) { +function xss_esc_back($text) +{ $text = htmlspecialchars_decode($text, ENT_QUOTES); $text = str_replace(array('&', ''', "#039;"), array(" ", "`", "`"), $text); return $text; } -function remove_utf8_bom($text) { +function remove_utf8_bom($text) +{ if (empty($text)) { return ""; } @@ -837,12 +894,14 @@ function remove_utf8_bom($text) { return $text; } -function getSessionMD5() { +function getSessionMD5() +{ global $global; return md5($global['webSiteRootURL'] . $global['systemRootPath']); } -function getSessionId() { +function getSessionId() +{ global $global; $obj = new stdClass(); $obj->md5 = getSessionMD5(); @@ -850,7 +909,8 @@ function getSessionId() { return base64_encode(json_encode($obj)); } -function validateSessionId($PHPSESSID) { +function validateSessionId($PHPSESSID) +{ $json = base64_decode($PHPSESSID); $obj = json_decode($json); if (is_object($obj) && $obj->md5 == getSessionMD5()) { @@ -859,14 +919,16 @@ function validateSessionId($PHPSESSID) { return false; } -function recreateSessionIdIfNotValid() { +function recreateSessionIdIfNotValid() +{ $PHPSESSID = session_id(); if (!validateSessionId($PHPSESSID)) { session_id(getSessionId()); } } -function _session_id($PHPSESSID) { +function _session_id($PHPSESSID) +{ if (validateSessionId($PHPSESSID)) { session_id($PHPSESSID); } else { @@ -874,7 +936,8 @@ function _session_id($PHPSESSID) { } } -function _session_start(array $options = array()) { +function _session_start(array $options = array()) +{ global $global; try { if (session_status() == PHP_SESSION_NONE) { @@ -895,7 +958,8 @@ function _session_start(array $options = array()) { } } -function getFileInfo($file) { +function getFileInfo($file) +{ if (empty($file) || !file_exists($file)) { return false; } @@ -922,7 +986,8 @@ function getFileInfo($file) { return $obj; } -function getPHPSessionIDURL() { +function getPHPSessionIDURL() +{ if (!empty($_GET['PHPSESSID'])) { $p = $_GET['PHPSESSID']; } else { @@ -931,14 +996,16 @@ function getPHPSessionIDURL() { return "PHPSESSID={$p}"; } -function isSameDomain($url1, $url2) { +function isSameDomain($url1, $url2) +{ if (empty($url1) || empty($url2)) { return false; } return (get_domain($url1) === get_domain($url2)); } -function get_domain($url) { +function get_domain($url) +{ $pieces = parse_url($url); $domain = isset($pieces['host']) ? $pieces['host'] : ''; if (empty($domain)) { @@ -955,14 +1022,16 @@ function get_domain($url) { return false; } -function isPIDRunning($pid) { +function isPIDRunning($pid) +{ if ($pid < 1) { return false; } return file_exists("/proc/$pid"); } -function execAsync($command) { +function execAsync($command) +{ global $global; // If windows, else $log = strpos($command, 'run.php') === false; @@ -973,11 +1042,11 @@ function execAsync($command) { error_log('execAsync: ' . json_encode($output) . ' ' . $retval); } else { $newCmd = "nohup " . $command . " > /dev/null 2>&1 & echo $!;"; - if($log){ + if ($log) { error_log('execAsync start: ' . $newCmd); } $pid = shell_exec($newCmd); - if($log){ + if ($log) { error_log('execAsync end : ' . $pid); } } @@ -985,14 +1054,16 @@ function execAsync($command) { } -function execRun() { +function execRun() +{ global $global; $php = getPHP() . " -f"; $cmd = "{$php} {$global['systemRootPath']}view/run.php"; return execAsync($cmd); } -function getPHP() { +function getPHP() +{ global $global; if (!empty($global['php'])) { $php = $global['php']; @@ -1010,7 +1081,8 @@ function getPHP() { //function __($msg) { // return $msg; //} -function __($msg, $allowHTML = false) { +function __($msg, $allowHTML = false) +{ global $t; if (empty($t[$msg])) { if ($allowHTML) { @@ -1025,7 +1097,8 @@ function __($msg, $allowHTML = false) { } } -function getAdvancedCustomizedObjectData() { +function getAdvancedCustomizedObjectData() +{ global $advancedCustom; if (empty($advancedCustom)) { $json_file = url_get_contents(Login::getStreamerURL() . "plugin/CustomizeAdvanced/advancedCustom.json.php"); @@ -1036,15 +1109,18 @@ function getAdvancedCustomizedObjectData() { return $advancedCustom; } -function hasLastSlash($word) { +function hasLastSlash($word) +{ return substr($word, -1) === '/'; } -function addLastSlash($word) { +function addLastSlash($word) +{ return $word . (hasLastSlash($word) ? "" : "/"); } -function isURL200($url) { +function isURL200($url) +{ global $_isURL200; //error_log("isURL200 checking URL {$url}"); @@ -1056,9 +1132,9 @@ function isURL200($url) { $result = false; foreach ($headers as $value) { if ( - strpos($value, '200') || - strpos($value, '302') || - strpos($value, '304') + strpos($value, '200') || + strpos($value, '302') || + strpos($value, '304') ) { $result = true; } @@ -1067,17 +1143,20 @@ function isURL200($url) { return $result; } -function isWindows() { +function isWindows() +{ return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; } -function getCSSAnimation($type = 'animate__flipInX', $loaderSequenceName = 'default', $delay = 0.1) { +function getCSSAnimation($type = 'animate__flipInX', $loaderSequenceName = 'default', $delay = 0.1) +{ global $_getCSSAnimationClassDelay; getCSSAnimationClassAndStyleAddWait($delay, $loaderSequenceName); return ['class' => 'animate__animated ' . $type, 'style' => "-webkit-animation-delay: {$_getCSSAnimationClassDelay[$loaderSequenceName]}s; animation-delay: {$_getCSSAnimationClassDelay[$loaderSequenceName]}s;"]; } -function getCSSAnimationClassAndStyleAddWait($delay, $loaderSequenceName = 'default') { +function getCSSAnimationClassAndStyleAddWait($delay, $loaderSequenceName = 'default') +{ global $_getCSSAnimationClassDelay; if (!isset($_getCSSAnimationClassDelay)) { $_getCSSAnimationClassDelay = []; @@ -1088,12 +1167,14 @@ function getCSSAnimationClassAndStyleAddWait($delay, $loaderSequenceName = 'defa $_getCSSAnimationClassDelay[$loaderSequenceName] += $delay; } -function getCSSAnimationClassAndStyle($type = 'animate__flipInX', $loaderSequenceName = 'default', $delay = 0.1) { +function getCSSAnimationClassAndStyle($type = 'animate__flipInX', $loaderSequenceName = 'default', $delay = 0.1) +{ $array = getCSSAnimation($type, $loaderSequenceName, $delay); return "{$array['class']}\" style=\"{$array['style']}"; } -function addPrefixIntoQuery($query, $tablesPrefix) { +function addPrefixIntoQuery($query, $tablesPrefix) +{ if (!empty($tablesPrefix)) { $search = array( 'IF NOT EXISTS `', @@ -1119,7 +1200,8 @@ function addPrefixIntoQuery($query, $tablesPrefix) { return $query; } -function isURLaVODVideo($url) { +function isURLaVODVideo($url) +{ $parts = explode('?', $url); if (preg_match('/m3u8?$/i', $parts[0])) { $content = @file_get_contents($url); @@ -1128,9 +1210,11 @@ function isURLaVODVideo($url) { } // If the main playlist has an ENDLIST tag, it's a VOD - if (preg_match('/#EXT-X-ENDLIST/i', $content) || - preg_match('/#EXT-X-PLAYLIST-TYPE:\s*VOD/i', $content) || - preg_match('/URI=".+enc_[0-9a-z]+.key/i', $content)) { + if ( + preg_match('/#EXT-X-ENDLIST/i', $content) || + preg_match('/#EXT-X-PLAYLIST-TYPE:\s*VOD/i', $content) || + preg_match('/URI=".+enc_[0-9a-z]+.key/i', $content) + ) { return true; // VOD content } @@ -1154,7 +1238,8 @@ function isURLaVODVideo($url) { return true; } -function _utf8_encode($string) { +function _utf8_encode($string) +{ global $global; if (empty($global['doNotUTF8Encode'])) { @@ -1163,8 +1248,9 @@ function _utf8_encode($string) { return $string; } -function _rename($originalFile, $newName) { - if(!empty($originalFile) && !empty($newName)){ +function _rename($originalFile, $newName) +{ + if (!empty($originalFile) && !empty($newName)) { // Attempt to rename the file if (@rename($originalFile, $newName)) { return true; @@ -1179,7 +1265,8 @@ function _rename($originalFile, $newName) { return false; } -function _sys_get_temp_dir() { +function _sys_get_temp_dir() +{ global $global, $_sys_get_temp_dir; if (isset($_sys_get_temp_dir)) { return $_sys_get_temp_dir; @@ -1197,11 +1284,13 @@ function _sys_get_temp_dir() { return $dir; } -function _get_temp_file($prefix = '') { +function _get_temp_file($prefix = '') +{ return tempnam(_sys_get_temp_dir(), $prefix); } -function convertDates() { +function convertDates() +{ if (empty($_REQUEST['timezone'])) { return false; } @@ -1220,7 +1309,8 @@ function convertDates() { } } -function convertToServerDate($originalDateTime, $fromTimezone) { +function convertToServerDate($originalDateTime, $fromTimezone) +{ $serverTimezone = date_default_timezone_get(); $dateTime = new DateTime($originalDateTime, new DateTimeZone($fromTimezone)); @@ -1231,8 +1321,9 @@ function convertToServerDate($originalDateTime, $fromTimezone) { return $dateTime->format('Y-m-d H:i:s'); } -function getCategoriesSelect($id) { - ?> +function getCategoriesSelect($id) +{ +?> + + ?> - - &$value) { - if ($key == $keyToRemove) { - unset($array[$key]); - } elseif (is_array($value)) { - removeKey($value, $keyToRemove); +// Recursive function to remove the key from mixed data types +function removeKey(&$data, $keyToRemove) { + if (is_array($data)) { + foreach ($data as $key => &$value) { + if ($key == $keyToRemove) { + unset($data[$key]); + } else { + removeKey($value, $keyToRemove); + } + } + } elseif (is_object($data)) { + foreach ($data as $key => &$value) { + if ($key == $keyToRemove) { + unset($data->$key); + } else { + removeKey($value, $keyToRemove); + } } } } -function removeKeyFromJsonObject($jsonObject, $keyToRemove) { - if(!is_string($jsonObject)){ - $jsonObject = json_encode($jsonObject); +function removeKeyFromData($data, $keyToRemove) { + // Check the type of the input and handle it appropriately + $wasJson = is_string($data); + $wasObject = is_object($data); + + if ($wasJson) { + $data = json_decode($data, false); // Decode into stdObject to preserve object nature if necessary + } + + // Recursively remove the key + removeKey($data, $keyToRemove); + + // Return data in the same format it was provided + if ($wasJson) { + return json_encode($data); } - // Decode the JSON object into an associative array - $array = json_decode($jsonObject, true); - - - // Call the recursive function - removeKey($array, $keyToRemove); - // Encode the modified array back into JSON - return json_encode($array); + return $data; } + diff --git a/view/status.php b/view/status.php index d77157bec..99f5352fc 100644 --- a/view/status.php +++ b/view/status.php @@ -85,7 +85,7 @@ ); foreach ($remove as $value) { - $obj = removeKeyFromJsonObject($obj, $value); + $obj = removeKeyFromData($obj, $value); } //$resp = json_encode($obj); From 151d75a011163d4efcc58b5123131b4442043730 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:41:35 -0300 Subject: [PATCH 184/416] Update --- view/status.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/view/status.php b/view/status.php index 99f5352fc..ea98d959d 100644 --- a/view/status.php +++ b/view/status.php @@ -88,5 +88,10 @@ $obj = removeKeyFromData($obj, $value); } + +if(!is_string($obj)){ + $obj = json_encode($obj); +} + //$resp = json_encode($obj); echo $obj; From 7ca6031d4fcc39290e8f98248fe6f5fc75b9bb9f Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:43:42 -0300 Subject: [PATCH 185/416] Update --- objects/functions.php | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 6d15855a4..25052a44c 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1401,20 +1401,16 @@ function removeKey(&$data, $keyToRemove) { function removeKeyFromData($data, $keyToRemove) { // Check the type of the input and handle it appropriately - $wasJson = is_string($data); - $wasObject = is_object($data); - - if ($wasJson) { - $data = json_decode($data, false); // Decode into stdObject to preserve object nature if necessary + if (is_string($data)) { + $data = json_decode($data, true); // Decode into stdObject to preserve object nature if necessary + } + if (!is_array($data)) { + $data = json_encode($data); + $data = json_decode($data, true); } // Recursively remove the key removeKey($data, $keyToRemove); - - // Return data in the same format it was provided - if ($wasJson) { - return json_encode($data); - } return $data; } From 601ad7c0b05cedaa6026a369d1aa3bd8dad31ea9 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:48:34 -0300 Subject: [PATCH 186/416] Update --- view/status.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/view/status.php b/view/status.php index ea98d959d..53d5f9660 100644 --- a/view/status.php +++ b/view/status.php @@ -73,6 +73,9 @@ $obj->file_upload_max_size = get_max_file_size(); } +$obj->raw = $obj; + + $remove = array( 'return_vars', 'filename', From f6599cb704b40a0f869eb17459e2dfe4958edaae Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:50:11 -0300 Subject: [PATCH 187/416] Update --- view/status.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/view/status.php b/view/status.php index 53d5f9660..5923f0b52 100644 --- a/view/status.php +++ b/view/status.php @@ -73,7 +73,7 @@ $obj->file_upload_max_size = get_max_file_size(); } -$obj->raw = $obj; +$raw = $obj->queue_list; $remove = array( @@ -92,6 +92,7 @@ } +$obj->raw = $raw; if(!is_string($obj)){ $obj = json_encode($obj); } From 9bef3aa733db4cf71246b1e7dc9b2d2607aeea67 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:50:54 -0300 Subject: [PATCH 188/416] Update --- view/status.php | 1 + 1 file changed, 1 insertion(+) diff --git a/view/status.php b/view/status.php index 5923f0b52..f6a2f0c33 100644 --- a/view/status.php +++ b/view/status.php @@ -93,6 +93,7 @@ $obj->raw = $raw; +$obj->test = 1; if(!is_string($obj)){ $obj = json_encode($obj); } From d3f00a2b0871b0eed34461f471a6d7c315ef404b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:53:28 -0300 Subject: [PATCH 189/416] Update --- view/status.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/view/status.php b/view/status.php index f6a2f0c33..b7cceb25d 100644 --- a/view/status.php +++ b/view/status.php @@ -88,12 +88,13 @@ ); foreach ($remove as $value) { - $obj = removeKeyFromData($obj, $value); + //$obj = removeKeyFromData($obj, $value); } $obj->raw = $raw; $obj->test = 1; + if(!is_string($obj)){ $obj = json_encode($obj); } From 678217115b84fda2bbe6ac25ec77898973ebae59 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:58:02 -0300 Subject: [PATCH 190/416] Update --- objects/functions.php | 30 ++++++++---------------------- view/status.php | 9 +-------- 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 25052a44c..dcaf2e1c3 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1378,40 +1378,26 @@ function checkZipArchiveAndVersion() } } -// Recursive function to remove the key from mixed data types -function removeKey(&$data, $keyToRemove) { + +function removeKeyFromData($data, $keyToRemove) +{ if (is_array($data)) { - foreach ($data as $key => &$value) { + foreach ($data as $key => $value) { if ($key == $keyToRemove) { unset($data[$key]); } else { - removeKey($value, $keyToRemove); + $data[$key] = removeKeyFromData($value, $keyToRemove); } } - } elseif (is_object($data)) { - foreach ($data as $key => &$value) { + } else if (is_object($data)) { + foreach ($data as $key => $value) { if ($key == $keyToRemove) { unset($data->$key); } else { - removeKey($value, $keyToRemove); + $data->$key = removeKeyFromData($value, $keyToRemove); } } } -} -function removeKeyFromData($data, $keyToRemove) { - // Check the type of the input and handle it appropriately - if (is_string($data)) { - $data = json_decode($data, true); // Decode into stdObject to preserve object nature if necessary - } - if (!is_array($data)) { - $data = json_encode($data); - $data = json_decode($data, true); - } - - // Recursively remove the key - removeKey($data, $keyToRemove); - return $data; } - diff --git a/view/status.php b/view/status.php index b7cceb25d..5c9bd7d84 100644 --- a/view/status.php +++ b/view/status.php @@ -73,9 +73,6 @@ $obj->file_upload_max_size = get_max_file_size(); } -$raw = $obj->queue_list; - - $remove = array( 'return_vars', 'filename', @@ -88,13 +85,9 @@ ); foreach ($remove as $value) { - //$obj = removeKeyFromData($obj, $value); + $obj = removeKeyFromData($obj, $value); } - -$obj->raw = $raw; -$obj->test = 1; - if(!is_string($obj)){ $obj = json_encode($obj); } From 2ca676989c4f1f6ea970a3c6881366c9e9159638 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 12:59:34 -0300 Subject: [PATCH 191/416] Update --- view/status.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view/status.php b/view/status.php index 5c9bd7d84..59c619522 100644 --- a/view/status.php +++ b/view/status.php @@ -85,7 +85,7 @@ ); foreach ($remove as $value) { - $obj = removeKeyFromData($obj, $value); + //$obj = removeKeyFromData($obj, $value); } if(!is_string($obj)){ From f27ac6554aa9afbd0e0e86dade893453afe4461d Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 13:01:03 -0300 Subject: [PATCH 192/416] Update --- view/status.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view/status.php b/view/status.php index 59c619522..5c9bd7d84 100644 --- a/view/status.php +++ b/view/status.php @@ -85,7 +85,7 @@ ); foreach ($remove as $value) { - //$obj = removeKeyFromData($obj, $value); + $obj = removeKeyFromData($obj, $value); } if(!is_string($obj)){ From e35da27a2f3d9006c76ac4dcf91b268eaaceab9c Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 13:04:39 -0300 Subject: [PATCH 193/416] Update --- objects/functions.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/objects/functions.php b/objects/functions.php index dcaf2e1c3..2b53f963b 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1384,7 +1384,9 @@ function removeKeyFromData($data, $keyToRemove) if (is_array($data)) { foreach ($data as $key => $value) { if ($key == $keyToRemove) { + unset($data[$key]); + $data[$key] = "array Removed because of $keyToRemove"; } else { $data[$key] = removeKeyFromData($value, $keyToRemove); } @@ -1393,6 +1395,7 @@ function removeKeyFromData($data, $keyToRemove) foreach ($data as $key => $value) { if ($key == $keyToRemove) { unset($data->$key); + $data->$key = "object Removed because of $keyToRemove "; } else { $data->$key = removeKeyFromData($value, $keyToRemove); } From 025adf7db023e558ba2721ad3182d9b581201c79 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 13:06:48 -0300 Subject: [PATCH 194/416] Update --- objects/functions.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 2b53f963b..93d95872a 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1383,17 +1383,17 @@ function removeKeyFromData($data, $keyToRemove) { if (is_array($data)) { foreach ($data as $key => $value) { - if ($key == $keyToRemove) { + if ($key === $keyToRemove) { unset($data[$key]); - $data[$key] = "array Removed because of $keyToRemove"; + $data[$key] = "array Removed because of $key == $keyToRemove ".json_encode(($key === $keyToRemove)); } else { $data[$key] = removeKeyFromData($value, $keyToRemove); } } } else if (is_object($data)) { foreach ($data as $key => $value) { - if ($key == $keyToRemove) { + if ($key === $keyToRemove) { unset($data->$key); $data->$key = "object Removed because of $keyToRemove "; } else { From 76a8477af05af553432295fd6bc5a0e7b94e2706 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 5 May 2024 13:08:13 -0300 Subject: [PATCH 195/416] Update --- objects/functions.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 93d95872a..f72275e2b 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1384,9 +1384,8 @@ function removeKeyFromData($data, $keyToRemove) if (is_array($data)) { foreach ($data as $key => $value) { if ($key === $keyToRemove) { - unset($data[$key]); - $data[$key] = "array Removed because of $key == $keyToRemove ".json_encode(($key === $keyToRemove)); + //$data[$key] = "array Removed"; } else { $data[$key] = removeKeyFromData($value, $keyToRemove); } @@ -1395,7 +1394,7 @@ function removeKeyFromData($data, $keyToRemove) foreach ($data as $key => $value) { if ($key === $keyToRemove) { unset($data->$key); - $data->$key = "object Removed because of $keyToRemove "; + //$data->$key = "object Removed"; } else { $data->$key = removeKeyFromData($value, $keyToRemove); } From fee3dad621715d917d1c95861fac6ca04bb54c05 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 15 May 2024 11:03:24 -0300 Subject: [PATCH 196/416] Add an option to videoEditorEnabledByDefault --- view/jquery-file-upload/form.php | 17 ++++++++++++++--- view/jquery-file-upload/js/main.js | 2 +- view/js/main.js | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/view/jquery-file-upload/form.php b/view/jquery-file-upload/form.php index c897e0a4e..316f39b08 100644 --- a/view/jquery-file-upload/form.php +++ b/view/jquery-file-upload/form.php @@ -63,10 +63,21 @@ + + + +
    + + +
    +
    + +
    +
    + + + + + + + + + + + + + + + +
    +
    +
    + +
    + + + + + \ No newline at end of file diff --git a/view/index_signin.revalidate.json.php b/view/index_signin.revalidate.json.php new file mode 100644 index 000000000..fb0748474 --- /dev/null +++ b/view/index_signin.revalidate.json.php @@ -0,0 +1,22 @@ +getJson(); + +if(empty($jsonString)){ + $json = array(); +}else{ + $json = json_decode($jsonString, true); +} + +$json[$_REQUEST['provider']] = $_REQUEST; + +if(!empty($json[$_REQUEST['provider']]['json']) && is_string($json[$_REQUEST['provider']]['json'])){ + $json[$_REQUEST['provider']]['json'] = json_decode($json[$_REQUEST['provider']]['json']); +} + +$s->setJson($json); + +$saved = $s->save(); + +$response = array( + 'error' => empty($saved), + 'saved' => $saved, + 'msg' => '', + 'json'=>$json +); + +echo json_encode($response); +?> \ No newline at end of file From 7aa813202af010c9b0051fdb25c21a28cf16dd27 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:19:58 -0300 Subject: [PATCH 265/416] Update --- objects/Encoder.php | 70 +++++++++++++++++++++++++++++++------------- objects/Streamer.php | 15 ++++++++-- 2 files changed, 63 insertions(+), 22 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 2ab79da3d..e723e3a6f 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -589,13 +589,13 @@ private static function setDownloaded($queue_id, $filePath) return $encoder->save(); } - public static function getYoutubeDl($videoURL, $queue_id, $destinationFile) + public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $addOauthFromProvider = '') { global $global; $videoURL = escapeshellarg($videoURL); $tmpfname = _get_temp_file('youtubeDl'); //$cmd = "youtube-dl -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; $progressFile = "{$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt"; _error_log("getYoutubeDl: Getting from Youtube DL {$cmd} progressFile={$progressFile} " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); @@ -603,11 +603,15 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile) exec($cmd . " 1> {$progressFile} 2>&1", $output, $return_val); _error_log("getYoutubeDl: Getting from Youtube DL {$cmd} done {$progressFile} "); if ($return_val !== 0) { + + if(empty($addOauthFromProvider) && self::hasSigninError($output)){ + return self::getDescriptionFromLink($videoURL, $queue_id, $destinationFile, 'youtube'); + } //echo "\n**ERROR Youtube DL **".$code . "\n" . print_r($output, true); $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); @@ -616,7 +620,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile) $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); @@ -625,7 +629,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile) $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --force-ipv4 --no-playlist -k -o '{$tmpfname}.%(ext)s' {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --force-ipv4 --no-playlist -k -o '{$tmpfname}.%(ext)s' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); @@ -2547,7 +2551,16 @@ public static function getReverseVideosJsonListFromLink($link) } } - public static function getTitleFromLink($link) + static function hasSigninError($output){ + foreach ($output as $value) { + if(preg_match('/Sign in to confirm/i', $value)){ + return true; + } + } + return false; + } + + public static function getTitleFromLink($link, $addOauthFromProvider = '') { $prepend = ''; if (!isWindows()) { @@ -2555,10 +2568,13 @@ public static function getTitleFromLink($link) } $link = escapeshellarg($link); $response = array('error' => true, 'output' => array()); - $cmd = $prepend . self::getYouTubeDLCommand() . " --no-check-certificate --no-playlist --force-ipv4 --skip-download -e {$link}"; + $cmd = $prepend . self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --no-playlist --force-ipv4 --skip-download -e {$link}"; exec($cmd . " 2>&1", $output, $return_val); if ($return_val !== 0) { _error_log("getTitleFromLink: Get Title Error: $cmd \n" . print_r($output, true)); + if(empty($addOauthFromProvider) && self::hasSigninError($output)){ + return self::getTitleFromLink($link, 'youtube'); + } $response['output'] = $output; } else { _error_log("getTitleFromLink: Get Title: $cmd \n" . print_r($output, true)); @@ -2569,12 +2585,15 @@ public static function getTitleFromLink($link) return $response; } - public static function getDurationFromLink($link) + public static function getDurationFromLink($link, $addOauthFromProvider = '') { $link = escapeshellarg($link); - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --no-playlist --force-ipv4 --get-duration --skip-download {$link}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --no-playlist --force-ipv4 --get-duration --skip-download {$link}"; exec($cmd . " 2>&1", $output, $return_val); if ($return_val !== 0) { + if(empty($addOauthFromProvider) && self::hasSigninError($output)){ + return self::getDurationFromLink($link, 'youtube'); + } return false; } else { $line = end($output); @@ -2587,18 +2606,21 @@ public static function getDurationFromLink($link) } } - public static function getThumbsFromLink($link, $returnFileName = false) + public static function getThumbsFromLink($link, $returnFileName = false, $addOauthFromProvider = '') { $link = str_replace(array('"', "'"), array('', ''), $link); $link = escapeshellarg($link); $tmpfname = _get_temp_file('thumbs'); - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --no-playlist --force-ipv4 --write-thumbnail --skip-download -o \"{$tmpfname}.jpg\" {$link}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --no-playlist --force-ipv4 --write-thumbnail --skip-download -o \"{$tmpfname}.jpg\" {$link}"; exec($cmd . " 2>&1", $output, $return_val); _error_log("getThumbsFromLink: {$cmd}"); if ($return_val !== 0) { _error_log("getThumbsFromLink: Error: " . json_encode($output)); + if(empty($addOauthFromProvider) && self::hasSigninError($output)){ + return self::getThumbsFromLink($link, $returnFileName, 'youtube'); + } } $returnTmpfname = $tmpfname . ".jpg"; @@ -2619,16 +2641,19 @@ public static function getThumbsFromLink($link, $returnFileName = false) } } - public static function getDescriptionFromLink($link) + public static function getDescriptionFromLink($link, $addOauthFromProvider = '') { if (empty($link)) { return ''; } $link = escapeshellarg($link); $tmpfname = _get_temp_file('thumbs'); - $cmd = self::getYouTubeDLCommand() . " --no-check-certificate --no-playlist --force-ipv4 --write-description --skip-download -o \"{$tmpfname}\" {$link}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --no-playlist --force-ipv4 --write-description --skip-download -o \"{$tmpfname}\" {$link}"; exec($cmd . " 2>&1", $output, $return_val); if ($return_val !== 0) { + if(empty($addOauthFromProvider) && self::hasSigninError($output)){ + return self::getDescriptionFromLink($link, 'youtube'); + } @unlink($tmpfname . ".description"); return false; } else { @@ -2638,18 +2663,23 @@ public static function getDescriptionFromLink($link) } } - public static function getYouTubeDLCommand($forceYoutubeDL = false) + public static function getYouTubeDLCommand($addOauthFromProvider = '', $forceYoutubeDL = false) { global $global; + $ytdl = "youtube-dl "; if (!empty($global['youtube-dl'])) { - return $global['youtube-dl'] . ' '; + $ytdl = $global['youtube-dl'] . ' '; } elseif (empty($forceYoutubeDL) && file_exists("/usr/local/bin/yt-dlp")) { - return "/usr/local/bin/yt-dlp "; + $ytdl = "/usr/local/bin/yt-dlp "; } elseif (file_exists("/usr/local/bin/youtube-dl")) { - return "/usr/local/bin/youtube-dl "; - } else { - return "youtube-dl "; - } + $ytdl = "/usr/local/bin/youtube-dl "; + } + if(!empty($addOauthFromProvider)){ + $streamers_id = Login::getStreamerId(); + $accessToken = Streamer::getAccessToken($streamers_id, $addOauthFromProvider); + $ytdl .= " --add-header \"Authorization: Bearer {$accessToken}\" "; + } + return $ytdl; } public static function setStreamerLog($encoder_queue_id, $msg, $type) diff --git a/objects/Streamer.php b/objects/Streamer.php index 0cfd1891c..4b76e96fb 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -333,18 +333,19 @@ static function revalidateToken($streamers_id, $provider) $json = json_decode($jsonString, true); } - $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['accessToken']; + $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['access_token']; if (empty($response['accessToken'])) { $response['msg'] = "revalidateToken($streamers_id, $provider) access_token is empty "; return $response; } - + /* $response['expires_at'] = $json[$provider]['json']["restream.ypt.me"]["expires"]["expires_at"]; if (time() <= $response['expires_at']) { $response['msg'] = "Not expired yet"; return $response; } + */ $access_token = base64_encode(json_encode($response['accessToken'])); @@ -367,11 +368,21 @@ static function revalidateToken($streamers_id, $provider) if(empty($response['error'] ) && !empty($response['respJson']['new_access_token'])){ $json[$provider]['json']["restream.ypt.me"]['accessToken'] = $response['respJson']['new_access_token']; $json[$provider]['json']["restream.ypt.me"]['expires'] = $response['respJson']['expires']; + + $response['accessToken'] = $response['respJson']['new_access_token']; + $response['expires'] = $response['respJson']['expires']; + $s->setJson($json); $response['saved'] = $s->save(); } return $response; } + + static function getAccessToken($streamers_id, $provider){ + $json = self::revalidateToken($streamers_id, $provider); + //var_dump($json);exit; + return $json['accessToken']["access_token"]; + } } } From 556e0f10fda10d55f1d0c513443ab68684a5f621 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:22:47 -0300 Subject: [PATCH 266/416] Update --- objects/Encoder.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index e723e3a6f..c41291955 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2566,6 +2566,7 @@ public static function getTitleFromLink($link, $addOauthFromProvider = '') if (!isWindows()) { $prepend = 'LC_ALL=en_US.UTF-8 '; } + $link = str_replace("'", '', $link); $link = escapeshellarg($link); $response = array('error' => true, 'output' => array()); $cmd = $prepend . self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --no-playlist --force-ipv4 --skip-download -e {$link}"; @@ -2677,7 +2678,9 @@ public static function getYouTubeDLCommand($addOauthFromProvider = '', $forceYou if(!empty($addOauthFromProvider)){ $streamers_id = Login::getStreamerId(); $accessToken = Streamer::getAccessToken($streamers_id, $addOauthFromProvider); - $ytdl .= " --add-header \"Authorization: Bearer {$accessToken}\" "; + if(!empty($accessToken)){ + $ytdl .= " --add-header \"Authorization: Bearer {$accessToken}\" "; + } } return $ytdl; } From 52c00100bfff35bb9df5946ed427aac87ab99852 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:25:22 -0300 Subject: [PATCH 267/416] Update --- objects/Streamer.php | 1 + 1 file changed, 1 insertion(+) diff --git a/objects/Streamer.php b/objects/Streamer.php index 4b76e96fb..70c872297 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -336,6 +336,7 @@ static function revalidateToken($streamers_id, $provider) $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['access_token']; if (empty($response['accessToken'])) { + _error_log(json_encode($json)); $response['msg'] = "revalidateToken($streamers_id, $provider) access_token is empty "; return $response; } From 9ec4c9b49e4cd3eea7ca9060c97a882abf1abb2b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:28:06 -0300 Subject: [PATCH 268/416] Update --- objects/Streamer.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/objects/Streamer.php b/objects/Streamer.php index 70c872297..782685a5f 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -333,8 +333,12 @@ static function revalidateToken($streamers_id, $provider) $json = json_decode($jsonString, true); } - - $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['access_token']; + if(empty($json[$provider]['json']["restream.ypt.me"]['access_token'])){ + $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['accessToken']['access_token']; + }else{ + $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['access_token']; + } + if (empty($response['accessToken'])) { _error_log(json_encode($json)); $response['msg'] = "revalidateToken($streamers_id, $provider) access_token is empty "; From 85d541cc7e2f6fa9a05887a75d8cc7bcd75f5e84 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:30:21 -0300 Subject: [PATCH 269/416] Update --- objects/Streamer.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/objects/Streamer.php b/objects/Streamer.php index 782685a5f..7df1d94ce 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -387,6 +387,10 @@ static function revalidateToken($streamers_id, $provider) static function getAccessToken($streamers_id, $provider){ $json = self::revalidateToken($streamers_id, $provider); //var_dump($json);exit; + if(empty($json['accessToken']["access_token"])){ + _error_log(json_encode($json)); + return false; + } return $json['accessToken']["access_token"]; } } From f63066cc7f5d311736b36abb3f5778334e3bbd03 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:46:13 -0300 Subject: [PATCH 270/416] Update --- objects/Streamer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Streamer.php b/objects/Streamer.php index 7df1d94ce..cac1dbe45 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -332,7 +332,7 @@ static function revalidateToken($streamers_id, $provider) } else { $json = json_decode($jsonString, true); } - + $response['json'] = $json; if(empty($json[$provider]['json']["restream.ypt.me"]['access_token'])){ $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['accessToken']['access_token']; }else{ From b3695149f02f042d521f79ead73a3ac6c4a1d968 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:47:58 -0300 Subject: [PATCH 271/416] Update --- objects/Streamer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Streamer.php b/objects/Streamer.php index cac1dbe45..6eaecdde0 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -334,7 +334,7 @@ static function revalidateToken($streamers_id, $provider) } $response['json'] = $json; if(empty($json[$provider]['json']["restream.ypt.me"]['access_token'])){ - $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['accessToken']['access_token']; + $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['accessToken']; }else{ $response['accessToken'] = $json[$provider]['json']["restream.ypt.me"]['access_token']; } From 2f5105210df5fe01645f76bedec0dedc3dda0efb Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:53:23 -0300 Subject: [PATCH 272/416] Update --- objects/Encoder.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index c41291955..407cae855 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2675,10 +2675,11 @@ public static function getYouTubeDLCommand($addOauthFromProvider = '', $forceYou } elseif (file_exists("/usr/local/bin/youtube-dl")) { $ytdl = "/usr/local/bin/youtube-dl "; } - if(!empty($addOauthFromProvider)){ + if(!empty($addOauthFromProvider) || !empty($global['usingOauth'])){ $streamers_id = Login::getStreamerId(); $accessToken = Streamer::getAccessToken($streamers_id, $addOauthFromProvider); if(!empty($accessToken)){ + $global['usingOauth'] = 1; $ytdl .= " --add-header \"Authorization: Bearer {$accessToken}\" "; } } From 652370e0342c19ca897146037edf8084066ba5b6 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:55:05 -0300 Subject: [PATCH 273/416] Update --- objects/Encoder.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 407cae855..67917551e 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -603,10 +603,6 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add exec($cmd . " 1> {$progressFile} 2>&1", $output, $return_val); _error_log("getYoutubeDl: Getting from Youtube DL {$cmd} done {$progressFile} "); if ($return_val !== 0) { - - if(empty($addOauthFromProvider) && self::hasSigninError($output)){ - return self::getDescriptionFromLink($videoURL, $queue_id, $destinationFile, 'youtube'); - } //echo "\n**ERROR Youtube DL **".$code . "\n" . print_r($output, true); $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); @@ -638,6 +634,10 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); + + if(empty($addOauthFromProvider) && preg_match('/youtube/i', $videoURL)){ + return self::getDescriptionFromLink($videoURL, $queue_id, $destinationFile, 'youtube'); + } return false; } } From 4200850a4b4fa3dcf5f65181cf62eef0d6902241 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 15:58:50 -0300 Subject: [PATCH 274/416] Update --- objects/Streamer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Streamer.php b/objects/Streamer.php index 6eaecdde0..dec0edd54 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -327,7 +327,7 @@ static function revalidateToken($streamers_id, $provider) $s = new Streamer($streamers_id); $jsonString = $s->getJson(); if (empty($jsonString)) { - $response['msg'] = 'There is no token for this'; + $response['msg'] = "There is no token for this streamers_id = $streamers_id [$provider]"; return $response; } else { $json = json_decode($jsonString, true); From d1112166614afacba1acf1feecc8fc14508c8a99 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 16:00:09 -0300 Subject: [PATCH 275/416] Update --- objects/Streamer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Streamer.php b/objects/Streamer.php index dec0edd54..d9b7baed0 100644 --- a/objects/Streamer.php +++ b/objects/Streamer.php @@ -327,7 +327,7 @@ static function revalidateToken($streamers_id, $provider) $s = new Streamer($streamers_id); $jsonString = $s->getJson(); if (empty($jsonString)) { - $response['msg'] = "There is no token for this streamers_id = $streamers_id [$provider]"; + $response['msg'] = "There is no token for this streamers_id = $streamers_id [$provider] ".json_encode(debug_backtrace()); return $response; } else { $json = json_decode($jsonString, true); From f7805844f5c91f75e1b86ab465518503c5425eac Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 16:05:04 -0300 Subject: [PATCH 276/416] Update --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 67917551e..73d1a68f5 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -636,7 +636,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); if(empty($addOauthFromProvider) && preg_match('/youtube/i', $videoURL)){ - return self::getDescriptionFromLink($videoURL, $queue_id, $destinationFile, 'youtube'); + return self::getDescriptionFromLink($videoURL, 'youtube'); } return false; } From 2a798787b48d8fc4799036270b0cbd878c3ea2b9 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 16:09:08 -0300 Subject: [PATCH 277/416] Update --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 73d1a68f5..f61b993ed 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -636,7 +636,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); if(empty($addOauthFromProvider) && preg_match('/youtube/i', $videoURL)){ - return self::getDescriptionFromLink($videoURL, 'youtube'); + return self::getYoutubeDl($videoURL, $queue_id, $destinationFile,'youtube'); } return false; } From 1b9ba0dffdeee2dac5916b0efa3a67b85c52c99d Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 16:12:59 -0300 Subject: [PATCH 278/416] Update --- objects/Encoder.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index f61b993ed..0f77bed7b 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -595,7 +595,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $videoURL = escapeshellarg($videoURL); $tmpfname = _get_temp_file('youtubeDl'); //$cmd = "youtube-dl -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; - $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $queue_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; $progressFile = "{$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt"; _error_log("getYoutubeDl: Getting from Youtube DL {$cmd} progressFile={$progressFile} " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); @@ -607,7 +607,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $queue_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); @@ -616,7 +616,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $queue_id) . " --no-check-certificate --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); @@ -625,7 +625,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand($addOauthFromProvider) . " --no-check-certificate --force-ipv4 --no-playlist -k -o '{$tmpfname}.%(ext)s' {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $queue_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o '{$tmpfname}.%(ext)s' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); @@ -2664,7 +2664,7 @@ public static function getDescriptionFromLink($link, $addOauthFromProvider = '') } } - public static function getYouTubeDLCommand($addOauthFromProvider = '', $forceYoutubeDL = false) + public static function getYouTubeDLCommand($addOauthFromProvider = '', $streamers_id = 0, $forceYoutubeDL = false) { global $global; $ytdl = "youtube-dl "; @@ -2676,7 +2676,13 @@ public static function getYouTubeDLCommand($addOauthFromProvider = '', $forceYou $ytdl = "/usr/local/bin/youtube-dl "; } if(!empty($addOauthFromProvider) || !empty($global['usingOauth'])){ - $streamers_id = Login::getStreamerId(); + if(empty($streamers_id)){ + $streamers_id = Login::getStreamerId(); + } + if(empty($streamers_id)){ + _error_log('streamers_id not found'); + return $ytdl; + } $accessToken = Streamer::getAccessToken($streamers_id, $addOauthFromProvider); if(!empty($accessToken)){ $global['usingOauth'] = 1; From be385ccef169c92fe9298c35b624f9cd81772de1 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 16:16:24 -0300 Subject: [PATCH 279/416] Update --- objects/Encoder.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 0f77bed7b..4b23b7958 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -594,8 +594,12 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add global $global; $videoURL = escapeshellarg($videoURL); $tmpfname = _get_temp_file('youtubeDl'); + + $e = new Encoder($queue_id); + $streamers_id = $e->getStreamers_id(); + //$cmd = "youtube-dl -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; - $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $queue_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $streamers_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; $progressFile = "{$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt"; _error_log("getYoutubeDl: Getting from Youtube DL {$cmd} progressFile={$progressFile} " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); @@ -607,7 +611,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $queue_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $streamers_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); @@ -616,7 +620,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $queue_id) . " --no-check-certificate --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $streamers_id) . " --no-check-certificate --no-playlist -k -o {$tmpfname}.mp4 {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); @@ -625,7 +629,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $error = $cmd . PHP_EOL . print_r($output, true); _error_log($error); self::setStreamerLog($queue_id, 'Fail to download line=' . __LINE__ . ' ' . $error, Encoder::LOG_TYPE_ERROR); - $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $queue_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o '{$tmpfname}.%(ext)s' {$videoURL}"; + $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $streamers_id) . " --no-check-certificate --force-ipv4 --no-playlist -k -o '{$tmpfname}.%(ext)s' {$videoURL}"; //echo "\n**Trying Youtube DL **".$cmd; _error_log("getYoutubeDl: Getting from Youtube other option DL {$cmd}"); exec($cmd . " 1> {$global['systemRootPath']}videos/{$queue_id}_tmpFile_downloadProgress.txt 2>&1", $output, $return_val); From 779c87ae35674d93c36dce7b2fee2bafba278e4b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 16:18:08 -0300 Subject: [PATCH 280/416] Update --- objects/Encoder.php | 1 + 1 file changed, 1 insertion(+) diff --git a/objects/Encoder.php b/objects/Encoder.php index 4b23b7958..c43627a03 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -592,6 +592,7 @@ private static function setDownloaded($queue_id, $filePath) public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $addOauthFromProvider = '') { global $global; + $videoURL = str_replace("'", '', $videoURL); $videoURL = escapeshellarg($videoURL); $tmpfname = _get_temp_file('youtubeDl'); From 6861665c91404cca400ec788b4b8d6e3938fee00 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 12 Aug 2024 16:23:51 -0300 Subject: [PATCH 281/416] Update --- view/index_signin.php | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/view/index_signin.php b/view/index_signin.php index 387dd93d3..8ab288c68 100644 --- a/view/index_signin.php +++ b/view/index_signin.php @@ -1,5 +1,5 @@ - - + + @@ -50,13 +50,30 @@
    +
    From c236c1d2652950f7b23ef812c43a05d7fb4dcd19 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 26 Nov 2024 15:00:19 -0300 Subject: [PATCH 331/416] Update --- node_modules/.package-lock.json | 8 +- node_modules/jquery/AUTHORS.txt | 176 +- node_modules/jquery/README.md | 12 +- node_modules/jquery/dist/jquery.js | 2117 +++++++------- node_modules/jquery/dist/jquery.min.js | 4 +- node_modules/jquery/dist/jquery.min.map | 2 +- node_modules/jquery/dist/jquery.slim.js | 2059 +++++++------- node_modules/jquery/dist/jquery.slim.min.js | 4 +- node_modules/jquery/dist/jquery.slim.min.map | 2 +- .../jquery/external/sizzle/LICENSE.txt | 36 - .../jquery/external/sizzle/dist/sizzle.js | 2478 ----------------- .../jquery/external/sizzle/dist/sizzle.min.js | 3 - .../external/sizzle/dist/sizzle.min.map | 1 - node_modules/jquery/package.json | 46 +- node_modules/jquery/src/ajax.js | 14 +- node_modules/jquery/src/ajax/xhr.js | 6 +- node_modules/jquery/src/attributes/classes.js | 70 +- node_modules/jquery/src/attributes/prop.js | 3 +- node_modules/jquery/src/attributes/val.js | 4 +- node_modules/jquery/src/core.js | 46 +- node_modules/jquery/src/core/camelCase.js | 2 +- node_modules/jquery/src/core/init.js | 4 +- node_modules/jquery/src/core/isAttached.js | 2 +- .../jquery/src/core/ready-no-deferred.js | 2 +- node_modules/jquery/src/core/ready.js | 2 +- node_modules/jquery/src/css.js | 71 +- node_modules/jquery/src/css/curCSS.js | 41 +- node_modules/jquery/src/css/support.js | 6 +- node_modules/jquery/src/css/var/getStyles.js | 2 +- node_modules/jquery/src/data.js | 2 +- node_modules/jquery/src/data/Data.js | 2 +- node_modules/jquery/src/deferred.js | 15 +- .../jquery/src/deferred/exceptionHook.js | 8 +- node_modules/jquery/src/deprecated.js | 6 +- node_modules/jquery/src/deprecated/event.js | 4 +- node_modules/jquery/src/effects.js | 2 +- node_modules/jquery/src/event.js | 232 +- node_modules/jquery/src/event/focusin.js | 58 - node_modules/jquery/src/event/support.js | 11 - node_modules/jquery/src/event/trigger.js | 6 +- node_modules/jquery/src/exports/global.js | 4 +- node_modules/jquery/src/jquery.js | 1 - node_modules/jquery/src/manipulation.js | 16 +- .../jquery/src/manipulation/_evalUrl.js | 2 +- .../jquery/src/manipulation/buildFragment.js | 2 +- .../jquery/src/manipulation/getAll.js | 2 +- .../jquery/src/manipulation/support.js | 4 +- .../jquery/src/manipulation/wrapMap.js | 2 +- node_modules/jquery/src/queue/delay.js | 1 - node_modules/jquery/src/selector-native.js | 133 +- node_modules/jquery/src/selector-sizzle.js | 19 - node_modules/jquery/src/selector.js | 2118 +++++++++++++- node_modules/jquery/src/traversing.js | 2 +- package-lock.json | 14 +- 54 files changed, 4632 insertions(+), 5257 deletions(-) delete mode 100644 node_modules/jquery/external/sizzle/LICENSE.txt delete mode 100644 node_modules/jquery/external/sizzle/dist/sizzle.js delete mode 100644 node_modules/jquery/external/sizzle/dist/sizzle.min.js delete mode 100644 node_modules/jquery/external/sizzle/dist/sizzle.min.map delete mode 100644 node_modules/jquery/src/event/focusin.js delete mode 100644 node_modules/jquery/src/event/support.js delete mode 100644 node_modules/jquery/src/selector-sizzle.js diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 62fccfb61..8f6e05a4d 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1,5 +1,5 @@ { - "name": "AVideo-Encoder", + "name": "encoder", "lockfileVersion": 2, "requires": true, "packages": { @@ -12,9 +12,9 @@ } }, "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" } } } diff --git a/node_modules/jquery/AUTHORS.txt b/node_modules/jquery/AUTHORS.txt index 0d44990fc..648a3f0f4 100644 --- a/node_modules/jquery/AUTHORS.txt +++ b/node_modules/jquery/AUTHORS.txt @@ -18,16 +18,24 @@ David Serduke Richard D. Worth Scott González Ariel Flesler +Cheah Chu Yeow +Andrew Chalkley +Fabio Buffoni +Stefan Bauckmeier  Jon Evans TJ Holowaychuk +Riccardo De Agostini Michael Bensoussan -Robert Katić Louis-Rémi Babé -Earle Castledine +Robert Katić Damian Janowski +Anton Kovalyov +Dušan B. Jovanovic +Earle Castledine Rich Dougherty Kim Dalsgaard Andrea Giammarchi +Fabian Jakobs Mark Gibson Karl Swedberg Justin Meyer @@ -35,9 +43,10 @@ Ben Alman James Padolsey David Petersen Batiste Bieler +Jake Archibald Alexander Farkas -Rick Waldron Filipe Fortes +Rick Waldron Neeraj Singh Paul Irish Iraê Carvalho @@ -45,23 +54,24 @@ Matt Curry Michael Monteleone Noah Sloan Tom Viner +J. Ryan Stinnett Douglas Neiner Adam J. Sontag +Heungsub Lee Dave Reed -Ralph Whitbeck Carl Fürstenberg Jacob Wright -J. Ryan Stinnett +Ralph Whitbeck unknown temp01 -Heungsub Lee Colin Snover +Jared Grippe Ryan W Tenney +Alex Sexton Pinhook Ron Otten Jephte Clain Anton Matzneller -Alex Sexton Dan Heberden Henri Wiechers Russell Holbrook @@ -71,21 +81,19 @@ Scott Jehl James Burke Jonas Pfenniger Xavi Ramirez -Jared Grippe Sylvester Keil Brandon Sterne Mathias Bynens +Lee Carpenter Timmy Willison <4timmywil@gmail.com> Corey Frang Digitalxero -Anton Kovalyov David Murdoch Josh Varner Charles McNulty Jordan Boesch Jess Thrysoee Michael Murray -Lee Carpenter Alexis Abril Rob Morgan John Firebaugh @@ -105,12 +113,13 @@ Timo Tijhof Steen Nielsen Anton Ryzhov Shi Chuan +Matt Mueller Berker Peksag Toby Brain -Matt Mueller Justin Daniel Herman Oleg Gaidarenko +Rock Hymas Richard Gibson Rafaël Blais Masson cmc3cn <59194618@qq.com> @@ -122,6 +131,7 @@ Andrew E Monat Oskari Joao Henrique de Andrade Bruni tsinha +Dominik D. Geyer Matt Farmer Trey Hunner Jason Moon @@ -130,164 +140,180 @@ Kris Borchers Vladimir Zhuravlev Jacob Thornton Chad Killingsworth +Vitya Muhachev Nowres Rafid David Benjamin +Alan Plum Uri Gilad Chris Faulkner +Marcel Greter Elijah Manor Daniel Chatfield +Daniel Gálvez Nikita Govorov Wesley Walser Mike Pennisi +Matthias Jäggli +Devin Cooper Markus Staab Dave Riddle Callum Macrae +Jonathan Sampson Benjamin Truyman +Jay Merrifield James Huston +Sai Lung Wong Erick Ruiz de Chávez David Bonner +Allen J Schmidt Jr Akintayo Akinwunmi MORGAN Ismail Khair Carl Danley Mike Petrovich Greg Lavallee -Daniel Gálvez -Sai Lung Wong Tom H Fuertes Roland Eckl -Jay Merrifield -Allen J Schmidt Jr -Jonathan Sampson -Marcel Greter -Matthias Jäggli -David Fox Yiming He -Devin Cooper +David Fox +Bennett Sorbo Paul Ramos Rod Vagg -Bennett Sorbo Sebastian Burkhard Zachary Adam Kaplan +Adam Coulombe nanto_vi nanto Danil Somsikov Ryunosuke SATO +Diego Tres Jean Boussier -Adam Coulombe Andrew Plummer Mark Raddatz +Pascal Borreli Isaac Z. Schlueter Karl Sieburg -Pascal Borreli Nguyen Phuc Lam Dmitry Gusev -Michał Gołębiowski-Owczarek -Li Xudong Steven Benner -Tom H Fuertes +Li Xudong +Michał Gołębiowski-Owczarek Renato Oliveira dos Santos +Frederic Junod +Tom H Fuertes +Mitch Foley ros3cin -Jason Bedard Kyle Robinson Young +John Paul +Jason Bedard Chris Talkington Eddie Monge Terry Jones Jason Merino +Dan Burzo Jeremy Dunck Chris Price Guy Bedford +njhamann +Goare Mao Amey Sakhadeo Mike Sidorov Anthony Ryan -Dominik D. Geyer -George Kats Lihan Li +George Kats +Dongseok Paeng Ronny Springer -Chris Antaki -Marian Sollmann -njhamann Ilya Kantor +Marian Sollmann +Chris Antaki David Hong -John Paul Jakob Stoeck Christopher Jones Forbes Lindesay S. Andrew Sheppard Leonardo Balter -Roman Reiß -Benjy Cui Rodrigo Rosenfeld Rosas -John Hoven +Daniel Husar Philip Jägenstedt +John Hoven +Roman Reiß +Benjy Cui Christian Kosmowski +David Corbacho Liang Peng TJ VanToll -Senya Pugach Aurelio De Rosa +Senya Pugach +Dan Hart Nazar Mokrynskyi +Benjamin Tan Amit Merchant Jason Bedard +Veaceslav Grimalschi +Richard McDaniel Arthur Verschaeve -Dan Hart +Shivaji Varma +Ben Toews Bin Xin -David Corbacho -Veaceslav Grimalschi -Daniel Husar +Neftaly Hernandez +T.J. Crowder +Nicolas HENRY Frederic Hemberger -Ben Toews -Aditya Raghavan Victor Homyakov -Shivaji Varma -Nicolas HENRY +Aditya Raghavan Anne-Gaelle Colom -George Mauer Leonardo Braga +George Mauer Stephen Edgar Thomas Tortorini -Winston Howes +Jörn Wagner Jon Hester +Colin Frick +Winston Howes Alexander O'Mara +Chris Rebert Bastian Buchholz -Arthur Stolyar -Calvin Metcalf Mu Haibao -Richard McDaniel -Chris Rebert +Calvin Metcalf +Arthur Stolyar Gabriel Schulhof Gilad Peleg +Julian Alexander Murillo +Kevin Kirsche Martin Naumann +Yongwoo Jeon +John-David Dalton Marek Lewandowski Bruno Pérel -Reed Loden Daniel Nill -Yongwoo Jeon +Reed Loden Sean Henderson +Gary Ye Richard Kraaijenhagen Connor Atherton -Gary Ye Christian Grete +Tom von Clef Liza Ramo -Julian Alexander Murillo Joelle Fleurantin +Steve Mao +Jon Dufresne Jae Sung Park -Jun Sun Josh Soref +Saptak Sengupta Henry Wong -Jon Dufresne +Jun Sun Martijn W. van der Lee Devin Wilson -Steve Mao +Damian Senn Zack Hall -Bernhard M. Wiedemann +Vitaliy Terziev Todor Prikumov +Bernhard M. Wiedemann Jha Naman -William Robinet Alexander Lisianoi -Vitaliy Terziev +William Robinet Joe Trumbull Alexander K -Damian Senn Ralin Chimev Felipe Sateler Christophe Tafani-Dereeper @@ -295,31 +321,36 @@ Manoj Kumar David Broder-Rodgers Alex Louden Alex Padilla -南漂一卒 karan-96 +南漂一卒 +Erik Lax Boom Lee Andreas Solleder -CDAGaming Pierre Spring Shashanka Nataraj -Erik Lax +CDAGaming Matan Kotler-Berkowitz <205matan@gmail.com> Jordan Beland Henry Zhu -Saptak Sengupta Nilton Cesar basil.belokon +Andrey Meshkov tmybr11 Luis Emilio Velasco Sanchez Ed S Bert Zhang +Sébastien Règne +wartmanm <3869625+wartmanm@users.noreply.github.com> +Siddharth Dungarwal +abnud1 Andrei Fangli Marja Hölttä -abnud1 buddh4 +Hoang +Wonseop Kim Pat O'Callaghan +JuanMa Ruiz Ahmed.S.ElAfifi -Wonseop Kim Christian Oliff Christian Wenz Sean Robinson @@ -329,3 +360,12 @@ Beatriz Rezener Natalia Sroka <37873210+natipo@users.noreply.github.com> Wonhyoung Park Dallas Fraser +fecore1 <89127124+fecore1@users.noreply.github.com> +ygj6 <7699524+ygj6@users.noreply.github.com> +Simon Legner +Vladimir Sitnikov +Anders Kaseorg +Alex +Timo Tijhof +Gabriela Gutierrez +Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com> diff --git a/node_modules/jquery/README.md b/node_modules/jquery/README.md index 60982f73a..fcc11f3ba 100644 --- a/node_modules/jquery/README.md +++ b/node_modules/jquery/README.md @@ -5,7 +5,7 @@ For information on how to get started and how to use jQuery, please see [jQuery's documentation](https://api.jquery.com/). For source files and issues, please visit the [jQuery repo](https://github.com/jquery/jquery). -If upgrading, please see the [blog post for 3.6.0](https://blog.jquery.com/2021/03/02/jquery-3-6-0-released/). This includes notable differences from the previous version and a more readable changelog. +If upgrading, please see the [blog post for 3.7.1](https://blog.jquery.com/2023/08/28/jquery-3-7-1-released-reliable-table-row-dimensions/). This includes notable differences from the previous version and a more readable changelog. ## Including jQuery @@ -16,20 +16,18 @@ Below are some of the most common ways to include jQuery. #### Script tag ```html - + ``` -#### Babel +#### Webpack / Browserify / Babel -[Babel](https://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively. +There are several ways to use [Webpack](https://webpack.js.org/), [Browserify](http://browserify.org/) or [Babel](https://babeljs.io/). For more information on using these tools, please refer to the corresponding project's documentation. In the script, including jQuery will usually look like this: ```js import $ from "jquery"; ``` -#### Browserify/Webpack - -There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documentation. In the script, including jQuery will usually look like this... +If you need to use jQuery in a file that's not an ECMAScript module, you can use the CommonJS syntax: ```js var $ = require( "jquery" ); diff --git a/node_modules/jquery/dist/jquery.js b/node_modules/jquery/dist/jquery.js index fc6c299b7..1a86433c2 100644 --- a/node_modules/jquery/dist/jquery.js +++ b/node_modules/jquery/dist/jquery.js @@ -1,15 +1,12 @@ /*! - * jQuery JavaScript Library v3.6.0 + * jQuery JavaScript Library v3.7.1 * https://jquery.com/ * - * Includes Sizzle.js - * https://sizzlejs.com/ - * * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * - * Date: 2021-03-02T17:08Z + * Date: 2023-08-28T13:37Z */ ( function( global, factory ) { @@ -23,7 +20,7 @@ // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. + // See ticket trac-14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { @@ -150,8 +147,9 @@ function toType( obj ) { -var - version = "3.6.0", +var version = "3.7.1", + + rhtmlSuffix = /HTML$/i, // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -397,6 +395,38 @@ jQuery.extend( { return obj; }, + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; @@ -419,6 +449,15 @@ jQuery.extend( { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { @@ -520,43 +559,98 @@ function isArrayLike( obj ) { return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ -( function( window ) { + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + var i, - support, Expr, - getText, - isXML, - tokenize, - compile, - select, outermostContext, sortInput, hasDuplicate, + push = pushNative, // Local document vars - setDocument, document, - docElem, + documentElement, documentIsHTML, rbuggyQSA, - rbuggyMatches, matches, - contains, // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, + expando = jQuery.expando, dirruns = 0, done = 0, classCache = createCache(), @@ -570,47 +664,22 @@ var i, return 0; }, - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", // Regular expressions - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", @@ -629,101 +698,88 @@ var i, // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + bool: new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + + needsContext: new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, - rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, - rnative = /^[^{]+\{\s*\[native \w/, - // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonHex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; - return nonHex ? + if ( nonHex ) { // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + return nonHex; } - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, - // Used for iframes - // See setDocument() + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ // Removing the function wrapper causes a "Permission Denied" - // error in IE + // error in IE/Edge. unloadHandler = function() { setDocument(); }, inDisabledFieldset = addCombinator( function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + return elem.disabled === true && nodeName( elem, "fieldset" ); }, { dir: "parentNode", next: "legend" } ); +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + // Optimize for push.apply( _, NodeList ) try { push.apply( @@ -731,32 +787,22 @@ try { preferredDoc.childNodes ); - // Support: Android<4.0 + // Support: Android <=4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { + push = { + apply: function( target, els ) { pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); } }; } -function Sizzle( selector, context, results, seed ) { +function find( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, @@ -790,11 +836,10 @@ function Sizzle( selector, context, results, seed ) { if ( nodeType === 9 ) { if ( ( elem = context.getElementById( m ) ) ) { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if ( elem.id === m ) { - results.push( elem ); + push.call( results, elem ); return results; } } else { @@ -804,14 +849,13 @@ function Sizzle( selector, context, results, seed ) { // Element context } else { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && + find.contains( context, elem ) && elem.id === m ) { - results.push( elem ); + push.call( results, elem ); return results; } } @@ -822,22 +866,15 @@ function Sizzle( selector, context, results, seed ) { return results; // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { newSelector = selector; newContext = context; @@ -850,7 +887,7 @@ function Sizzle( selector, context, results, seed ) { // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || @@ -858,11 +895,15 @@ function Sizzle( selector, context, results, seed ) { // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { // Capture the context ID, setting it first if necessary if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); + nid = jQuery.escapeSelector( nid ); } else { context.setAttribute( "id", ( nid = expando ) ); } @@ -895,7 +936,7 @@ function Sizzle( selector, context, results, seed ) { } // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); } /** @@ -909,7 +950,8 @@ function createCache() { function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries @@ -921,7 +963,7 @@ function createCache() { } /** - * Mark a function for special use by Sizzle + * Mark a function for special use by jQuery selector module * @param {Function} fn The function to mark */ function markFunction( fn ) { @@ -952,56 +994,13 @@ function assert( fn ) { } } -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; + return nodeName( elem, "input" ) && elem.type === type; }; } @@ -1011,8 +1010,8 @@ function createInputPseudo( type ) { */ function createButtonPseudo( type ) { return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; }; } @@ -1048,14 +1047,13 @@ function createDisabledPseudo( disabled ) { } } - // Support: IE 6 - 11 + // Support: IE 6 - 11+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually - /* jshint -W018 */ elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; + inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; @@ -1095,7 +1093,7 @@ function createPositionalPseudo( fn ) { } /** - * Checks a node for validity as a Sizzle context + * Checks a node for validity as a jQuery selector context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ @@ -1103,31 +1101,13 @@ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - /** * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document + * @param {Element|Object} [node] An element or document object to use to set the document * @returns {Object} Returns the current document */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, +function setDocument( node ) { + var subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected @@ -1141,87 +1121,90 @@ setDocument = Sizzle.setDocument = function( node ) { // Update global variables document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); } - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; } ); - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); } ); - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); } ); - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } } ); // ID filter and find if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { + Expr.filter.ID = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute( "id" ) === attrId; }; }; - Expr.find[ "ID" ] = function( id, context ) { + Expr.find.ID = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { - Expr.filter[ "ID" ] = function( id ) { + Expr.filter.ID = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && @@ -1232,7 +1215,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { + Expr.find.ID = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); @@ -1262,40 +1245,18 @@ setDocument = Sizzle.setDocument = function( node ) { } // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } + Expr.find.TAG = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); - return tmp; - } - return results; - }; + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + Expr.find.CLASS = function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } @@ -1306,177 +1267,94 @@ setDocument = Sizzle.setDocument = function( node ) { // QSA and matchesSelector support - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { + var input; - var input; + documentElement.appendChild( el ).innerHTML = + "" + + ""; - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } - assert( function( el ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); + if ( !support.cssHas ) { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { + sortOrder = function( a, b ) { // Flag for duplicate removal if ( a === b ) { @@ -1510,8 +1388,8 @@ setDocument = Sizzle.setDocument = function( node ) { // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { + if ( a === document || a.ownerDocument == preferredDoc && + find.contains( preferredDoc, a ) ) { return -1; } @@ -1519,100 +1397,33 @@ setDocument = Sizzle.setDocument = function( node ) { // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { + if ( b === document || b.ownerDocument == preferredDoc && + find.contains( preferredDoc, b ) ) { return 1; } // Maintain original order return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; }; return document; -}; +} -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); }; -Sizzle.matchesSelector = function( elem, expr ) { +find.matchesSelector = function( elem, expr ) { setDocument( elem ); - if ( support.matchesSelector && documentIsHTML && + if ( documentIsHTML && !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); @@ -1620,9 +1431,9 @@ Sizzle.matchesSelector = function( elem, expr ) { // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch ( e ) { @@ -1630,10 +1441,10 @@ Sizzle.matchesSelector = function( elem, expr ) { } } - return Sizzle( expr, document, null, [ elem ] ).length > 0; + return find( expr, document, null, [ elem ] ).length > 0; }; -Sizzle.contains = function( context, elem ) { +find.contains = function( context, elem ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ @@ -1643,10 +1454,11 @@ Sizzle.contains = function( context, elem ) { if ( ( context.ownerDocument || context ) != document ) { setDocument( context ); } - return contains( context, elem ); + return jQuery.contains( context, elem ); }; -Sizzle.attr = function( elem, name ) { + +find.attr = function( elem, name ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ @@ -1659,25 +1471,19 @@ Sizzle.attr = function( elem, name ) { var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) + // Don't get fooled by Object.prototype properties (see trac-13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; + if ( val !== undefined ) { + return val; + } -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); + return elem.getAttribute( name ); }; -Sizzle.error = function( msg ) { +find.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; @@ -1685,76 +1491,44 @@ Sizzle.error = function( msg ) { * Document sorting and removing duplicates * @param {ArrayLike} results */ -Sizzle.uniqueSort = function( results ) { +jQuery.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); } } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } } - // Do not include comment or processing instruction nodes + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; - return ret; +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); }; -Expr = Sizzle.selectors = { +Expr = jQuery.expr = { // Can be adjusted by the user cacheLength: 50, @@ -1775,12 +1549,12 @@ Expr = Sizzle.selectors = { }, preFilter: { - "ATTR": function( match ) { + ATTR: function( match ) { match[ 1 ] = match[ 1 ].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) + .replace( runescape, funescape ); if ( match[ 2 ] === "~=" ) { match[ 3 ] = " " + match[ 3 ] + " "; @@ -1789,7 +1563,7 @@ Expr = Sizzle.selectors = { return match.slice( 0, 4 ); }, - "CHILD": function( match ) { + CHILD: function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) @@ -1807,29 +1581,30 @@ Expr = Sizzle.selectors = { // nth-* requires argument if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); + find.error( match[ 0 ] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[ 4 ] = +( match[ 4 ] ? match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) + ); match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - // other types prohibit arguments + // other types prohibit arguments } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); + find.error( match[ 0 ] ); } return match; }, - "PSEUDO": function( match ) { + PSEUDO: function( match ) { var excess, unquoted = !match[ 6 ] && match[ 2 ]; - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + if ( matchExpr.CHILD.test( match[ 0 ] ) ) { return null; } @@ -1858,36 +1633,36 @@ Expr = Sizzle.selectors = { filter: { - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + TAG: function( nodeNameSelector ) { + var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + return nodeName( elem, expectedNodeName ); }; }, - "CLASS": function( className ) { + CLASS: function( className ) { var pattern = classCache[ className + " " ]; return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); + ( pattern = new RegExp( "(^|" + whitespace + ")" + className + + "(" + whitespace + "|$)" ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); } ); }, - "ATTR": function( name, operator, check ) { + ATTR: function( name, operator, check ) { return function( elem ) { - var result = Sizzle.attr( elem, name ); + var result = find.attr( elem, name ); if ( result == null ) { return operator === "!="; @@ -1898,22 +1673,34 @@ Expr = Sizzle.selectors = { result += ""; - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + return false; }; }, - "CHILD": function( type, what, _argument, first, last ) { + CHILD: function( type, what, _argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; @@ -1926,7 +1713,7 @@ Expr = Sizzle.selectors = { } : function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, + var cache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), @@ -1941,7 +1728,7 @@ Expr = Sizzle.selectors = { node = elem; while ( ( node = node[ dir ] ) ) { if ( ofType ? - node.nodeName.toLowerCase() === name : + nodeName( node, name ) : node.nodeType === 1 ) { return false; @@ -1960,17 +1747,8 @@ Expr = Sizzle.selectors = { if ( forward && useCache ) { // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; @@ -1982,7 +1760,7 @@ Expr = Sizzle.selectors = { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } @@ -1991,17 +1769,8 @@ Expr = Sizzle.selectors = { // Use previously-cached element index if available if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } @@ -2015,7 +1784,7 @@ Expr = Sizzle.selectors = { ( diff = nodeIndex = 0 ) || start.pop() ) ) { if ( ( ofType ? - node.nodeName.toLowerCase() === name : + nodeName( node, name ) : node.nodeType === 1 ) && ++diff ) { @@ -2023,13 +1792,7 @@ Expr = Sizzle.selectors = { if ( useCache ) { outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; + outerCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { @@ -2047,19 +1810,19 @@ Expr = Sizzle.selectors = { }; }, - "PSEUDO": function( pseudo, argument ) { + PSEUDO: function( pseudo, argument ) { // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes + // https://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); + find.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function - // just as Sizzle does + // just as jQuery does if ( fn[ expando ] ) { return fn( argument ); } @@ -2073,7 +1836,7 @@ Expr = Sizzle.selectors = { matched = fn( seed, argument ), i = matched.length; while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); + idx = indexOf.call( seed, matched[ i ] ); seed[ idx ] = !( matches[ idx ] = matched[ i ] ); } } ) : @@ -2089,14 +1852,14 @@ Expr = Sizzle.selectors = { pseudos: { // Potentially complex pseudos - "not": markFunction( function( selector ) { + not: markFunction( function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); + matcher = compile( selector.replace( rtrimCSS, "$1" ) ); return matcher[ expando ] ? markFunction( function( seed, matches, _context, xml ) { @@ -2115,22 +1878,23 @@ Expr = Sizzle.selectors = { input[ 0 ] = elem; matcher( input, null, xml, results ); - // Don't keep the element (issue #299) + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) input[ 0 ] = null; return !results.pop(); }; } ), - "has": markFunction( function( selector ) { + has: markFunction( function( selector ) { return function( elem ) { - return Sizzle( selector, elem ).length > 0; + return find( selector, elem ).length > 0; }; } ), - "contains": markFunction( function( text ) { + contains: markFunction( function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; }; } ), @@ -2140,12 +1904,12 @@ Expr = Sizzle.selectors = { // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); + find.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { @@ -2164,38 +1928,39 @@ Expr = Sizzle.selectors = { } ), // Miscellaneous - "target": function( elem ) { + target: function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, - "root": function( elem ) { - return elem === docElem; + root: function( elem ) { + return elem === documentElement; }, - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && + focus: function( elem ) { + return elem === safeActiveElement() && + document.hasFocus() && !!( elem.type || elem.href || ~elem.tabIndex ); }, // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), - "checked": function( elem ) { + checked: function( elem ) { // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); }, - "selected": function( elem ) { + selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. if ( elem.parentNode ) { // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; @@ -2205,9 +1970,9 @@ Expr = Sizzle.selectors = { }, // Contents - "empty": function( elem ) { + empty: function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo + // https://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children @@ -2219,49 +1984,49 @@ Expr = Sizzle.selectors = { return true; }, - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); + parent: function( elem ) { + return !Expr.pseudos.empty( elem ); }, // Element/input types - "header": function( elem ) { + header: function( elem ) { return rheader.test( elem.nodeName ); }, - "input": function( elem ) { + input: function( elem ) { return rinputs.test( elem.nodeName ); }, - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; + button: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); }, - "text": function( elem ) { + text: function( elem ) { var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && + return nodeName( elem, "input" ) && elem.type === "text" && - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + // Support: IE <10 only + // New HTML5 attribute values (e.g., "search") appear + // with elem.type === "text" ( ( attr = elem.getAttribute( "type" ) ) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection - "first": createPositionalPseudo( function() { + first: createPositionalPseudo( function() { return [ 0 ]; } ), - "last": createPositionalPseudo( function( _matchIndexes, length ) { + last: createPositionalPseudo( function( _matchIndexes, length ) { return [ length - 1 ]; } ), - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; } ), - "even": createPositionalPseudo( function( matchIndexes, length ) { + even: createPositionalPseudo( function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); @@ -2269,7 +2034,7 @@ Expr = Sizzle.selectors = { return matchIndexes; } ), - "odd": createPositionalPseudo( function( matchIndexes, length ) { + odd: createPositionalPseudo( function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); @@ -2277,19 +2042,24 @@ Expr = Sizzle.selectors = { return matchIndexes; } ), - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; } ), - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); @@ -2299,7 +2069,7 @@ Expr = Sizzle.selectors = { } }; -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; +Expr.pseudos.nth = Expr.pseudos.eq; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { @@ -2314,7 +2084,7 @@ function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { +function tokenize( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; @@ -2342,13 +2112,13 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) { matched = false; // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { matched = match.shift(); tokens.push( { value: matched, // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) + type: match[ 0 ].replace( rtrimCSS, " " ) } ); soFar = soFar.slice( matched.length ); } @@ -2375,14 +2145,16 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) { // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : + if ( parseOnly ) { + return soFar.length; + } - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; + return soFar ? + find.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} function toSelector( tokens ) { var i = 0, @@ -2415,7 +2187,7 @@ function addCombinator( matcher, combinator, base ) { // Check against all ancestor/preceding elements function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, + var oldCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching @@ -2432,14 +2204,9 @@ function addCombinator( matcher, combinator, base ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { + if ( skip && nodeName( elem, skip ) ) { elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && + } else if ( ( oldCache = outerCache[ key ] ) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements @@ -2447,7 +2214,7 @@ function addCombinator( matcher, combinator, base ) { } else { // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; + outerCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { @@ -2479,7 +2246,7 @@ function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); + find( selector, contexts[ i ], results ); } return results; } @@ -2513,38 +2280,37 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS postFinder = setMatcher( postFinder, postSelector ); } return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, + var temp, i, elem, matcherOut, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), + elems = seed || + multipleContexts( selector || "*", + context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : - elems, + elems; - matcherOut = matcher ? + if ( matcher ) { - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - // ...intermediate processing is necessary - [] : + // ...intermediate processing is necessary + [] : - // ...otherwise use results directly - results : - matcherIn; + // ...otherwise use results directly + results; - // Find primary matches - if ( matcher ) { + // Find primary matches matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; } // Apply postFilter @@ -2582,7 +2348,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { seed[ temp ] = !( results[ temp ] = elem ); } @@ -2617,15 +2383,21 @@ function matcherFromTokens( tokens ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; + return indexOf.call( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( ( checkContext = context ).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) checkContext = null; return ret; } ]; @@ -2650,11 +2422,10 @@ function matcherFromTokens( tokens ) { i > 1 && elementMatcher( matchers ), i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrimCSS, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), @@ -2680,7 +2451,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { contextBackup = outermostContext, // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + elems = seed || byElement && Expr.find.TAG( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), @@ -2696,8 +2467,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { } // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + // Support: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: ) matching + // elements by id. (see trac-14142) for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { if ( byElement && elem ) { j = 0; @@ -2712,7 +2484,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { } while ( ( matcher = elementMatchers[ j++ ] ) ) { if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); + push.call( results, elem ); break; } } @@ -2775,7 +2547,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { - Sizzle.uniqueSort( results ); + jQuery.uniqueSort( results ); } } @@ -2793,7 +2565,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { superMatcher; } -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { +function compile( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], @@ -2816,27 +2588,25 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { } // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; -}; +} /** - * A low-level selection function that works with Sizzle's compiled + * A low-level selection function that works with jQuery's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile + * selector function built with jQuery selector compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ -select = Sizzle.select = function( selector, context, results, seed ) { +function select( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( ( selector = compiled.selector || selector ) ); @@ -2850,10 +2620,12 @@ select = Sizzle.select = function( selector, context, results, seed ) { // Reduce context if the leading compound selector is an ID tokens = match[ 0 ] = match[ 0 ].slice( 0 ); if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; + context = ( Expr.find.ID( + token.matches[ 0 ].replace( runescape, funescape ), + context + ) || [] )[ 0 ]; if ( !context ) { return results; @@ -2866,7 +2638,7 @@ select = Sizzle.select = function( selector, context, results, seed ) { } // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[ i ]; @@ -2879,8 +2651,8 @@ select = Sizzle.select = function( selector, context, results, seed ) { // Search, expanding context for leading sibling combinators if ( ( seed = find( token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context ) ) ) { // If seed is empty or no tokens remain, we can return early @@ -2907,21 +2679,18 @@ select = Sizzle.select = function( selector, context, results, seed ) { !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; -}; +} // One-time assignments +// Support: Android <=4.0 - 4.1+ // Sort stability support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - // Initialize against the default document setDocument(); -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Support: Android <=4.0 - 4.1+ // Detached nodes confoundingly follow *each other* support.sortDetached = assert( function( el ) { @@ -2929,68 +2698,29 @@ support.sortDetached = assert( function( el ) { return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; } ); -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; +jQuery.find = find; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + /* eslint-enable */ +} )(); var dir = function( elem, dir, until ) { @@ -3024,13 +2754,6 @@ var siblings = function( n, elem ) { var rneedsContext = jQuery.expr.match.needsContext; - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); @@ -3129,8 +2852,8 @@ jQuery.fn.extend( { var rootjQuery, // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) + // Prioritize #id over to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, @@ -3281,7 +3004,7 @@ jQuery.fn.extend( { if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : - // Don't pass non-elements to Sizzle + // Don't pass non-elements to jQuery#find cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { @@ -3836,7 +3559,7 @@ jQuery.extend( { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, - process.stackTrace ); + process.error ); } // Support: Promises/A+ section 2.3.3.3.4.1 @@ -3864,10 +3587,17 @@ jQuery.extend( { process(); } else { - // Call an optional hook to record the stack, in case of exception + // Call an optional hook to record the error, in case of exception // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } @@ -4042,12 +3772,16 @@ jQuery.extend( { // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; -jQuery.Deferred.exceptionHook = function( error, stack ) { +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + window.console.warn( "jQuery.Deferred exception: " + error.message, + error.stack, asyncError ); } }; @@ -4087,7 +3821,7 @@ jQuery.extend( { isReady: false, // A counter to track how many items to wait for before - // the ready event fires. See #6781 + // the ready event fires. See trac-6781 readyWait: 1, // Handle when the DOM is ready @@ -4215,7 +3949,7 @@ function fcamelCase( _all, letter ) { // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) +// Microsoft forgot to hump their vendor prefix (trac-9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } @@ -4251,7 +3985,7 @@ Data.prototype = { value = {}; // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. + // but we should not, see trac-8335. // Always return an empty object. if ( acceptData( owner ) ) { @@ -4490,7 +4224,7 @@ jQuery.fn.extend( { while ( i-- ) { // Support: IE 11 only - // The attrs elements can be null (#14894) + // The attrs elements can be null (trac-14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { @@ -4913,9 +4647,9 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) + // Check state lost if the name is set (trac-11217) // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) + // `name` and `type` must use .setAttribute for WWA (trac-14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); @@ -4939,7 +4673,7 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); } )(); -// We have to close these tags to support XHTML (#13200) +// We have to close these tags to support XHTML (trac-13200) var wrapMap = { // XHTML parsers do not magically insert elements in the @@ -4965,7 +4699,7 @@ if ( !support.option ) { function getAll( context, tag ) { // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { @@ -5048,7 +4782,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { // Remember the top-level container tmp = fragment.firstChild; - // Ensure the created nodes are orphaned (#12392) + // Ensure the created nodes are orphaned (trac-12392) tmp.textContent = ""; } } @@ -5103,25 +4837,6 @@ function returnFalse() { return false; } -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - function on( elem, types, selector, data, fn, one ) { var origFn, type; @@ -5469,15 +5184,15 @@ jQuery.event = { for ( ; cur !== this; cur = cur.parentNode || this ) { - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; - // Don't conflict with Object.prototype properties (#13203) + // Don't conflict with Object.prototype properties (trac-13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { @@ -5559,7 +5274,7 @@ jQuery.event = { el.click && nodeName( el, "input" ) ) { // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); + leverageNative( el, "click", true ); } // Return false to allow normal processing in the caller @@ -5610,10 +5325,10 @@ jQuery.event = { // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { +function leverageNative( el, type, isSetup ) { - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { if ( dataPriv.get( el, type ) === undefined ) { jQuery.event.add( el, type, returnTrue ); } @@ -5625,15 +5340,13 @@ function leverageNative( el, type, expectSync ) { jQuery.event.add( el, type, { namespace: false, handler: function( event ) { - var notAsync, result, + var result, saved = dataPriv.get( this, type ); if ( ( event.isTrigger & 1 ) && this[ type ] ) { // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { + if ( !saved ) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array @@ -5642,33 +5355,22 @@ function leverageNative( el, type, expectSync ) { dataPriv.set( this, type, saved ); // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); this[ type ](); result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } + dataPriv.set( this, type, false ); + if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; + return result; } // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. @@ -5678,22 +5380,25 @@ function leverageNative( el, type, expectSync ) { // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { + } else if ( saved ) { // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; } } } ); @@ -5731,7 +5436,7 @@ jQuery.Event = function( src, props ) { // Create target properties // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) + // Target should not be a text node (trac-504, trac-13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; @@ -5832,18 +5537,73 @@ jQuery.each( { }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); + } + } else { + + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); + } + } + jQuery.event.special[ type ] = { // Utilize native event if possible so blur/focus sequence is correct setup: function() { + var attaches; + // Claim the first handler // dataPriv.set( this, "focus", ... ) // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); + leverageNative( this, type, true ); - // Return false to allow normal processing in the caller - return false; + if ( document.documentMode ) { + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // Return false to allow normal processing in the caller + return false; + } }, trigger: function() { @@ -5854,14 +5614,84 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp return true; }, - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); }, delegateType: delegateType }; + + // Support: Firefox <=44 + // Firefox doesn't have focus(in | out) events + // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + // + // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 + // focus(in | out) events fire after focus & blur events, + // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order + // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; } ); // Create mouseenter/leave events using mouseover/out and event-time checks @@ -5956,7 +5786,8 @@ var // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rcleanScript = /^\s*\s*$/g; + + rcleanScript = /^\s*\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { @@ -6070,7 +5901,7 @@ function domManip( collection, args, callback, ignored ) { // Use the original fragment for the last item // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). + // being emptied incorrectly in certain situations (trac-8070). for ( ; i < l; i++ ) { node = fragment; @@ -6092,7 +5923,7 @@ function domManip( collection, args, callback, ignored ) { if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; - // Reenable scripts + // Re-enable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion @@ -6111,6 +5942,12 @@ function domManip( collection, args, callback, ignored ) { }, doc ); } } else { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } @@ -6157,7 +5994,8 @@ jQuery.extend( { if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + // We eschew jQuery#find here for performance reasons: + // https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); @@ -6393,9 +6231,12 @@ jQuery.each( { } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); +var rcustomProp = /^--/; + + var getStyles = function( elem ) { - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; @@ -6495,7 +6336,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); } // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) + // Style of cloned element affects source element cloned (trac-8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; @@ -6539,7 +6380,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); trChild = document.createElement( "div" ); table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; // Support: Chrome 86+ // Height set through cssText does not get applied. @@ -6551,7 +6392,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); // In our bodyBackground.html iframe, // display for all div elements is set to "inline", // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block + // Ensuring the div is `display: block` // gets around this issue. trChild.style.display = "block"; @@ -6575,6 +6416,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), // Support: Firefox 51+ // Retrieving style before computed somehow @@ -6585,11 +6427,42 @@ function curCSS( elem, name, computed ) { computed = computed || getStyles( elem ); // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) + // .css('filter') (IE 9 only, trac-12537) + // .css('--customProperty) (gh-3144) if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` ret = computed.getPropertyValue( name ) || computed[ name ]; + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } @@ -6685,7 +6558,6 @@ var // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", @@ -6707,7 +6579,8 @@ function setPositiveNumber( _elem, value, subtract ) { function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, - delta = 0; + delta = 0, + marginDelta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { @@ -6717,8 +6590,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed for ( ; i < 4; i += 2 ) { // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" @@ -6769,7 +6644,7 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed ) ) || 0; } - return delta; + return delta + marginDelta; } function getWidthOrHeight( elem, dimension, extra ) { @@ -6867,26 +6742,35 @@ jQuery.extend( { // Don't automatically add "px" to these possibly-unitless properties cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true + animationIterationCount: true, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: true }, // Add in properties whose names you wish to fix before @@ -6921,15 +6805,15 @@ jQuery.extend( { if ( value !== undefined ) { type = typeof value; - // Convert "+=" or "-=" to relative numbers (#7345) + // Convert "+=" or "-=" to relative numbers (trac-7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); - // Fixes bug #9237 + // Fixes bug trac-9237 type = "number"; } - // Make sure that null and NaN values aren't set (#7116) + // Make sure that null and NaN values aren't set (trac-7116) if ( value == null || value !== value ) { return; } @@ -7553,7 +7437,7 @@ function Animation( elem, properties, options ) { remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, @@ -7943,7 +7827,6 @@ jQuery.fx.speeds = { // Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; @@ -8168,8 +8051,7 @@ jQuery.extend( { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) + // Use proper attribute retrieval (trac-12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { @@ -8273,8 +8155,7 @@ function classesToArray( value ) { jQuery.fn.extend( { addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; + var classNames, cur, curValue, className, i, finalValue; if ( isFunction( value ) ) { return this.each( function( j ) { @@ -8282,36 +8163,35 @@ jQuery.fn.extend( { } ); } - classes = classesToArray( value ); + classNames = classesToArray( value ); - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); + this.setAttribute( "class", finalValue ); } } - } + } ); } return this; }, removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; + var classNames, cur, curValue, className, i, finalValue; if ( isFunction( value ) ) { return this.each( function( j ) { @@ -8323,45 +8203,42 @@ jQuery.fn.extend( { return this.attr( "class", "" ); } - classes = classesToArray( value ); + classNames = classesToArray( value ); - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); + this.setAttribute( "class", finalValue ); } } - } + } ); } return this; }, toggleClass: function( value, stateVal ) { - var type = typeof value, + var classNames, className, i, self, + type = typeof value, isValidValue = type === "string" || Array.isArray( value ); - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( @@ -8371,17 +8248,20 @@ jQuery.fn.extend( { } ); } - return this.each( function() { - var className, i, self, classNames; + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + classNames = classesToArray( value ); + + return this.each( function() { if ( isValidValue ) { // Toggle individual class names - i = 0; self = jQuery( this ); - classNames = classesToArray( value ); - while ( ( className = classNames[ i++ ] ) ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; // Check each className given, space separated list if ( self.hasClass( className ) ) { @@ -8515,7 +8395,7 @@ jQuery.extend( { val : // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) + // option.text throws exceptions (trac-14686, trac-14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); @@ -8542,7 +8422,7 @@ jQuery.extend( { option = options[ i ]; // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) + // IE8-9 doesn't update selected after form reset (trac-2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup @@ -8616,9 +8496,39 @@ jQuery.each( [ "radio", "checkbox" ], function() { // Return jQuery for attributes-only inclusion +var location = window.location; + +var nonce = { guid: Date.now() }; +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} -support.focusin = "onfocusin" in window; + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, @@ -8685,8 +8595,8 @@ jQuery.extend( jQuery.event, { return; } - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + // Determine event propagation path in advance, per W3C events spec (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; @@ -8738,7 +8648,7 @@ jQuery.extend( jQuery.event, { acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) + // Don't do default actions on window, that's where global variables be (trac-6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method @@ -8806,85 +8716,6 @@ jQuery.fn.extend( { } ); -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - var rbracket = /\[\]$/, rCRLF = /\r?\n/g, @@ -9012,7 +8843,7 @@ var rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - // #7653, #8125, #8152: local protocol detection + // trac-7653, trac-8125, trac-8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, @@ -9035,7 +8866,7 @@ var */ transports = {}, - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin @@ -9106,7 +8937,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX // A special extend for ajax options // that takes "flat" options (not to be deep extended) -// Fixes #9887 +// Fixes trac-9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; @@ -9517,12 +9348,12 @@ jQuery.extend( { deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) + // Handle falsy url in the settings object (trac-10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); - // Alias method option to type as per ticket #12004 + // Alias method option to type as per ticket trac-12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list @@ -9565,7 +9396,7 @@ jQuery.extend( { } // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests @@ -9594,7 +9425,7 @@ jQuery.extend( { if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - // #9682: remove data so that it's not used in an eventual retry + // trac-9682: remove data so that it's not used in an eventual retry delete s.data; } @@ -9867,7 +9698,7 @@ jQuery._evalUrl = function( url, options, doc ) { return jQuery.ajax( { url: url, - // Make this explicit, since user can override this through ajaxSetup (#11264) + // Make this explicit, since user can override this through ajaxSetup (trac-11264) type: "GET", dataType: "script", cache: true, @@ -9976,7 +9807,7 @@ var xhrSuccessStatus = { 0: 200, // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 + // trac-1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); @@ -10048,7 +9879,7 @@ jQuery.ajaxTransport( function( options ) { } else { complete( - // File: protocol always yields status 0; see #8605, #14207 + // File: protocol always yields status 0; see trac-8605, trac-14207 xhr.status, xhr.statusText ); @@ -10109,7 +9940,7 @@ jQuery.ajaxTransport( function( options ) { xhr.send( options.hasContent && options.data || null ); } catch ( e ) { - // #14683: Only rethrow if this hasn't been notified as an error yet + // trac-14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } @@ -10729,7 +10560,9 @@ jQuery.fn.extend( { }, hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + return this + .on( "mouseenter", fnOver ) + .on( "mouseleave", fnOut || fnOver ); } } ); @@ -10753,7 +10586,9 @@ jQuery.each( // Support: Android <=4.0 only // Make sure we trim BOM and NBSP -var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; +// Require that the "whitespace run" starts from a non-whitespace +// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. +var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; // Bind a function to a context, optionally partially applying any // arguments. @@ -10820,7 +10655,7 @@ jQuery.isNumeric = function( obj ) { jQuery.trim = function( text ) { return text == null ? "" : - ( text + "" ).replace( rtrim, "" ); + ( text + "" ).replace( rtrim, "$1" ); }; @@ -10868,8 +10703,8 @@ jQuery.noConflict = function( deep ) { }; // Expose jQuery and $ identifiers, even in AMD -// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (#13566) +// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (trac-13566) if ( typeof noGlobal === "undefined" ) { window.jQuery = window.$ = jQuery; } diff --git a/node_modules/jquery/dist/jquery.min.js b/node_modules/jquery/dist/jquery.min.js index c4c6022f2..7f37b5d99 100644 --- a/node_modules/jquery/dist/jquery.min.js +++ b/node_modules/jquery/dist/jquery.min.js @@ -1,2 +1,2 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GASpC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAC1B,mBAAbD,EAAIE,MAIVC,EAAW,SAAmBH,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB8B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOtC,GAGC0C,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQxB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCyB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa/B,GAMrB,IAAIgC,IAAWhC,GAAO,WAAYA,GAAOA,EAAIgC,OAC5C3B,EAAOmB,EAAQxB,GAEhB,OAAKD,EAAYC,KAASG,EAAUH,KAIpB,UAATK,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAOhC,GArWhE0B,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOpD,EAAMG,KAAMT,OAKpB2D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGtD,EAAMG,KAAMT,MAIb4D,EAAM,EAAI5D,KAAM4D,EAAM5D,KAAKsD,QAAWtD,KAAM4D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAOhE,KAAKyD,cAAeK,GAM5C,OAHAC,EAAIE,WAAajE,KAGV+D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMlE,KAAMmE,IAG3BC,IAAK,SAAUD,GACd,OAAOnE,KAAK6D,UAAWb,EAAOoB,IAAKpE,KAAM,SAAUqE,EAAMlC,GACxD,OAAOgC,EAAS1D,KAAM4D,EAAMlC,EAAGkC,OAIjC/D,MAAO,WACN,OAAON,KAAK6D,UAAWvD,EAAMK,MAAOX,KAAMsE,aAG3CC,MAAO,WACN,OAAOvE,KAAKwE,GAAI,IAGjBC,KAAM,WACL,OAAOzE,KAAKwE,IAAK,IAGlBE,KAAM,WACL,OAAO1E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO7E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM9E,KAAKsD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO9E,KAAK6D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE9E,KAAM+E,IAAQ,KAG5DC,IAAK,WACJ,OAAOhF,KAAKiE,YAAcjE,KAAKyD,eAKhC7C,KAAMA,EACNqE,KAAM/E,EAAI+E,KACVC,OAAQhF,EAAIgF,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBpE,EAAYoE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASzF,KACTmC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAIvG,MAAOuG,IAGlBC,KAAM,aAENX,cAAe,SAAUrE,GACxB,IAAIiF,EAAOC,EAIX,SAAMlF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BiF,EAAQpG,EAAUmB,KASK,mBADvBkF,EAAOxF,EAAOP,KAAM8F,EAAO,gBAAmBA,EAAM9C,cACfvC,EAAWT,KAAM+F,KAAWrF,IAGlEsF,cAAe,SAAUnF,GACxB,IAAI+D,EAEJ,IAAMA,KAAQ/D,EACb,OAAO,EAER,OAAO,GAKRoF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU5C,EAAK6C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa/B,IAEjB,IADAgC,EAAShC,EAAIgC,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,WAIF,IAAMA,KAAKb,EACV,IAAgD,IAA3C6C,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,MAKH,OAAOb,GAIRqF,UAAW,SAAUzG,EAAK0G,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAP1G,IACCmD,EAAajD,OAAQF,IACzB8C,EAAOgB,MAAOD,EACE,iBAAR7D,EACN,CAAEA,GAAQA,GAGZU,EAAKH,KAAMsD,EAAK7D,IAIX6D,GAGR8C,QAAS,SAAUxC,EAAMnE,EAAKiC,GAC7B,OAAc,MAAPjC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKmE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQpG,KAAMkD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,GAMb,OAAO5G,EAAMwD,IAIdqD,KAAM,EAINhG,QAASA,IAGa,mBAAXiG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAapH,EAAKmH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC1F,SAAUC,EAAInC,GACbvE,EAAY,WAAauE,EAAO,KAAQA,EAAKoC,gBAmB/C,IAAIC,EAWJ,SAAY3H,GACZ,IAAIoC,EACHf,EACAuG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAxI,EACAyI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe5I,EAAOH,SACtBgJ,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRnH,EAAS,GAAOC,eAChBf,EAAM,GACNoJ,EAAMpJ,EAAIoJ,IACVC,EAAarJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU2I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOjL,MAAO,GAAM,MAEtC,OAAOkL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGxL,MAAO,GAAI,GAAM,KAC1BwL,EAAGE,WAAYF,EAAGxI,OAAS,GAAIvC,SAAU,IAAO,IAI3C,KAAO+K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC3L,EAAKD,MACFT,EAAMI,EAAMG,KAAMkI,EAAa6D,YACjC7D,EAAa6D,YAMdtM,EAAKyI,EAAa6D,WAAWlJ,QAAS/B,SACrC,MAAQkL,GACT7L,EAAO,CAAED,MAAOT,EAAIoD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW5I,MAAO8E,EAAQnF,EAAMG,KAAMiM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC3L,EAAW2B,EAAUA,EAAQ3B,SAAW,EAKzC,GAHAqF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAb1B,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOqF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWtD,EAEhB0I,GAAiB,CAIrB,GAAkB,KAAb/G,IAAqBuL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbvL,EAAiB,CACrB,KAAO8C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQhG,KAAMyD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQhG,KAAMyD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAlM,EAAKD,MAAOiG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAAS1L,EAAQmM,wBACzCrK,EAAQqK,uBAGR,OADA3M,EAAKD,MAAOiG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKxF,EAAQoM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAb1B,GAAqD,WAAnC2B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb3B,IACF4I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY9B,EAAQuM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAjN,EAAKD,MAAOiG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKrN,KAAMuN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK5O,EAAS0C,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIzO,EAAMwO,EAAMnH,MAAO,KACtBpF,EAAIjC,EAAIoD,OAET,MAAQnB,IACPwF,EAAKiH,WAAY1O,EAAKiC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE7H,UAAiC,IAAf8H,EAAE9H,UACnC6H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNf,EAAUsG,GAAOtG,QAAU,GAO3ByG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,GAAQA,EAAKqL,aAC5BrH,EAAUhE,IAAUA,EAAK6I,eAAiB7I,GAAOsL,gBAKlD,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOtC,GAA6B,IAAjBsC,EAAIX,UAAmBW,EAAIyN,kBAMnDtH,GADAzI,EAAWsC,GACQyN,gBACnBrH,GAAkBT,EAAOjI,GAQpB+I,GAAgB/I,IAClBiQ,EAAYjQ,EAASkQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC7K,EAAQuM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa/C,EAAS0C,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDlC,EAAQwI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BpB,EAAQkM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa/C,EAASuQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxClC,EAAQmM,uBAAyBrC,EAAQuC,KAAM7N,EAAS2N,wBAMxDnM,EAAQgP,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBnG,EAASyQ,oBAAsBzQ,EAASyQ,kBAAmBtK,GAAUzC,SAIzElC,EAAQgP,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAIpP,EAAQkM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BtP,EAAQoM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK9C,UACToP,EAAI/P,KAAMyD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAIpP,EAAQmM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELnH,EAAQoM,IAAMtC,EAAQuC,KAAM7N,EAASkO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU3H,KAAM,SAAW8I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU3H,KAAM,MAAQ8I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU3H,KAAM,OAQjBgQ,EAAQhR,EAAS0C,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU3H,KAAM,MAAQ8I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU3H,KAAM,YAMX4N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU3H,KAAM,YAKjB4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,iBAGjB2N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQhR,EAAS0C,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,OAAS8I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,WAAY,aAK7ByH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU3H,KAAM,WAAY,aAK7B4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,YAIXQ,EAAQ0P,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBpN,EAAQ+P,kBAAoBnK,EAAQvG,KAAM+N,EAAI,KAI9CxH,EAAQvG,KAAM+N,EAAI,aAClBhG,EAAc5H,KAAM,KAAMiJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE7H,SAAiB6H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI/P,YAClC8P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGjI,EAAQoQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKxJ,GAAYwJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKzJ,GAAYyJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJrH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKxJ,GAAY,EACvByJ,GAAKzJ,EAAW,EAEhB6R,GAAO,EACPH,EAAM,EACNpJ,EACErH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK/I,GAGR8H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERjD,EAAQ0P,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQvG,KAAM4D,EAAMwN,GAG9B,GAAK9N,GAAO3C,EAAQ+P,mBAInB9M,EAAKzE,UAAuC,KAA3ByE,EAAKzE,SAAS2B,SAC/B,OAAOwC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMjS,EAAU,KAAM,CAAEyE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAatD,GAC5CwI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUzE,GACtCwI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMnC,EAAOP,KAAMkH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAhB,EAAQwI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAIvG,MAAO,0CAA4CuG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB/G,EAAQgR,iBACxBlK,GAAa9G,EAAQiR,YAAczL,EAAQtG,MAAO,GAClDsG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWvR,KAAMuB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJZ,EAAW8C,EAAK9C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB8C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb9C,GAA+B,IAAbA,EAC7B,OAAO8C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMxM,MAAO,EAAG,IAGxBsK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIxM,MAAO,EAAG,IAGnBwM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASrS,QAAS,IAAKqS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIxM,MAAO,EAAG2S,GAClCnG,EAAO,GAAMoG,EAAS5S,MAAO,EAAG2S,IAI1BnG,EAAMxM,MAAO,EAAG,MAIzBgQ,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,GAASC,EAAOjT,OAAQgT,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMjJ,QAASyS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOjT,MAAO,EAAGgT,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKrB,MAAO,EAAG,GAC3BqT,EAA+B,SAArBhS,EAAKrB,OAAQ,GACvBsT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,SAEL,OAAO,EAKT2S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKV,YAAoBwN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,aACHwN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWxT,eAAgBsT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM7T,EAAS8L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASxD,QAAS0B,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASpU,QAASmU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK9C,UAC7C,OAAO,KAKTkE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOnV,EAAOoV,UAAYpV,EAAOoV,SAASD,KAC9C,OAAOA,GAAQA,EAAK5U,MAAO,KAAQ+D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASzE,EAAS0V,iBACrB1V,EAAS2V,UAAY3V,EAAS2V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK9C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR4S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa5O,KAAMuB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK9C,UAAkBwV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAa1W,KAAMyD,GACdkT,GACJnT,EAAIxD,KAAMuB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ3B,SAAW,CAAE2B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAKhX,KAAQsX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa7W,EAAS8L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvClT,EAAKD,MAAOiG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCxD,EAASwX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU3B,SAC1BiX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOhB,MAAO,KAAMgW,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACErW,MAAO,EAAG6B,EAAI,GACdzB,OAAQ,CAAEyG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOrW,MAAO6B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOrW,MAAOyE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASxW,KAAMiU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOxY,MAAO,GAGtCsY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMtY,MAAOwM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOnM,KAAQ+V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASzM,MAAO,IA4ZzCyH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYpY,KAAMkY,GAElBC,EAAgBnY,KAAMkY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWtD,GAAYsD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBtN,IACtCwI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWtD,EAAUkU,GAAQ,CAChDlN,EAAQhG,KAAMyD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUlU,KAAMyD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI7I,KAAMmG,IAM/B0S,EAAajC,GAAUiC,GAIxB1Y,EAAKD,MAAOiG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIxM,MAAO,IAC5BgD,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ3B,UAAkB+G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS3C,MAAOqW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA/V,EAAKD,MAAOiG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRxF,EAAQiR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E3E,EAAQgR,mBAAqBjK,EAG7BC,IAIAhH,EAAQoQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBxR,EAAS0C,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjErG,EAAQwI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK3H,GAILiD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK9C,SACtC,GAAuB,IAAlB8C,EAAK9C,SAAiB,CAC1B,GAAK0Y,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ/T,KAAMyD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE7Y,UAAkB6Y,IAAM/V,GAC9BsQ,EAAQ/T,KAAMwZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAExB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG9D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKvT,EAAYmZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU/Z,KAAM4D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUjZ,SACPyB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCxD,EAAQJ,KAAM+Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK9C,SACxByB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK9C,aAIdyB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM9E,KAAKsD,OACXmX,EAAOza,KAER,GAAyB,iBAAbiD,EACX,OAAOjD,KAAK6D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKnC,MAChC,OAAO,KAQX,IAFA+D,EAAM/D,KAAK6D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRva,KAIoB,iBAAbiD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOjD,KAQR,GAHAoV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BjD,KAAKyD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAOhE,KAAMgD,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ3B,SAAW2B,EAAQgK,eAAiBhK,EAAUtD,GACjE,IAII0a,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT7B,EAAYrB,KAAM8M,IACtB9M,KAAM8M,GAAS5J,EAAS4J,IAIxB9M,KAAK+R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO9M,KAYP,OARAqE,EAAOzE,EAASwN,eAAgBN,EAAO,OAKtC9M,KAAM,GAAMqE,EACZrE,KAAKsD,OAAS,GAERtD,KAcH,OAAKiD,EAAS1B,UACpBvB,KAAM,GAAMiD,EACZjD,KAAKsD,OAAS,EACPtD,MAIIqB,EAAY4B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUjD,QAIhCuD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQpD,GAGrB,IAAIib,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAIvN,UACpC,OAAOuN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQzF,MAC7Bob,EAAID,EAAQ7X,OAEb,OAAOtD,KAAKsQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUzI,KAAMmb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAIpb,KAAKsD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM9O,KAAMmC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAIvN,SAAW,KAAQ4Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAIvN,UACHyB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ/T,KAAMkO,GACd,MAMJ,OAAO9O,KAAK6D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJxD,EAAQJ,KAAMuC,EAAQqB,GAAQrE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBqE,EAAKb,OAASa,EAAM,GAAMA,GAZjBrE,KAAM,IAAOA,KAAM,GAAI4C,WAAe5C,KAAKuE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOlD,KAAK6D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAOhE,KAAK2D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOjD,KAAKwb,IAAiB,MAAZvY,EAChBjD,KAAKiE,WAAajE,KAAKiE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO5S,SAAkB4S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT5b,EAAUkE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKpE,KAAMmD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK/E,OAAQ,KACjB2C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd3U,KAAKsD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHjc,KAAK6D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS9F,EAAcsb,EAASxV,EAAMyV,SAC1CD,EAAOlc,KAAM0G,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS9F,EAAcsb,EAASxV,EAAM2V,MACjDH,EAAOlc,KAAM0G,EAAOqV,EAASC,GAQ7BD,EAAQ7b,WAAOmF,EAAW,CAAEqB,GAAQ7G,MAAOoc,IAM3C,MAAQvV,GAITsV,EAAO9b,WAAOmF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc7c,MAAOyc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM3c,KAAMwc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B7F,EAAY6F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK5I,KAAMsG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKzd,MAIR4d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIxd,MAKR+U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDxJ,MAMR6d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTpd,MAERoM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVpd,MAERsd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQlU,MAAQkU,EAAKlU,QAAUkU,GAC9C+I,EAAM3c,KAAM4T,GACN2I,GACLM,KAGKzd,MAIRyd,KAAM,WAEL,OADAhD,EAAKsD,SAAU/d,KAAMsE,WACdtE,MAIRqd,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BtE,MAERse,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK9B,EAAYmd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGxC,MAAOX,KAAMsE,WAChCqa,GAAYtd,EAAYsd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtB1e,KACAmD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOpf,KACVwU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQhO,MAAOye,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLzb,EAAYyb,GAGXqC,EACJrC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC9f,EAAO+f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY2d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAYyd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY0d,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUtb,GAClB,OAAc,MAAPA,EAAc0B,EAAOmC,OAAQ7D,EAAKsb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAU1e,OAASqe,OAAWvY,EAAY9F,KAAMsE,WAChEtE,MAMRqe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKxd,KAAM4d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB9f,EAAMG,KAAM6D,WAG5B+b,EAAUrd,EAAOgb,WAGjBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMnC,KACvBogB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAahD,EAAMG,KAAM6D,WAAc6C,IAC5D+Y,GACTG,EAAQb,YAAaW,EAAiBC,KAM1C,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAQxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAQ5D,QACxEyD,GAGuB,YAApBG,EAAQlC,SACZ9c,EAAY+e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAQvD,OAKjB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAQ5D,QAG1D,OAAO4D,EAAQzD,aAOjB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CzgB,EAAO0gB,SAAW1gB,EAAO0gB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9EtF,EAAO0gB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCrG,EAAO+f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRlhB,EAASmhB,oBAAqB,mBAAoBD,GAClD/gB,EAAOghB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBpG,MAGRgD,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa5f,EAAU,CAAEoD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBld,EAASshB,YACa,YAAxBthB,EAASshB,aAA6BthB,EAAS+P,gBAAgBwR,SAGjEphB,EAAO+f,WAAY9c,EAAO4X,QAK1Bhb,EAASoQ,iBAAkB,mBAAoB8Q,GAG/C/gB,EAAOiQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAENhgB,EAAY8F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAG1C,KAAMqD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK/gB,KAAMuC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EAChBpa,EACAA,EAAM1G,KAAMqD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAMhD,OAAKkT,EACGvd,EAIH0d,EACGre,EAAG1C,KAAMqD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM5gB,UAAqC,IAAnB4gB,EAAM5gB,YAAsB4gB,EAAM5gB,UAMlE,SAAS6gB,IACRpiB,KAAK+F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOniB,KAAK+F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,SAAYoB,EAMxB/G,OAAOkiB,eAAgBH,EAAOniB,KAAK+F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQlO,KAAKkO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNnO,KAAKkO,MAAOiU,GAGZA,EAAOniB,KAAK+F,UAAaoc,EAAOniB,KAAK+F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElCnH,KAAK2D,IAAKwe,EAAOhU,IASzBnO,KAAKwiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOniB,KAAK+F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,cAAYD,SAEjBqc,EAAOniB,KAAK+F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOniB,KAAK+F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK9C,SAI/B,GAHA8D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOrE,KAAM,GACb0O,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKnO,KAAKsD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK9C,WAAmBqhB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRxE,QAAS,WAClBwE,EAAO2c,EAAW3c,EAAK/E,MAAO,IAC9B0iB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJnO,KAAKkE,KAAM,WACjB2e,EAASL,IAAKxiB,KAAMmO,KAIfiT,EAAQphB,KAAM,SAAUmH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDziB,KAAKkE,KAAM,WAGV2e,EAASL,IAAKxiB,KAAMmO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOnO,KAAKkE,KAAM,WACjB2e,EAASjF,OAAQ5d,KAAMmO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM3c,KAAM6hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAG1C,KAAM4D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOvd,KAAM,GAAK2B,QAGjBmE,IAAT2c,EACNziB,KACAA,KAAKkE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOvd,KAAM2B,EAAM8gB,GAGtCzf,EAAOygB,YAAazjB,KAAM2B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAAStjB,KAAM2B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO3B,KAAKkE,KAAM,WACjBlB,EAAOsgB,QAAStjB,KAAM2B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO3B,KAAKud,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAML,GACxB,IAAIqP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW9R,KACXmC,EAAInC,KAAKsD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXL,EAAMK,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAAStb,MAGxB,IAAIyiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB/P,EAAS+P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK9C,WAClByB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUtlB,MAAM,IAExB0lB,KAAM,WACL,OAAOJ,GAAUtlB,OAElB2lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQne,KAAKulB,OAASvlB,KAAK0lB,OAG5B1lB,KAAKkE,KAAM,WACZogB,GAAoBtkB,MACxBgD,EAAQhD,MAAOulB,OAEfviB,EAAQhD,MAAO0lB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADchmB,EAASomB,yBACRrjB,YAAa/C,EAAS0C,cAAe,SACpDsO,GAAQhR,EAAS0C,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBxP,EAAQ6kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBzP,EAAQ+kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBzP,EAAQglB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfrlB,EAAQglB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK9C,SAAW,CAAE8C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM/mB,KAAMsC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ3mB,KAAMyD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQzmB,KAAMyD,GAMlB,OAAOqjB,EAIR,IAAII,GAAiB,sBAErB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY5jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOzE,EAAS0V,cACf,MAAQ4S,KATQC,KAAqC,UAATxmB,GAY/C,SAASymB,GAAI/jB,EAAMgkB,EAAOplB,EAAUwf,EAAMtf,EAAImlB,GAC7C,IAAIC,EAAQ5mB,EAGZ,GAAsB,iBAAV0mB,EAAqB,CAShC,IAAM1mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEuiB,EACbD,GAAI/jB,EAAM1C,EAAMsB,EAAUwf,EAAM4F,EAAO1mB,GAAQ2mB,GAEhD,OAAOjkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK6kB,QACC,IAAM7kB,EACZ,OAAOkB,EAeR,OAZa,IAARikB,IACJC,EAASplB,GACTA,EAAK,SAAUqlB,GAId,OADAxlB,IAASylB,IAAKD,GACPD,EAAO5nB,MAAOX,KAAMsE,aAIzB8C,KAAOmhB,EAAOnhB,OAAUmhB,EAAOnhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAOwlB,MAAMhN,IAAKxb,KAAMqoB,EAAOllB,EAAIsf,EAAMxf,KA+a3C,SAASylB,GAAgBla,EAAI7M,EAAMsmB,GAG5BA,GAQNrF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU6Z,GAClB,IAAIG,EAAUpV,EACbqV,EAAQhG,EAASjf,IAAK3D,KAAM2B,GAE7B,GAAyB,EAAlB6mB,EAAMK,WAAmB7oB,KAAM2B,IAKrC,GAAMinB,EAAMtlB,QAuCEN,EAAOwlB,MAAMrJ,QAASxd,IAAU,IAAKmnB,cAClDN,EAAMO,uBArBN,GAdAH,EAAQtoB,EAAMG,KAAM6D,WACpBse,EAASJ,IAAKxiB,KAAM2B,EAAMinB,GAK1BD,EAAWV,EAAYjoB,KAAM2B,GAC7B3B,KAAM2B,KAEDinB,KADLrV,EAASqP,EAASjf,IAAK3D,KAAM2B,KACJgnB,EACxB/F,EAASJ,IAAKxiB,KAAM2B,GAAM,GAE1B4R,EAAS,GAELqV,IAAUrV,EAWd,OARAiV,EAAMQ,2BACNR,EAAMS,iBAOC1V,GAAUA,EAAOpM,WAefyhB,EAAMtlB,SAGjBsf,EAASJ,IAAKxiB,KAAM2B,EAAM,CACzBwF,MAAOnE,EAAOwlB,MAAMU,QAInBlmB,EAAOmC,OAAQyjB,EAAO,GAAK5lB,EAAOmmB,MAAM5lB,WACxCqlB,EAAMtoB,MAAO,GACbN,QAKFwoB,EAAMQ,qCA/E0BljB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAMomB,IA5a/B/kB,EAAOwlB,MAAQ,CAEdhpB,OAAQ,GAERgc,IAAK,SAAUnX,EAAMgkB,EAAO1Z,EAAS8T,EAAMxf,GAE1C,IAAImmB,EAAaC,EAAa1Y,EAC7B2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADAya,EAAcza,GACQA,QACtB1L,EAAWmmB,EAAYnmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfkiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASlpB,OAAOypB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUrd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAOwlB,MAAMuB,YAActd,EAAE9K,KACpEqB,EAAOwlB,MAAMwB,SAASrpB,MAAO0D,EAAMC,gBAAcwB,IAMpDyjB,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAEP5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,EAGjEwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1C6nB,EAAYxmB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNgoB,SAAUA,EACVlH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWia,EAAW7b,KAAM,MAC1Bub,IAGKK,EAAWH,EAAQ3nB,OAC1B8nB,EAAWH,EAAQ3nB,GAAS,IACnBuoB,cAAgB,EAGnB/K,EAAQgL,QACiD,IAA9DhL,EAAQgL,MAAM1pB,KAAM4D,EAAMoe,EAAMiH,EAAYL,IAEvChlB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM0nB,IAK3BlK,EAAQ3D,MACZ2D,EAAQ3D,IAAI/a,KAAM4D,EAAMmlB,GAElBA,EAAU7a,QAAQvH,OACvBoiB,EAAU7a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJwmB,EAASvkB,OAAQukB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS7oB,KAAM4oB,GAIhBxmB,EAAOwlB,MAAMhpB,OAAQmC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMgkB,EAAO1Z,EAAS1L,EAAUmnB,GAEjD,IAAIrlB,EAAGslB,EAAW1Z,EACjB2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMulB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAMP,GAJA5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAE1C8nB,EAAWH,EADX3nB,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAG9Dwc,EAAYtlB,EAAI0kB,EAASnmB,OACzB,MAAQyB,IACPykB,EAAYC,EAAU1kB,IAEfqlB,GAAeT,IAAaH,EAAUG,UACzChb,GAAWA,EAAQvH,OAASoiB,EAAUpiB,MACtCuJ,IAAOA,EAAIlD,KAAM+b,EAAU/Z,YAC3BxM,GAAYA,IAAaumB,EAAUvmB,WACxB,OAAbA,IAAqBumB,EAAUvmB,YAChCwmB,EAASvkB,OAAQH,EAAG,GAEfykB,EAAUvmB,UACdwmB,EAASS,gBAEL/K,EAAQvB,QACZuB,EAAQvB,OAAOnd,KAAM4D,EAAMmlB,IAOzBa,IAAcZ,EAASnmB,SACrB6b,EAAQmL,WACkD,IAA/DnL,EAAQmL,SAAS7pB,KAAM4D,EAAMqlB,EAAYE,EAASE,SAElD9mB,EAAOunB,YAAalmB,EAAM1C,EAAMioB,EAASE,eAGnCR,EAAQ3nB,SA1Cf,IAAMA,KAAQ2nB,EACbtmB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,EAAO0mB,EAAOkB,GAAK5a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe6iB,IAC1B1G,EAAShF,OAAQvZ,EAAM,mBAIzB2lB,SAAU,SAAUQ,GAEnB,IAAIroB,EAAG4C,EAAGhB,EAAK4Q,EAAS6U,EAAWiB,EAClCjW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BklB,EAAQxlB,EAAOwlB,MAAMkC,IAAKF,GAE1Bf,GACC7G,EAASjf,IAAK3D,KAAM,WAAcI,OAAOypB,OAAQ,OAC/CrB,EAAM7mB,OAAU,GACnBwd,EAAUnc,EAAOwlB,MAAMrJ,QAASqJ,EAAM7mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMgU,EAENrmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAqmB,EAAMmC,eAAiB3qB,MAGlBmf,EAAQyL,cAA2D,IAA5CzL,EAAQyL,YAAYnqB,KAAMT,KAAMwoB,GAA5D,CAKAiC,EAAeznB,EAAOwlB,MAAMiB,SAAShpB,KAAMT,KAAMwoB,EAAOiB,GAGxDtnB,EAAI,EACJ,OAAUwS,EAAU8V,EAActoB,QAAYqmB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBnW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAUykB,EAAY7U,EAAQ8U,SAAU1kB,QACtCyjB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAU/Z,YACnC+Y,EAAMwC,WAAWvd,KAAM+b,EAAU/Z,aAEjC+Y,EAAMgB,UAAYA,EAClBhB,EAAM/F,KAAO+G,EAAU/G,UAKV3c,KAHb/B,IAAUf,EAAOwlB,MAAMrJ,QAASqK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU7a,SAAUhO,MAAOgU,EAAQtQ,KAAMmQ,MAGT,KAAzBgU,EAAMjV,OAASxP,KACrBykB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK5J,EAAQ8L,cACZ9L,EAAQ8L,aAAaxqB,KAAMT,KAAMwoB,GAG3BA,EAAMjV,SAGdkW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAItnB,EAAGqnB,EAAWvX,EAAKiZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBpb,EAAM0Z,EAAM/iB,OAGb,GAAKykB,GAIJpb,EAAIvN,YAOc,UAAfinB,EAAM7mB,MAAoC,GAAhB6mB,EAAMxS,QAEnC,KAAQlH,IAAQ9O,KAAM8O,EAAMA,EAAIlM,YAAc5C,KAI7C,GAAsB,IAAjB8O,EAAIvN,WAAoC,UAAfinB,EAAM7mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFA8e,EAAkB,GAClBC,EAAmB,GACbhpB,EAAI,EAAGA,EAAI+nB,EAAe/nB,SAME2D,IAA5BqlB,EAFLlZ,GAHAuX,EAAYC,EAAUtnB,IAGNc,SAAW,OAG1BkoB,EAAkBlZ,GAAQuX,EAAU1e,cACC,EAApC9H,EAAQiP,EAAKjS,MAAOsb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKjS,KAAM,KAAM,CAAE8O,IAAQxL,QAErC6nB,EAAkBlZ,IACtBiZ,EAAgBtqB,KAAM4oB,GAGnB0B,EAAgB5nB,QACpBmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUyB,IAY9C,OALApc,EAAM9O,KACDkqB,EAAgBT,EAASnmB,QAC7BmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUA,EAASnpB,MAAO4pB,KAGpDO,GAGRW,QAAS,SAAU/lB,EAAMgmB,GACxBjrB,OAAOkiB,eAAgBtf,EAAOmmB,MAAM5lB,UAAW8B,EAAM,CACpDimB,YAAY,EACZ/I,cAAc,EAEd5e,IAAKtC,EAAYgqB,GAChB,WACC,GAAKrrB,KAAKurB,cACT,OAAOF,EAAMrrB,KAAKurB,gBAGpB,WACC,GAAKvrB,KAAKurB,cACT,OAAOvrB,KAAKurB,cAAelmB,IAI9Bmd,IAAK,SAAUrb,GACd/G,OAAOkiB,eAAgBtiB,KAAMqF,EAAM,CAClCimB,YAAY,EACZ/I,cAAc,EACdiJ,UAAU,EACVrkB,MAAOA,QAMXujB,IAAK,SAAUa,GACd,OAAOA,EAAevoB,EAAO+C,SAC5BwlB,EACA,IAAIvoB,EAAOmmB,MAAOoC,IAGpBpM,QAAS,CACRsM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU1H,GAIhB,IAAIjU,EAAKxO,MAAQyiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAG1Bka,GAAgBla,EAAI,QAASuZ,KAIvB,GAERmB,QAAS,SAAUzG,GAIlB,IAAIjU,EAAKxO,MAAQyiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAE1Bka,GAAgBla,EAAI,UAId,GAKRkY,SAAU,SAAU8B,GACnB,IAAI/iB,EAAS+iB,EAAM/iB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOkmB,OAAStf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBmmB,aAAc,CACbX,aAAc,SAAUzC,QAID1iB,IAAjB0iB,EAAMjV,QAAwBiV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMjV,YAoG7CvQ,EAAOunB,YAAc,SAAUlmB,EAAM1C,EAAMmoB,GAGrCzlB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMmoB,IAIlC9mB,EAAOmmB,MAAQ,SAAUvnB,EAAKkqB,GAG7B,KAAQ9rB,gBAAgBgD,EAAOmmB,OAC9B,OAAO,IAAInmB,EAAOmmB,MAAOvnB,EAAKkqB,GAI1BlqB,GAAOA,EAAID,MACf3B,KAAKurB,cAAgB3pB,EACrB5B,KAAK2B,KAAOC,EAAID,KAIhB3B,KAAK+rB,mBAAqBnqB,EAAIoqB,uBACHlmB,IAAzBlE,EAAIoqB,mBAGgB,IAApBpqB,EAAIiqB,YACL9D,GACAC,GAKDhoB,KAAKyF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOlE,SACxCK,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELzF,KAAK8qB,cAAgBlpB,EAAIkpB,cACzB9qB,KAAKisB,cAAgBrqB,EAAIqqB,eAIzBjsB,KAAK2B,KAAOC,EAIRkqB,GACJ9oB,EAAOmC,OAAQnF,KAAM8rB,GAItB9rB,KAAKksB,UAAYtqB,GAAOA,EAAIsqB,WAAaxjB,KAAKyjB,MAG9CnsB,KAAMgD,EAAO+C,UAAY,GAK1B/C,EAAOmmB,MAAM5lB,UAAY,CACxBE,YAAaT,EAAOmmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAIxc,EAAIzM,KAAKurB,cAEbvrB,KAAK+rB,mBAAqBhE,GAErBtb,IAAMzM,KAAKosB,aACf3f,EAAEwc,kBAGJF,gBAAiB,WAChB,IAAItc,EAAIzM,KAAKurB,cAEbvrB,KAAK6qB,qBAAuB9C,GAEvBtb,IAAMzM,KAAKosB,aACf3f,EAAEsc,mBAGJC,yBAA0B,WACzB,IAAIvc,EAAIzM,KAAKurB,cAEbvrB,KAAK+qB,8BAAgChD,GAEhCtb,IAAMzM,KAAKosB,aACf3f,EAAEuc,2BAGHhpB,KAAK+oB,oBAKP/lB,EAAOkB,KAAM,CACZmoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRjrB,MAAM,EACNkrB,UAAU,EACV/e,KAAK,EACLgf,SAAS,EACTnX,QAAQ,EACRoX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EACTC,OAAO,GACLhrB,EAAOwlB,MAAM4C,SAEhBpoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUtsB,EAAMmnB,GACpE9lB,EAAOwlB,MAAMrJ,QAASxd,GAAS,CAG9BwoB,MAAO,WAQN,OAHAzB,GAAgB1oB,KAAM2B,EAAMsmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB1oB,KAAM2B,IAGf,GAKR+kB,SAAU,WACT,OAAO,GAGRoC,aAAcA,KAYhB9lB,EAAOkB,KAAM,CACZgqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB1nB,EAAOwlB,MAAMrJ,QAASmP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAIzkB,EAEHwqB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTvuB,MAMgCgD,EAAOyF,SANvCzI,KAMyDuuB,MAClE/F,EAAM7mB,KAAO6nB,EAAUG,SACvB5lB,EAAMylB,EAAU7a,QAAQhO,MAAOX,KAAMsE,WACrCkkB,EAAM7mB,KAAO+oB,GAEP3mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBijB,GAAI,SAAUC,EAAOplB,EAAUwf,EAAMtf,GACpC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,IAEzCmlB,IAAK,SAAUD,EAAOplB,EAAUwf,EAAMtf,GACrC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,EAAI,IAE7CslB,IAAK,SAAUJ,EAAOplB,EAAUE,GAC/B,IAAIqmB,EAAW7nB,EACf,GAAK0mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClBxmB,EAAQqlB,EAAMsC,gBAAiBlC,IAC9Be,EAAU/Z,UACT+Z,EAAUG,SAAW,IAAMH,EAAU/Z,UACrC+Z,EAAUG,SACXH,EAAUvmB,SACVumB,EAAU7a,SAEJ3O,KAER,GAAsB,iBAAVqoB,EAAqB,CAGhC,IAAM1mB,KAAQ0mB,EACbroB,KAAKyoB,IAAK9mB,EAAMsB,EAAUolB,EAAO1mB,IAElC,OAAO3B,KAWR,OATkB,IAAbiD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK6kB,IAEChoB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAM5K,OAAQ5d,KAAMqoB,EAAOllB,EAAIF,QAMzC,IAKCurB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBtqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQza,SAAkBya,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASuqB,GAAevqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAASwqB,GAAexqB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKrB,MAAO,EAAG,GAClC+D,EAAK1C,KAAO0C,EAAK1C,KAAKrB,MAAO,GAE7B+D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAASyqB,GAAgBltB,EAAKmtB,GAC7B,IAAI5sB,EAAGiZ,EAAGzZ,EAAgBqtB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKxtB,SAAV,CAKA,GAAKqhB,EAASD,QAAS/gB,KAEtB0nB,EADW1G,EAASjf,IAAK/B,GACP0nB,QAKjB,IAAM3nB,KAFNihB,EAAShF,OAAQmR,EAAM,iBAETzF,EACb,IAAMnnB,EAAI,EAAGiZ,EAAIkO,EAAQ3nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAOwlB,MAAMhN,IAAKuT,EAAMptB,EAAM2nB,EAAQ3nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBotB,EAAWnM,EAASzB,OAAQxf,GAC5BqtB,EAAWjsB,EAAOmC,OAAQ,GAAI6pB,GAE9BnM,EAASL,IAAKuM,EAAME,KAkBtB,SAASC,GAAUC,EAAY3a,EAAMrQ,EAAUojB,GAG9C/S,EAAOjU,EAAMiU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAAS+H,EAAYntB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAI+T,EAAW7rB,OACf+rB,EAAWjU,EAAI,EACfjU,EAAQqN,EAAM,GACd8a,EAAkBjuB,EAAY8F,GAG/B,GAAKmoB,GACG,EAAJlU,GAA0B,iBAAVjU,IAChB/F,EAAQ6kB,YAAcwI,GAAShhB,KAAMtG,GACxC,OAAOgoB,EAAWjrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO0U,EAAW3qB,GAAI8W,GACrBgU,IACJ9a,EAAM,GAAMrN,EAAM1G,KAAMT,KAAMsb,EAAOb,EAAK8U,SAE3CL,GAAUzU,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM2a,EAAY,GAAIjiB,eAAe,EAAOiiB,EAAY5H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA6H,GADA/H,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYkH,KAC/BtrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMktB,IACVptB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BmtB,GAIJpsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAAS1D,KAAM0uB,EAAYhtB,GAAKF,EAAME,GAGvC,GAAKitB,EAOJ,IANAltB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAASwH,IAGf1sB,EAAI,EAAGA,EAAIitB,EAAYjtB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAOwsB,WAAavtB,EAAKH,UAC7BkB,EAAOwsB,SAAUvtB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAASwoB,GAAc,IAAMzsB,EAAMC,IAQnE,OAAOitB,EAGR,SAASvR,GAAQvZ,EAAMpB,EAAUwsB,GAKhC,IAJA,IAAIxtB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCstB,GAA8B,IAAlBxtB,EAAKV,UACtByB,EAAO0sB,UAAW/I,GAAQ1kB,IAGtBA,EAAKW,aACJ6sB,GAAYtL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU2H,GACxB,OAAOA,GAGR/pB,MAAO,SAAUnB,EAAMsrB,EAAeC,GACrC,IAAIztB,EAAGiZ,EAAGyU,EAAaC,EApINluB,EAAKmtB,EACnB1iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB6J,EAAS5L,GAAY9f,GAGtB,KAAMjD,EAAQ+kB,gBAAsC,IAAlB9hB,EAAK9C,UAAoC,KAAlB8C,EAAK9C,UAC3DyB,EAAO8W,SAAUzV,IAMnB,IAHAyrB,EAAenJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFbyU,EAAclJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLiuB,EAAa1tB,GAjJH4sB,EAiJQe,EAAc3tB,QAhJzCkK,EAGc,WAHdA,EAAW0iB,EAAK1iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDotB,EAAKpZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC0iB,EAAKnV,aAAehY,EAAIgY,cA6IxB,GAAK+V,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAelJ,GAAQtiB,GACrCyrB,EAAeA,GAAgBnJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAIyU,EAAYvsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C2sB,GAAgBe,EAAa1tB,GAAK2tB,EAAc3tB,SAGjD2sB,GAAgBzqB,EAAMmB,GAWxB,OAL2B,GAD3BsqB,EAAenJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAekJ,GAAeC,GAAUpJ,GAAQtiB,EAAM,WAIhDmB,GAGRkqB,UAAW,SAAU5rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAOwlB,MAAMrJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK6G,OACT,IAAM3nB,KAAQ8gB,EAAK6G,OACbnK,EAASxd,GACbqB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,GAI3BqB,EAAOunB,YAAalmB,EAAM1C,EAAM8gB,EAAKqH,QAOxCzlB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB6qB,OAAQ,SAAU/sB,GACjB,OAAO2a,GAAQ5d,KAAMiD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ5d,KAAMiD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMvC,MACbA,KAAK8V,QAAQ5R,KAAM,WACK,IAAlBlE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKsS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B2sB,OAAQ,WACP,OAAOf,GAAUlvB,KAAMsE,UAAW,SAAUD,GACpB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CotB,GAAoB3uB,KAAMqE,GAChC1B,YAAa0B,MAKvB6rB,QAAS,WACR,OAAOhB,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIkE,EAASkpB,GAAoB3uB,KAAMqE,GACvCoB,EAAO0qB,aAAc9rB,EAAMoB,EAAO8M,gBAKrC6d,OAAQ,WACP,OAAOlB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,SAKvCqwB,MAAO,WACN,OAAOnB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,KAAKiP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOrE,KAAMmC,IAAeA,IACd,IAAlBkC,EAAK9C,WAGTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOtS,MAGRwF,MAAO,SAAUmqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD5vB,KAAKoE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOxF,KAAM2vB,EAAeC,MAI5CL,KAAM,SAAUpoB,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,IAAI9C,EAAOrE,KAAM,IAAO,GACvBmC,EAAI,EACJiZ,EAAIpb,KAAKsD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK9C,SAChC,OAAO8C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBqnB,GAAa/gB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOrE,KAAMmC,IAAO,IAGVZ,WACTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJrE,KAAK8V,QAAQma,OAAQ9oB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BgtB,YAAa,WACZ,IAAI/I,EAAU,GAGd,OAAO2H,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,IAAI8P,EAASnU,KAAK4C,WAEbI,EAAO6D,QAAS7G,KAAMunB,GAAY,IACtCvkB,EAAO0sB,UAAW/I,GAAQ3mB,OACrBmU,GACJA,EAAOoc,aAAclsB,EAAMrE,QAK3BunB,MAILvkB,EAAOkB,KAAM,CACZssB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUtrB,EAAMurB,GAClB5tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACN8sB,EAAS7tB,EAAQC,GACjBwB,EAAOosB,EAAOvtB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOzE,KAAOA,KAAKwF,OAAO,GACxCxC,EAAQ6tB,EAAQ1uB,IAAOyuB,GAAY9sB,GAInClD,EAAKD,MAAOoD,EAAKD,EAAMH,OAGxB,OAAO3D,KAAK6D,UAAWE,MAGzB,IAAI+sB,GAAY,IAAI/mB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDgN,GAAY,SAAU1sB,GAKxB,IAAI2oB,EAAO3oB,EAAK6I,cAAc4C,YAM9B,OAJMkd,GAASA,EAAKgE,SACnBhE,EAAOjtB,GAGDitB,EAAKiE,iBAAkB5sB,IAG5B6sB,GAAO,SAAU7sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACR8rB,EAAM,GAGP,IAAM9rB,KAAQD,EACb+rB,EAAK9rB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAAS1D,KAAM4D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAAS8rB,EAAK9rB,GAG3B,OAAOtB,GAIJqtB,GAAY,IAAIrnB,OAAQma,GAAUrW,KAAM,KAAO,KAiJnD,SAASwjB,GAAQhtB,EAAMgB,EAAMisB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU1tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCA+M,EAAWA,GAAYP,GAAW1sB,MAQpB,MAFbN,EAAMutB,EAASI,iBAAkBrsB,IAAUisB,EAAUjsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBjE,EAAQuwB,kBAAoBb,GAAUrjB,KAAM1J,IAASqtB,GAAU3jB,KAAMpI,KAG1EksB,EAAQhN,EAAMgN,MACdC,EAAWjN,EAAMiN,SACjBC,EAAWlN,EAAMkN,SAGjBlN,EAAMiN,SAAWjN,EAAMkN,SAAWlN,EAAMgN,MAAQxtB,EAChDA,EAAMutB,EAASC,MAGfhN,EAAMgN,MAAQA,EACdhN,EAAMiN,SAAWA,EACjBjN,EAAMkN,SAAWA,SAIJ3rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS6tB,GAAcC,EAAaC,GAGnC,MAAO,CACNnuB,IAAK,WACJ,IAAKkuB,IASL,OAAS7xB,KAAK2D,IAAMmuB,GAASnxB,MAAOX,KAAMsE,kBALlCtE,KAAK2D,OA3MhB,WAIC,SAASouB,IAGR,GAAMnM,EAAN,CAIAoM,EAAUzN,MAAM0N,QAAU,+EAE1BrM,EAAIrB,MAAM0N,QACT,4HAGDtiB,GAAgBhN,YAAaqvB,GAAYrvB,YAAaijB,GAEtD,IAAIsM,EAAWnyB,EAAOkxB,iBAAkBrL,GACxCuM,EAAoC,OAAjBD,EAASniB,IAG5BqiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD1M,EAAIrB,MAAMgO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD3L,EAAIrB,MAAMmO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoBzM,EAAIgN,YAAc,GAEzDjjB,GAAgB9M,YAAamvB,GAI7BpM,EAAM,MAGP,SAASyM,EAAoBQ,GAC5B,OAAO7sB,KAAK8sB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYpyB,EAAS0C,cAAe,OACpCsjB,EAAMhmB,EAAS0C,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM0O,eAAiB,cAC3BrN,EAAIM,WAAW,GAAO3B,MAAM0O,eAAiB,GAC7C7xB,EAAQ8xB,gBAA+C,gBAA7BtN,EAAIrB,MAAM0O,eAEpCjwB,EAAOmC,OAAQ/D,EAAS,CACvB+xB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAYRY,qBAAsB,WACrB,IAAIC,EAAOhN,EAAIiN,EAASC,EAmCxB,OAlCgC,MAA3BV,IACJQ,EAAQ5zB,EAAS0C,cAAe,SAChCkkB,EAAK5mB,EAAS0C,cAAe,MAC7BmxB,EAAU7zB,EAAS0C,cAAe,OAElCkxB,EAAMjP,MAAM0N,QAAU,2DACtBzL,EAAGjC,MAAM0N,QAAU,mBAKnBzL,EAAGjC,MAAMoP,OAAS,MAClBF,EAAQlP,MAAMoP,OAAS,MAQvBF,EAAQlP,MAAMC,QAAU,QAExB7U,GACEhN,YAAa6wB,GACb7wB,YAAa6jB,GACb7jB,YAAa8wB,GAEfC,EAAU3zB,EAAOkxB,iBAAkBzK,GACnCwM,EAA4BY,SAAUF,EAAQC,OAAQ,IACrDC,SAAUF,EAAQG,eAAgB,IAClCD,SAAUF,EAAQI,kBAAmB,MAAWtN,EAAGuN,aAEpDpkB,GAAgB9M,YAAa2wB,IAEvBR,MAvIV,GAsNA,IAAIgB,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAar0B,EAAS0C,cAAe,OAAQiiB,MAC7C2P,GAAc,GAkBf,SAASC,GAAe9uB,GACvB,IAAI+uB,EAAQpxB,EAAOqxB,SAAUhvB,IAAU6uB,GAAa7uB,GAEpD,OAAK+uB,IAGA/uB,KAAQ4uB,GACL5uB,EAED6uB,GAAa7uB,GAxBrB,SAAyBA,GAGxB,IAAIivB,EAAUjvB,EAAM,GAAI0c,cAAgB1c,EAAK/E,MAAO,GACnD6B,EAAI6xB,GAAY1wB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO2uB,GAAa7xB,GAAMmyB,KACbL,GACZ,OAAO5uB,EAeoBkvB,CAAgBlvB,IAAUA,GAIxD,IAKCmvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAEhC,SAAU,WAAYiC,WAAY,SAAUnQ,QAAS,SACjEoQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBnwB,EAAOuC,EAAO6tB,GAIzC,IAAIhuB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKivB,IAAK,EAAGjuB,EAAS,IAAQguB,GAAY,KAAUhuB,EAAS,IAAO,MACpEG,EAGF,SAAS+tB,GAAoB7wB,EAAM8wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAIpzB,EAAkB,UAAdgzB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQlzB,EAAI,EAAGA,GAAK,EAGN,WAARizB,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM+wB,EAAMlR,GAAW/hB,IAAK,EAAMmzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,IAIjD,WAARF,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,MAtBvEG,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,GAGhD,YAARF,EACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,GAItEE,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASzvB,KAAKivB,IAAK,EAAGjvB,KAAK0vB,KAC1BrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEi1B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBtxB,EAAM8wB,EAAWK,GAG3C,IAAIF,EAASvE,GAAW1sB,GAKvBgxB,IADmBj0B,EAAQ+xB,qBAAuBqC,IAEE,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCM,EAAmBP,EAEnBjzB,EAAMivB,GAAQhtB,EAAM8wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,GAIzE,GAAKwwB,GAAUrjB,KAAMrL,GAAQ,CAC5B,IAAMozB,EACL,OAAOpzB,EAERA,EAAM,OAyCP,QAlCQhB,EAAQ+xB,qBAAuBkC,IAMrCj0B,EAAQmyB,wBAA0BlnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC2wB,WAAY3wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOixB,KAG1DjxB,EAAKyxB,iBAAiBxyB,SAEtB+xB,EAAiE,eAAnDryB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,IAKpDM,EAAmBC,KAAcxxB,KAEhCjC,EAAMiC,EAAMwxB,MAKdzzB,EAAM2wB,WAAY3wB,IAAS,GAI1B8yB,GACC7wB,EACA8wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAlzB,GAEE,KA+SL,SAAS2zB,GAAO1xB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GACzC,OAAO,IAAID,GAAMxyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GA7S5DhzB,EAAOmC,OAAQ,CAId8wB,SAAU,CACTC,QAAS,CACRvyB,IAAK,SAAUU,EAAMitB,GACpB,GAAKA,EAAW,CAGf,IAAIvtB,EAAMstB,GAAQhtB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACVgR,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV9P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOquB,GAGnC,GAAMnxB,GAA0B,IAAlBA,EAAK9C,UAAoC,IAAlB8C,EAAK9C,UAAmB8C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd6T,EAAWrV,EAAW3c,GACtBiyB,EAAe7C,GAAYhnB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM+S,IACLjyB,EAAO8uB,GAAekD,IAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,QAGrCvxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOmxB,IAEzBzxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB21B,IAC1BnwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWkS,GAAa,GAAK,OAI7Dj2B,EAAQ8xB,iBAA6B,KAAV/rB,GAAiD,IAAjC9B,EAAKxE,QAAS,gBAC9D0jB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOquB,MAE7B8B,EACJ/S,EAAMgT,YAAalyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMmwB,EAAOF,GACjC,IAAIlzB,EAAKwB,EAAK4f,EACb6T,EAAWrV,EAAW3c,GA6BvB,OA5BgBovB,GAAYhnB,KAAMpI,KAMjCA,EAAO8uB,GAAekD,KAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,KAGtC,QAAS7T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMmxB,SAIjB1vB,IAAR1D,IACJA,EAAMivB,GAAQhtB,EAAMgB,EAAMiwB,IAId,WAARlzB,GAAoBiD,KAAQuvB,KAChCxyB,EAAMwyB,GAAoBvvB,IAIZ,KAAVmwB,GAAgBA,GACpB5xB,EAAMmvB,WAAY3wB,IACD,IAAVozB,GAAkBgC,SAAU5zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI2tB,GACjDnyB,EAAOizB,SAAUd,GAAc,CAC9BxxB,IAAK,SAAUU,EAAMitB,EAAUkE,GAC9B,GAAKlE,EAIJ,OAAOkD,GAAa/mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKyxB,iBAAiBxyB,QAAWe,EAAKozB,wBAAwBlG,MAIjEoE,GAAkBtxB,EAAM8wB,EAAWK,GAHnCtE,GAAM7sB,EAAMqwB,GAAS,WACpB,OAAOiB,GAAkBtxB,EAAM8wB,EAAWK,MAM9ChT,IAAK,SAAUne,EAAM8C,EAAOquB,GAC3B,IAAIxuB,EACHsuB,EAASvE,GAAW1sB,GAIpBqzB,GAAsBt2B,EAAQkyB,iBACT,aAApBgC,EAAO5C,SAIR2C,GADkBqC,GAAsBlC,IAEY,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCN,EAAWQ,EACVN,GACC7wB,EACA8wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAYhvB,KAAK0vB,KAChBrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEyyB,WAAYuC,EAAQH,IACpBD,GAAoB7wB,EAAM8wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAchuB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO4Q,GAAchuB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM8wB,IAGpBJ,GAAmB1wB,EAAM8C,EAAO6tB,OAK1ChyB,EAAOizB,SAAS3D,WAAaV,GAAcxwB,EAAQiyB,mBAClD,SAAUhvB,EAAMitB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQhtB,EAAM,gBAClCA,EAAKozB,wBAAwBE,KAC5BzG,GAAM7sB,EAAM,CAAEiuB,WAAY,GAAK,WAC9B,OAAOjuB,EAAKozB,wBAAwBE,QAEnC,OAMP30B,EAAOkB,KAAM,CACZ0zB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBh1B,EAAOizB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU9wB,GAOjB,IANA,IAAIhF,EAAI,EACP+1B,EAAW,GAGXC,EAAyB,iBAAVhxB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd+1B,EAAUH,EAAS7T,GAAW/hB,GAAM61B,GACnCG,EAAOh2B,IAAOg2B,EAAOh2B,EAAI,IAAOg2B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ/0B,EAAOizB,SAAU8B,EAASC,GAASxV,IAAMuS,MAI3C/xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQphB,KAAM,SAAUqE,EAAMgB,EAAM8B,GAC1C,IAAImuB,EAAQxwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAiwB,EAASvE,GAAW1sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOmzB,GAGxD,OAAOlxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO+yB,MAAQA,IAETxyB,UAAY,CACjBE,YAAasyB,GACb3yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,EAAQ9Q,GACjDllB,KAAKqE,KAAOA,EACZrE,KAAK0iB,KAAOA,EACZ1iB,KAAKg2B,OAASA,GAAUhzB,EAAOgzB,OAAOtP,SACtC1mB,KAAKoF,QAAUA,EACfpF,KAAKkU,MAAQlU,KAAKmsB,IAAMnsB,KAAK8O,MAC7B9O,KAAKgF,IAAMA,EACXhF,KAAKklB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK3D,MACX+1B,GAAMqC,UAAU1R,SAAS/iB,IAAK3D,OAEhCq4B,IAAK,SAAUC,GACd,IAAIC,EACH/U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAoB/B,OAlBK1iB,KAAKoF,QAAQozB,SACjBx4B,KAAKy4B,IAAMF,EAAQv1B,EAAOgzB,OAAQh2B,KAAKg2B,QACtCsC,EAASt4B,KAAKoF,QAAQozB,SAAWF,EAAS,EAAG,EAAGt4B,KAAKoF,QAAQozB,UAG9Dx4B,KAAKy4B,IAAMF,EAAQD,EAEpBt4B,KAAKmsB,KAAQnsB,KAAKgF,IAAMhF,KAAKkU,OAAUqkB,EAAQv4B,KAAKkU,MAE/ClU,KAAKoF,QAAQszB,MACjB14B,KAAKoF,QAAQszB,KAAKj4B,KAAMT,KAAKqE,KAAMrE,KAAKmsB,IAAKnsB,MAGzCwjB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKxiB,MAEX+1B,GAAMqC,UAAU1R,SAASlE,IAAKxiB,MAExBA,QAIOoD,KAAKG,UAAYwyB,GAAMxyB,WAEvCwyB,GAAMqC,UAAY,CACjB1R,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK9C,UACa,MAA5BqjB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAC1B1f,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK9C,WACtByB,EAAOizB,SAAUrR,EAAMlC,OAC6B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO4P,GAAevP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,IAFjCnpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMuH,IAAMvH,EAAMM,UAU5C0T,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDrW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK9C,UAAYqjB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,OAKpCnpB,EAAOgzB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM/yB,KAAKizB,IAAKF,EAAI/yB,KAAKkzB,IAAO,GAExCxS,SAAU,SAGX1jB,EAAO21B,GAAK5C,GAAMxyB,UAAUH,KAG5BJ,EAAO21B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAmrBHxoB,GAEHyoB,GAprBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBx5B,EAAS65B,QAAoB15B,EAAO25B,sBACxC35B,EAAO25B,sBAAuBF,IAE9Bz5B,EAAO+f,WAAY0Z,GAAUx2B,EAAO21B,GAAGgB,UAGxC32B,EAAO21B,GAAGiB,QAKZ,SAASC,KAIR,OAHA95B,EAAO+f,WAAY,WAClBqZ,QAAQrzB,IAEAqzB,GAAQzwB,KAAKyjB,MAIvB,SAAS2N,GAAOn4B,EAAMo4B,GACrB,IAAI/L,EACH7rB,EAAI,EACJuM,EAAQ,CAAEilB,OAAQhyB,GAKnB,IADAo4B,EAAeA,EAAe,EAAI,EAC1B53B,EAAI,EAAGA,GAAK,EAAI43B,EAEvBrrB,EAAO,UADPsf,EAAQ9J,GAAW/hB,KACSuM,EAAO,UAAYsf,GAAUrsB,EAO1D,OAJKo4B,IACJrrB,EAAMwnB,QAAUxnB,EAAM6iB,MAAQ5vB,GAGxB+M,EAGR,SAASsrB,GAAa7yB,EAAOub,EAAMuX,GAKlC,IAJA,IAAIrV,EACHuK,GAAe+K,GAAUC,SAAUzX,IAAU,IAAKhiB,OAAQw5B,GAAUC,SAAU,MAC9E7e,EAAQ,EACRhY,EAAS6rB,EAAW7rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQuK,EAAY7T,GAAQ7a,KAAMw5B,EAAWvX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASsV,GAAW71B,EAAM+1B,EAAYh1B,GACrC,IAAImO,EACH8mB,EACA/e,EAAQ,EACRhY,EAAS42B,GAAUI,WAAWh3B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bwb,EAAKv1B,OAEbu1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B3Z,EAAYla,KAAKivB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHpY,EAAY+Z,EAAUzB,UAAY,GAEzCld,EAAQ,EACRhY,EAAS22B,EAAUQ,OAAOn3B,OAEnBgY,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAKC,GAMhC,OAHAja,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW3B,EAASpY,IAG5CoY,EAAU,GAAKh1B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAI5C5b,EAASmB,YAAanb,EAAM,CAAE41B,KACvB,IAERA,EAAY5b,EAASzB,QAAS,CAC7BvY,KAAMA,EACNynB,MAAO9oB,EAAOmC,OAAQ,GAAIi1B,GAC1BM,KAAM13B,EAAOmC,QAAQ,EAAM,CAC1Bw1B,cAAe,GACf3E,OAAQhzB,EAAOgzB,OAAOtP,UACpBthB,GACHw1B,mBAAoBR,EACpBS,gBAAiBz1B,EACjBo1B,UAAWrB,IAASU,KACpBrB,SAAUpzB,EAAQozB,SAClBiC,OAAQ,GACRT,YAAa,SAAUtX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO+yB,MAAO1xB,EAAM41B,EAAUS,KAAMhY,EAAM1d,EACrDi1B,EAAUS,KAAKC,cAAejY,IAAUuX,EAAUS,KAAK1E,QAExD,OADAiE,EAAUQ,OAAO75B,KAAMgkB,GAChBA,GAERlB,KAAM,SAAUoX,GACf,IAAIxf,EAAQ,EAIXhY,EAASw3B,EAAUb,EAAUQ,OAAOn3B,OAAS,EAC9C,GAAK+2B,EACJ,OAAOr6B,KAGR,IADAq6B,GAAU,EACF/e,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAK,GAUhC,OANKyC,GACJzc,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAC3C5b,EAASmB,YAAanb,EAAM,CAAE41B,EAAWa,KAEzCzc,EAASuB,WAAYvb,EAAM,CAAE41B,EAAWa,IAElC96B,QAGT8rB,EAAQmO,EAAUnO,MAInB,KA/HD,SAAqBA,EAAO6O,GAC3B,IAAIrf,EAAOjW,EAAM2wB,EAAQ7uB,EAAOqc,EAGhC,IAAMlI,KAASwQ,EAed,GAbAkK,EAAS2E,EADTt1B,EAAO2c,EAAW1G,IAElBnU,EAAQ2kB,EAAOxQ,GACV1V,MAAMC,QAASsB,KACnB6uB,EAAS7uB,EAAO,GAChBA,EAAQ2kB,EAAOxQ,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACdymB,EAAOzmB,GAAS8B,SACT2kB,EAAOxQ,KAGfkI,EAAQxgB,EAAOizB,SAAU5wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMyU,OAAQ9wB,UACf2kB,EAAOzmB,GAIC8B,EACNmU,KAASwQ,IAChBA,EAAOxQ,GAAUnU,EAAOmU,GACxBqf,EAAerf,GAAU0a,QAI3B2E,EAAet1B,GAAS2wB,EA6F1B+E,CAAYjP,EAAOmO,EAAUS,KAAKC,eAE1Brf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS2mB,GAAUI,WAAYhf,GAAQ7a,KAAMw5B,EAAW51B,EAAMynB,EAAOmO,EAAUS,MAM9E,OAJKr5B,EAAYkS,EAAOmQ,QACvB1gB,EAAOygB,YAAawW,EAAU51B,KAAM41B,EAAUS,KAAKnd,OAAQmG,KAC1DnQ,EAAOmQ,KAAKsX,KAAMznB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK0nB,EAAOkO,GAAaC,GAE3B54B,EAAY44B,EAAUS,KAAKxmB,QAC/B+lB,EAAUS,KAAKxmB,MAAMzT,KAAM4D,EAAM41B,GAIlCA,EACErb,SAAUqb,EAAUS,KAAK9b,UACzB/V,KAAMoxB,EAAUS,KAAK7xB,KAAMoxB,EAAUS,KAAKO,UAC1Cpe,KAAMod,EAAUS,KAAK7d,MACrBuB,OAAQ6b,EAAUS,KAAKtc,QAEzBpb,EAAO21B,GAAGuC,MACTl4B,EAAOmC,OAAQy0B,EAAM,CACpBv1B,KAAMA,EACN82B,KAAMlB,EACN1c,MAAO0c,EAAUS,KAAKnd,SAIjB0c,EAGRj3B,EAAOk3B,UAAYl3B,EAAOmC,OAAQ+0B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAU1Y,EAAMvb,GACtB,IAAIyd,EAAQ5kB,KAAKg6B,YAAatX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITyW,QAAS,SAAUvP,EAAO3nB,GACpB9C,EAAYyqB,IAChB3nB,EAAW2nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMhf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAASwoB,EAAMxoB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOoJ,EAAOxQ,GACd4e,GAAUC,SAAUzX,GAASwX,GAAUC,SAAUzX,IAAU,GAC3DwX,GAAUC,SAAUzX,GAAO9Q,QAASzN,IAItCm2B,WAAY,CA3Wb,SAA2Bj2B,EAAMynB,EAAO4O,GACvC,IAAIhY,EAAMvb,EAAOwe,EAAQnC,EAAO8X,EAASC,EAAWC,EAAgBhX,EACnEiX,EAAQ,UAAW3P,GAAS,WAAYA,EACxCqP,EAAOn7B,KACPsuB,EAAO,GACP/J,EAAQlgB,EAAKkgB,MACbkV,EAASp1B,EAAK9C,UAAY+iB,GAAoBjgB,GAC9Cq3B,EAAW9Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BAgY,EAAKnd,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBs3B,WACVnY,EAAMmY,SAAW,EACjBL,EAAU9X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMmY,UACXL,MAIH9X,EAAMmY,WAENR,EAAK/c,OAAQ,WAGZ+c,EAAK/c,OAAQ,WACZoF,EAAMmY,WACA34B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFqO,EAEb,GADA3kB,EAAQ2kB,EAAOpJ,GACV4W,GAAS7rB,KAAMtG,GAAU,CAG7B,UAFO2kB,EAAOpJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYsyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVtyB,IAAoBu0B,QAAiC51B,IAArB41B,EAAUhZ,GAK9C,SAJA+W,GAAS,EAOXnL,EAAM5L,GAASgZ,GAAYA,EAAUhZ,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA6Y,GAAav4B,EAAOyD,cAAeqlB,MAChB9oB,EAAOyD,cAAe6nB,GA8DzC,IAAM5L,KAzDD+Y,GAA2B,IAAlBp3B,EAAK9C,WAMlBm5B,EAAKkB,SAAW,CAAErX,EAAMqX,SAAUrX,EAAMsX,UAAWtX,EAAMuX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASlX,WAErCgX,EAAiB5Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBm3B,EACJhX,EAAUgX,GAIVlW,GAAU,CAAEjhB,IAAQ,GACpBm3B,EAAiBn3B,EAAKkgB,MAAMC,SAAWgX,EACvChX,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlBgX,IACrB,SAAhCx4B,EAAOyhB,IAAKpgB,EAAM,WAGhBk3B,IACLJ,EAAKtyB,KAAM,WACV0b,EAAMC,QAAUgX,IAEM,MAAlBA,IACJhX,EAAUD,EAAMC,QAChBgX,EAA6B,SAAZhX,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdkW,EAAKkB,WACTrX,EAAMqX,SAAW,SACjBT,EAAK/c,OAAQ,WACZmG,EAAMqX,SAAWlB,EAAKkB,SAAU,GAChCrX,EAAMsX,UAAYnB,EAAKkB,SAAU,GACjCrX,EAAMuX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACEjN,EAGPiN,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW9Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAASgX,IAInD7V,IACJ+V,EAASjC,QAAUA,GAIfA,GACJnU,GAAU,CAAEjhB,IAAQ,GAKrB82B,EAAKtyB,KAAM,WASV,IAAM6Z,KAJA+W,GACLnU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTiqB,EACbtrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM4L,EAAM5L,OAMnC6Y,EAAYvB,GAAaP,EAASiC,EAAUhZ,GAAS,EAAGA,EAAMyY,GACtDzY,KAAQgZ,IACfA,EAAUhZ,GAAS6Y,EAAUrnB,MACxBulB,IACJ8B,EAAUv2B,IAAMu2B,EAAUrnB,MAC1BqnB,EAAUrnB,MAAQ,MAuMrB6nB,UAAW,SAAU53B,EAAU+rB,GACzBA,EACJgK,GAAUI,WAAW1oB,QAASzN,GAE9B+1B,GAAUI,WAAW15B,KAAMuD,MAK9BnB,EAAOg5B,MAAQ,SAAUA,EAAOhG,EAAQ7yB,GACvC,IAAIk2B,EAAM2C,GAA0B,iBAAVA,EAAqBh5B,EAAOmC,OAAQ,GAAI62B,GAAU,CAC3Ef,SAAU93B,IAAOA,GAAM6yB,GACtB30B,EAAY26B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ7yB,GAAM6yB,GAAUA,IAAW30B,EAAY20B,IAAYA,GAoC5D,OAhCKhzB,EAAO21B,GAAGlQ,IACd4Q,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYx1B,EAAO21B,GAAGsD,OAC9B5C,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAOvV,UAMjB,MAAb2S,EAAI9b,QAA+B,IAAd8b,EAAI9b,QAC7B8b,EAAI9b,MAAQ,MAIb8b,EAAIlI,IAAMkI,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT55B,EAAYg4B,EAAIlI,MACpBkI,EAAIlI,IAAI1wB,KAAMT,MAGVq5B,EAAI9b,OACRva,EAAOsgB,QAAStjB,KAAMq5B,EAAI9b,QAIrB8b,GAGRr2B,EAAOG,GAAGgC,OAAQ,CACjB+2B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ7xB,GAGpC,OAAOnE,KAAKsQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMo3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ7xB,IAElDi4B,QAAS,SAAU1Z,EAAMsZ,EAAOhG,EAAQ7xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC2Z,EAASr5B,EAAOg5B,MAAOA,EAAOhG,EAAQ7xB,GACtCm4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWl6B,KAAMgD,EAAOmC,OAAQ,GAAIud,GAAQ2Z,IAGlDvmB,GAAS8M,EAASjf,IAAK3D,KAAM,YACjCm7B,EAAKzX,MAAM,IAMd,OAFA4Y,EAAYC,OAASD,EAEdxmB,IAA0B,IAAjBumB,EAAO9e,MACtBvd,KAAKkE,KAAMo4B,GACXt8B,KAAKud,MAAO8e,EAAO9e,MAAO+e,IAE5B5Y,KAAM,SAAU/hB,EAAMiiB,EAAYkX,GACjC,IAAI0B,EAAY,SAAUhZ,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMoX,IAYP,MATqB,iBAATn5B,IACXm5B,EAAUlX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ5jB,KAAKud,MAAO5b,GAAQ,KAAM,IAGpB3B,KAAKkE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B86B,EAASz5B,EAAOy5B,OAChBha,EAAOG,EAASjf,IAAK3D,MAEtB,GAAKsb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC8Y,EAAW/Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ6V,GAAK9rB,KAAM6N,IACtDkhB,EAAW/Z,EAAMnH,IAKpB,IAAMA,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MACnB,MAAR2B,GAAgB86B,EAAQnhB,GAAQiC,QAAU5b,IAE5C86B,EAAQnhB,GAAQ6f,KAAKzX,KAAMoX,GAC3BxX,GAAU,EACVmZ,EAAOv3B,OAAQoW,EAAO,KAOnBgI,GAAYwX,GAChB93B,EAAOsgB,QAAStjB,KAAM2B,MAIzB46B,OAAQ,SAAU56B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET3B,KAAKkE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK3D,MACrBud,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB86B,EAASz5B,EAAOy5B,OAChBn5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK8Z,QAAS,EAGdv5B,EAAOua,MAAOvd,KAAM2B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKjjB,KAAMT,MAAM,GAIlBsb,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MAAQy8B,EAAQnhB,GAAQiC,QAAU5b,IAC/D86B,EAAQnhB,GAAQ6f,KAAKzX,MAAM,GAC3B+Y,EAAOv3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQihB,QACrChf,EAAOjC,GAAQihB,OAAO97B,KAAMT,aAKvByiB,EAAK8Z,YAKfv5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIq3B,EAAQ15B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAgB,MAAT63B,GAAkC,kBAAVA,EAC9BU,EAAM/7B,MAAOX,KAAMsE,WACnBtE,KAAKo8B,QAAStC,GAAOz0B,GAAM,GAAQ22B,EAAOhG,EAAQ7xB,MAKrDnB,EAAOkB,KAAM,CACZy4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU7wB,EAAMymB,GAClB9oB,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAOnE,KAAKo8B,QAAStQ,EAAOkQ,EAAOhG,EAAQ7xB,MAI7CnB,EAAOy5B,OAAS,GAChBz5B,EAAO21B,GAAGiB,KAAO,WAChB,IAAIsB,EACH/4B,EAAI,EACJs6B,EAASz5B,EAAOy5B,OAIjB,IAFAtD,GAAQzwB,KAAKyjB,MAELhqB,EAAIs6B,EAAOn5B,OAAQnB,KAC1B+4B,EAAQuB,EAAQt6B,OAGCs6B,EAAQt6B,KAAQ+4B,GAChCuB,EAAOv3B,OAAQ/C,IAAK,GAIhBs6B,EAAOn5B,QACZN,EAAO21B,GAAGjV,OAEXyV,QAAQrzB,GAGT9C,EAAO21B,GAAGuC,MAAQ,SAAUA,GAC3Bl4B,EAAOy5B,OAAO77B,KAAMs6B,GACpBl4B,EAAO21B,GAAGzkB,SAGXlR,EAAO21B,GAAGgB,SAAW,GACrB32B,EAAO21B,GAAGzkB,MAAQ,WACZklB,KAILA,IAAa,EACbI,OAGDx2B,EAAO21B,GAAGjV,KAAO,WAChB0V,GAAa,MAGdp2B,EAAO21B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNxW,SAAU,KAMX1jB,EAAOG,GAAGg6B,MAAQ,SAAUC,EAAMz7B,GAIjC,OAHAy7B,EAAOp6B,EAAO21B,IAAK31B,EAAO21B,GAAGsD,OAAQmB,IAAiBA,EACtDz7B,EAAOA,GAAQ,KAER3B,KAAKud,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI6Z,EAAUt9B,EAAO+f,WAAYvT,EAAM6wB,GACvC5Z,EAAME,KAAO,WACZ3jB,EAAOu9B,aAAcD,OAOnBzsB,GAAQhR,EAAS0C,cAAe,SAEnC+2B,GADSz5B,EAAS0C,cAAe,UACpBK,YAAa/C,EAAS0C,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbP,EAAQm8B,QAA0B,KAAhB3sB,GAAMzJ,MAIxB/F,EAAQo8B,YAAcnE,GAAIzjB,UAI1BhF,GAAQhR,EAAS0C,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbP,EAAQq8B,WAA6B,MAAhB7sB,GAAMzJ,MAI5B,IAAIu2B,GACH9uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dq6B,WAAY,SAAUt4B,GACrB,OAAOrF,KAAKkE,KAAM,WACjBlB,EAAO26B,WAAY39B,KAAMqF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBv5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVy2B,GAAgB56B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO66B,UAAWx4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASq4B,QAAW53B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO26B,WAAYt5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC85B,UAAW,CACVl8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM/F,EAAQq8B,YAAwB,UAAVt2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXw2B,WAAY,SAAUt5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ27B,EAAY32B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK4hB,GAA+B,IAAlBz5B,EAAK9C,SACtB,MAAU8D,EAAOy4B,EAAW37B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bq4B,GAAW,CACVlb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO26B,WAAYt5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAI04B,EAASnvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAK+lB,EACRkU,EAAgB34B,EAAKoC,cAYtB,OAVMI,IAGLiiB,EAASlb,GAAYovB,GACrBpvB,GAAYovB,GAAkBj6B,EAC9BA,EAAqC,MAA/Bg6B,EAAQ15B,EAAMgB,EAAMwC,GACzBm2B,EACA,KACDpvB,GAAYovB,GAAkBlU,GAExB/lB,KAOT,IAAIk6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkBh3B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASuwB,GAAU/5B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS67B,GAAgBl3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dg7B,WAAY,SAAUj5B,GACrB,OAAOrF,KAAKkE,KAAM,kBACVlE,KAAMgD,EAAOu7B,QAASl5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB56B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOu7B,QAASl5B,IAAUA,EACjCme,EAAQxgB,EAAOo1B,UAAW/yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd+yB,UAAW,CACV3iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIm6B,EAAWx7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKm6B,EACG5K,SAAU4K,EAAU,IAI3BP,GAAWxwB,KAAMpJ,EAAKgI,WACtB6xB,GAAWzwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX+oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLt9B,EAAQo8B,cACbx6B,EAAOo1B,UAAUxiB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOu7B,QAASv+B,KAAKyH,eAAkBzH,OA4BxCgD,EAAOG,GAAGgC,OAAQ,CACjBw5B,SAAU,SAAUx3B,GACnB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAO2+B,SAAUx3B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAM1D,IAFA4+B,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAItB,GAHA08B,EAAWT,GAAU/5B,GACrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KACrB+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAAQ,IACvChwB,GAAOgwB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRg/B,YAAa,SAAU73B,GACtB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAOg/B,YAAa73B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAI7D,IAAMsE,UAAUhB,OACf,OAAOtD,KAAK+R,KAAM,QAAS,IAK5B,IAFA6sB,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAMtB,GALA08B,EAAWT,GAAU/5B,GAGrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KAG1B,OAA4C,EAApC+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAClChwB,EAAMA,EAAI5I,QAAS,IAAM44B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRi/B,YAAa,SAAU93B,EAAO+3B,GAC7B,IAAIv9B,SAAcwF,EACjBg4B,EAAwB,WAATx9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb+3B,GAA0BC,EAC9BD,EAAWl/B,KAAK2+B,SAAUx3B,GAAUnH,KAAKg/B,YAAa73B,GAGzD9F,EAAY8F,GACTnH,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOi/B,YACd93B,EAAM1G,KAAMT,KAAMmC,EAAGi8B,GAAUp+B,MAAQk/B,GACvCA,KAKIl/B,KAAKkE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM2kB,EAExB,GAAKD,EAAe,CAGnBh9B,EAAI,EACJsY,EAAOzX,EAAQhD,MACfo/B,EAAaf,GAAgBl3B,GAE7B,MAAU+I,EAAYkvB,EAAYj9B,KAG5BsY,EAAK4kB,SAAUnvB,GACnBuK,EAAKukB,YAAa9uB,GAElBuK,EAAKkkB,SAAUzuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYkuB,GAAUp+B,QAIrB4iB,EAASJ,IAAKxiB,KAAM,gBAAiBkQ,GAOjClQ,KAAKyC,cACTzC,KAAKyC,aAAc,QAClByN,IAAuB,IAAV/I,EACZ,GACAyb,EAASjf,IAAK3D,KAAM,kBAAqB,QAO/Cq/B,SAAU,SAAUp8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOrE,KAAMmC,KACtB,GAAuB,IAAlBkC,EAAK9C,WACoE,GAA3E,IAAM48B,GAAkBC,GAAU/5B,IAAW,KAAMxD,QAASqP,GAC9D,OAAO,EAIT,OAAO,KAOT,IAAIovB,GAAU,MAEdt8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKurB,EACfjrB,EAAOrE,KAAM,GAEd,OAAMsE,UAAUhB,QA0BhBgsB,EAAkBjuB,EAAY8F,GAEvBnH,KAAKkE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBpC,KAAKuB,WAWE,OANXa,EADIktB,EACEnoB,EAAM1G,KAAMT,KAAMmC,EAAGa,EAAQhD,MAAOoC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOu8B,SAAUv/B,KAAK2B,OAAUqB,EAAOu8B,SAAUv/B,KAAKqM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKxiB,KAAMoC,EAAK,WAC3DpC,KAAKmH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOu8B,SAAUl7B,EAAK1C,OAC7BqB,EAAOu8B,SAAUl7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASo5B,GAAS,IAIhB,MAAPv7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdo6B,SAAU,CACTnZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA+7B,GAAkBn7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACbyS,EAAoB,eAAdjkB,EAAK1C,KACX6jB,EAAS8C,EAAM,KAAO,GACtB2M,EAAM3M,EAAMhN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR2Z,EAGA3M,EAAMhN,EAAQ,EAIXnZ,EAAI8yB,EAAK9yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBkmB,EACJ,OAAOnhB,EAIRqe,EAAO5kB,KAAMuG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIq4B,EAAWpZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOu8B,SAASnZ,OAAOziB,IAAKyiB,GAAUZ,MAEtDga,GAAY,GAUd,OAHMA,IACLn7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOu8B,SAAUv/B,MAAS,CACzBwiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D/F,EAAQm8B,UACbv6B,EAAOu8B,SAAUv/B,MAAO2D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D/F,EAAQq+B,QAAU,cAAe1/B,EAGjC,IAAI2/B,GAAc,kCACjBC,GAA0B,SAAUlzB,GACnCA,EAAEsc,mBAGJ/lB,EAAOmC,OAAQnC,EAAOwlB,MAAO,CAE5BU,QAAS,SAAUV,EAAO/F,EAAMpe,EAAMu7B,GAErC,IAAIz9B,EAAG2M,EAAK6B,EAAKkvB,EAAYC,EAAQhW,EAAQ3K,EAAS4gB,EACrDC,EAAY,CAAE37B,GAAQzE,GACtB+B,EAAOX,EAAOP,KAAM+nB,EAAO,QAAWA,EAAM7mB,KAAO6mB,EACnDkB,EAAa1oB,EAAOP,KAAM+nB,EAAO,aAAgBA,EAAM/Y,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMixB,EAAcpvB,EAAMtM,EAAOA,GAAQzE,EAGlB,IAAlByE,EAAK9C,UAAoC,IAAlB8C,EAAK9C,WAK5Bm+B,GAAYjyB,KAAM9L,EAAOqB,EAAOwlB,MAAMuB,cAIf,EAAvBpoB,EAAKd,QAAS,OAIlBc,GADA+nB,EAAa/nB,EAAK4F,MAAO,MACP8G,QAClBqb,EAAWzkB,QAEZ66B,EAASn+B,EAAKd,QAAS,KAAQ,GAAK,KAAOc,GAG3C6mB,EAAQA,EAAOxlB,EAAO+C,SACrByiB,EACA,IAAIxlB,EAAOmmB,MAAOxnB,EAAuB,iBAAV6mB,GAAsBA,IAGhDK,UAAY+W,EAAe,EAAI,EACrCpX,EAAM/Y,UAAYia,EAAW7b,KAAM,KACnC2a,EAAMwC,WAAaxC,EAAM/Y,UACxB,IAAI1F,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAC7D,KAGD2a,EAAMjV,YAASzN,EACT0iB,EAAM/iB,SACX+iB,EAAM/iB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAE+F,GACFxlB,EAAO2D,UAAW8b,EAAM,CAAE+F,IAG3BrJ,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GACpCi+B,IAAgBzgB,EAAQ+J,UAAmD,IAAxC/J,EAAQ+J,QAAQvoB,MAAO0D,EAAMoe,IAAtE,CAMA,IAAMmd,IAAiBzgB,EAAQuM,WAAajqB,EAAU4C,GAAS,CAM9D,IAJAw7B,EAAa1gB,EAAQ2J,cAAgBnnB,EAC/B+9B,GAAYjyB,KAAMoyB,EAAal+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBo9B,EAAUp/B,KAAMkO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBtN,IACpCogC,EAAUp/B,KAAM+P,EAAIb,aAAea,EAAIsvB,cAAgBlgC,GAKzDoC,EAAI,EACJ,OAAU2M,EAAMkxB,EAAW79B,QAAYqmB,EAAMqC,uBAC5CkV,EAAcjxB,EACd0Z,EAAM7mB,KAAW,EAAJQ,EACZ09B,EACA1gB,EAAQ8K,UAAYtoB,GAGrBmoB,GAAWlH,EAASjf,IAAKmL,EAAK,WAAc1O,OAAOypB,OAAQ,OAAUrB,EAAM7mB,OAC1EihB,EAASjf,IAAKmL,EAAK,YAEnBgb,EAAOnpB,MAAOmO,EAAK2T,IAIpBqH,EAASgW,GAAUhxB,EAAKgxB,KACThW,EAAOnpB,OAASuhB,EAAYpT,KAC1C0Z,EAAMjV,OAASuW,EAAOnpB,MAAOmO,EAAK2T,IACZ,IAAjB+F,EAAMjV,QACViV,EAAMS,kBA8CT,OA1CAT,EAAM7mB,KAAOA,EAGPi+B,GAAiBpX,EAAMuD,sBAEpB5M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS/lB,MAAOq/B,EAAU12B,MAAOmZ,KACzCP,EAAY7d,IAIPy7B,GAAUz+B,EAAYgD,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMy7B,MAGXz7B,EAAMy7B,GAAW,MAIlB98B,EAAOwlB,MAAMuB,UAAYpoB,EAEpB6mB,EAAMqC,wBACVkV,EAAY/vB,iBAAkBrO,EAAMg+B,IAGrCt7B,EAAM1C,KAED6mB,EAAMqC,wBACVkV,EAAYhf,oBAAqBpf,EAAMg+B,IAGxC38B,EAAOwlB,MAAMuB,eAAYjkB,EAEpB6K,IACJtM,EAAMy7B,GAAWnvB,IAMd6X,EAAMjV,SAKd2sB,SAAU,SAAUv+B,EAAM0C,EAAMmkB,GAC/B,IAAI/b,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOmmB,MACXX,EACA,CACC7mB,KAAMA,EACNyqB,aAAa,IAIfppB,EAAOwlB,MAAMU,QAASzc,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjB+jB,QAAS,SAAUvnB,EAAM8gB,GACxB,OAAOziB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMziB,SAGpCmgC,eAAgB,SAAUx+B,EAAM8gB,GAC/B,IAAIpe,EAAOrE,KAAM,GACjB,GAAKqE,EACJ,OAAOrB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMpe,GAAM,MAc5CjD,EAAQq+B,SACbz8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAI/b,EAAU,SAAU6Z,GACvBxlB,EAAOwlB,MAAM0X,SAAUxV,EAAKlC,EAAM/iB,OAAQzC,EAAOwlB,MAAMkC,IAAKlC,KAG7DxlB,EAAOwlB,MAAMrJ,QAASuL,GAAQ,CAC7BP,MAAO,WAIN,IAAIjoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAE5B0V,GACLl+B,EAAI8N,iBAAkBse,EAAM3f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAKwoB,GAAO0V,GAAY,GAAM,IAEhD9V,SAAU,WACT,IAAIpoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAAQ,EAEpC0V,EAKLxd,EAASxB,OAAQlf,EAAKwoB,EAAK0V,IAJ3Bl+B,EAAI6e,oBAAqBuN,EAAM3f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAKwoB,QAS3B,IAAIvV,GAAWpV,EAAOoV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAKyjB,OAErBkU,GAAS,KAKbr9B,EAAOs9B,SAAW,SAAU7d,GAC3B,IAAI3O,EAAKysB,EACT,IAAM9d,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM/T,EAAOygC,WAAcC,gBAAiBhe,EAAM,YACvD,MAAQhW,IAYV,OAVA8zB,EAAkBzsB,GAAOA,EAAIxG,qBAAsB,eAAiB,GAC9DwG,IAAOysB,GACZv9B,EAAOoD,MAAO,iBACbm6B,EACCv9B,EAAOoB,IAAKm8B,EAAgB/zB,WAAY,SAAUgC,GACjD,OAAOA,EAAG8D,cACPzE,KAAM,MACV4U,IAGI3O,GAIR,IACC4sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa/I,EAAQz2B,EAAKy/B,EAAavlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAASvE,GAGnB0B,EAAOkB,KAAM5C,EAAK,SAAUa,EAAGia,GACzB2kB,GAAeL,GAASjzB,KAAMsqB,GAGlCvc,EAAKuc,EAAQ3b,GAKb0kB,GACC/I,EAAS,KAAqB,iBAAN3b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACA2kB,EACAvlB,UAKG,GAAMulB,GAAiC,WAAlBj+B,EAAQxB,GAUnCka,EAAKuc,EAAQz2B,QAPb,IAAM+D,KAAQ/D,EACbw/B,GAAa/I,EAAS,IAAM1yB,EAAO,IAAK/D,EAAK+D,GAAQ07B,EAAavlB,GAYrExY,EAAOg+B,MAAQ,SAAU53B,EAAG23B,GAC3B,IAAIhJ,EACHkJ,EAAI,GACJzlB,EAAM,SAAUrN,EAAK+yB,GAGpB,IAAI/5B,EAAQ9F,EAAY6/B,GACvBA,IACAA,EAEDD,EAAGA,EAAE39B,QAAW69B,mBAAoBhzB,GAAQ,IAC3CgzB,mBAA6B,MAATh6B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKxb,KAAKqF,KAAMrF,KAAKmH,cAOtB,IAAM4wB,KAAU3uB,EACf03B,GAAa/I,EAAQ3uB,EAAG2uB,GAAUgJ,EAAavlB,GAKjD,OAAOylB,EAAEpzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjBi8B,UAAW,WACV,OAAOp+B,EAAOg+B,MAAOhhC,KAAKqhC,mBAE3BA,eAAgB,WACf,OAAOrhC,KAAKoE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAM1iB,KAAM,YAClC,OAAO8R,EAAW9O,EAAO2D,UAAWmL,GAAa9R,OAC9CsQ,OAAQ,WACX,IAAI3O,EAAO3B,KAAK2B,KAGhB,OAAO3B,KAAKqF,OAASrC,EAAQhD,MAAOka,GAAI,cACvC2mB,GAAapzB,KAAMzN,KAAKqM,YAAeu0B,GAAgBnzB,KAAM9L,KAC3D3B,KAAK2V,UAAYkQ,GAAepY,KAAM9L,MACtCyC,IAAK,SAAUoD,EAAInD,GACtB,IAAIjC,EAAMY,EAAQhD,MAAOoC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAIhD,CAAEt7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAClDh9B,SAKN,IACC29B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZrH,GAAa,GAObsH,GAAa,GAGbC,GAAW,KAAKnhC,OAAQ,KAGxBohC,GAAeliC,EAAS0C,cAAe,KAKxC,SAASy/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoBhkB,GAED,iBAAvBgkB,IACXhkB,EAAOgkB,EACPA,EAAqB,KAGtB,IAAIC,EACH//B,EAAI,EACJggC,EAAYF,EAAmBx6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK7a,EAAY4c,GAGhB,MAAUikB,EAAWC,EAAWhgC,KAGR,MAAlB+/B,EAAU,IACdA,EAAWA,EAAS5hC,MAAO,IAAO,KAChC0hC,EAAWE,GAAaF,EAAWE,IAAc,IAAKtwB,QAASqM,KAI/D+jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKthC,KAAMqd,IAQnE,SAASmkB,GAA+BJ,EAAW58B,EAASy1B,EAAiBwH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAItsB,EAcJ,OAbA0sB,EAAWJ,IAAa,EACxBl/B,EAAOkB,KAAM89B,EAAWE,IAAc,GAAI,SAAUjlB,EAAGwlB,GACtD,IAAIC,EAAsBD,EAAoBr9B,EAASy1B,EAAiBwH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACD3sB,EAAW8sB,QADf,GAHNt9B,EAAQ+8B,UAAUvwB,QAAS8wB,GAC3BF,EAASE,IACF,KAKF9sB,EAGR,OAAO4sB,EAASp9B,EAAQ+8B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYl9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRk9B,EAAc5/B,EAAO6/B,aAAaD,aAAe,GAElD,IAAMz0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPy0B,EAAaz0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/ERq8B,GAAatsB,KAAOL,GAASK,KAgP7BxS,EAAOmC,OAAQ,CAGd29B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK9tB,GAASK,KACd7T,KAAM,MACNuhC,QAxRgB,4DAwRQz1B,KAAM0H,GAASguB,UACvC3jC,QAAQ,EACR4jC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRnI,IAAKyG,GACLt/B,KAAM,aACNgtB,KAAM,YACNzb,IAAK,4BACL0vB,KAAM,qCAGPxoB,SAAU,CACTlH,IAAK,UACLyb,KAAM,SACNiU,KAAM,YAGPC,eAAgB,CACf3vB,IAAK,cACLvR,KAAM,eACNihC,KAAM,gBAKPE,WAAY,CAGXC,SAAUj4B,OAGVk4B,aAAa,EAGbC,YAAa5gB,KAAKC,MAGlB4gB,WAAY9gC,EAAOs9B,UAOpBsC,YAAa,CACZK,KAAK,EACL//B,SAAS,IAOX6gC,UAAW,SAAUt+B,EAAQu+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYl9B,EAAQzC,EAAO6/B,cAAgBmB,GAGvDrB,GAAY3/B,EAAO6/B,aAAcp9B,IAGnCw+B,cAAelC,GAA6BzH,IAC5C4J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK79B,GAGA,iBAAR69B,IACX79B,EAAU69B,EACVA,OAAMn9B,GAIPV,EAAUA,GAAW,GAErB,IAAIg/B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGA3jB,EAGA4jB,EAGAviC,EAGAwiC,EAGA1D,EAAIj+B,EAAO+gC,UAAW,GAAI3+B,GAG1Bw/B,EAAkB3D,EAAE/9B,SAAW+9B,EAG/B4D,EAAqB5D,EAAE/9B,UACpB0hC,EAAgBrjC,UAAYqjC,EAAgBphC,QAC9CR,EAAQ4hC,GACR5hC,EAAOwlB,MAGRnK,EAAWrb,EAAOgb,WAClB8mB,EAAmB9hC,EAAO+Z,UAAW,eAGrCgoB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPnhB,WAAY,EAGZikB,kBAAmB,SAAUh3B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMyjB,EAAkB,CACvBA,EAAkB,GAClB,MAAUz3B,EAAQ20B,GAASt0B,KAAMm3B,GAChCC,EAAiBz3B,EAAO,GAAIrF,cAAgB,MACzC88B,EAAiBz3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD/G,OAAQoM,EAAO,IAGpBA,EAAQy3B,EAAiBp2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cu3B,sBAAuB,WACtB,OAAOtkB,EAAYwjB,EAAwB,MAI5Ce,iBAAkB,SAAUhgC,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO4/B,EAAqB5/B,EAAKoC,eAChCw9B,EAAqB5/B,EAAKoC,gBAAmBpC,EAC9C2/B,EAAgB3/B,GAAS8B,GAEnBnH,MAIRslC,iBAAkB,SAAU3jC,GAI3B,OAHkB,MAAbmf,IACJmgB,EAAEsE,SAAW5jC,GAEP3B,MAIR+kC,WAAY,SAAU3gC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJuhB,EAAMjkB,OAAQha,EAAKi+B,EAAMmD,cAIzB,IAAMxjC,KAAQoC,EACb2gC,EAAY/iC,GAAS,CAAE+iC,EAAY/iC,GAAQoC,EAAKpC,IAInD,OAAOhC,MAIRylC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB98B,EAAM,EAAG88B,GACF3lC,OAoBV,GAfAqe,EAASzB,QAASylB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO9tB,GAASK,MAAS,IAC5CtP,QAASy7B,GAAWxsB,GAASguB,SAAW,MAG1ClC,EAAEt/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQs/B,EAAEtkB,QAAUskB,EAAEt/B,KAGzDs/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMz6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB+kB,EAAE2E,YAAsB,CAC5BnB,EAAY7kC,EAAS0C,cAAe,KAKpC,IACCmiC,EAAUjvB,KAAOyrB,EAAEgC,IAInBwB,EAAUjvB,KAAOivB,EAAUjvB,KAC3ByrB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQp5B,GAITw0B,EAAE2E,aAAc,GAalB,GARK3E,EAAExe,MAAQwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,OACxCwe,EAAExe,KAAOzf,EAAOg+B,MAAOC,EAAExe,KAAMwe,EAAEF,cAIlCqB,GAA+B9H,GAAY2G,EAAG77B,EAASi9B,GAGlDvhB,EACJ,OAAOuhB,EA8ER,IAAMlgC,KAzENuiC,EAAc1hC,EAAOwlB,OAASyY,EAAEzhC,SAGQ,GAApBwD,EAAO8/B,UAC1B9/B,EAAOwlB,MAAMU,QAAS,aAIvB+X,EAAEt/B,KAAOs/B,EAAEt/B,KAAKogB,cAGhBkf,EAAE6E,YAAcpE,GAAWj0B,KAAMwzB,EAAEt/B,MAKnC0iC,EAAWpD,EAAEgC,IAAI/8B,QAASq7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAExe,MAAQwe,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKziC,QAAS,uCACjCogC,EAAExe,KAAOwe,EAAExe,KAAKvc,QAASo7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAI3iC,MAAO+jC,EAAS/gC,QAG5B29B,EAAExe,OAAUwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,QAC1C4hB,IAAchE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQpD,EAAExe,YAGjDwe,EAAExe,OAIO,IAAZwe,EAAE/yB,QACNm2B,EAAWA,EAASn+B,QAASs7B,GAAY,MACzCmD,GAAatE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQ,KAASxiC,GAAMuF,OACnEu9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD/iC,EAAO+/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBriC,EAAO+/B,aAAcsB,IAE9DrhC,EAAOggC,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBriC,EAAOggC,KAAMqB,MAKnDpD,EAAExe,MAAQwe,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBl+B,EAAQk+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBljC,EAAG8+B,EAAE+E,QAAS7jC,IAIvC,GAAK8+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWxlC,KAAMmkC,EAAiBvC,EAAOpB,IAAiBngB,GAG9D,OAAOuhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBtpB,IAAKylB,EAAEhG,UACxBoH,EAAMx5B,KAAMo4B,EAAEiF,SACd7D,EAAMxlB,KAAMokB,EAAE76B,OAGdg+B,EAAYhC,GAA+BR,GAAYX,EAAG77B,EAASi9B,GAK5D,CASN,GARAA,EAAMnhB,WAAa,EAGdwjB,GACJG,EAAmB3b,QAAS,WAAY,CAAEmZ,EAAOpB,IAI7CngB,EACJ,OAAOuhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE5D,UACjBmH,EAAezkC,EAAO+f,WAAY,WACjCuiB,EAAMoD,MAAO,YACXxE,EAAE5D,UAGN,IACCvc,GAAY,EACZsjB,EAAU+B,KAAMnB,EAAgBn8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAM28B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS9/B,EAAOmgC,EAAUC,EACxCd,EAAaU,EAGTtlB,IAILA,GAAY,EAGP0jB,GACJzkC,EAAOu9B,aAAckH,GAKtBJ,OAAYt+B,EAGZw+B,EAAwB0B,GAAW,GAGnC3D,EAAMnhB,WAAsB,EAATskB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI9kC,EAAM+kC,EAAeC,EAC5B3rB,EAAWimB,EAAEjmB,SACbmnB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU9zB,aACEvI,IAAP2gC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM9kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAMg5B,GAAO,CACtDtE,EAAUvwB,QAASjQ,GACnB,MAMH,GAAKwgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMxgC,KAAQ0kC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY/hC,EAAO,IAAMwgC,EAAW,IAAQ,CACrEuE,EAAgB/kC,EAChB,MAEKglC,IACLA,EAAgBhlC,GAKlB+kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUvwB,QAAS80B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IACsC,EAA3CtjC,EAAO6D,QAAS,SAAUo6B,EAAEkB,YAC5Bn/B,EAAO6D,QAAS,OAAQo6B,EAAEkB,WAAc,IACxClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA9iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMp2B,EAAKsK,EAC9ByoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU7hC,QAGzB,GAAK6hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKt/B,eAAkBw5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU9zB,QAGpB,MAAQy4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCtrB,GAAQqrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtCjnB,EAAO6rB,EACPA,EAAU3E,EAAU9zB,QAKnB,GAAiB,MAAZy4B,EAEJA,EAAU7rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS6rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYzoB,EAAO,IAAM6rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA/yB,EAAMk2B,EAAMt/B,MAAO,MACT,KAAQu/B,IAGjBC,EAAOrD,EAAYzoB,EAAO,IAAMtK,EAAK,KACpC+yB,EAAY,KAAO/yB,EAAK,KACb,EAGG,IAATo2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUn2B,EAAK,GACfwxB,EAAUvwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATo2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ95B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAO2gC,EAAOt6B,EAAI,sBAAwBwO,EAAO,OAAS6rB,IASjE,MAAO,CAAE3oB,MAAO,UAAWsE,KAAM8jB,GAidpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCniC,EAAO+/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCniC,EAAOggC,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEt/B,KACxB+jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASpoB,MACtB+nB,EAAUK,EAAS9jB,KAEnB6jB,IADAlgC,EAAQmgC,EAASngC,UAMlBA,EAAQs/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJjoB,EAASmB,YAAaolB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9DhkB,EAASuB,WAAYglB,EAAiB,CAAEvC,EAAOqD,EAAYt/B,IAI5Di8B,EAAM0C,WAAYA,GAClBA,OAAaj/B,EAER4+B,GACJG,EAAmB3b,QAASod,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU9/B,IAIpC0+B,EAAiB/mB,SAAU6mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmB3b,QAAS,eAAgB,CAAEmZ,EAAOpB,MAG3Cj+B,EAAO8/B,QAChB9/B,EAAOwlB,MAAMU,QAAS,cAKzB,OAAOmZ,GAGR8E,QAAS,SAAUlE,EAAKxgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKs/B,EAAKxgB,EAAMte,EAAU,SAGzCijC,UAAW,SAAUnE,EAAK9+B,GACzB,OAAOnB,EAAOW,IAAKs/B,OAAKn9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUsmB,EAAKxgB,EAAMte,EAAUxC,GAUjD,OAPKN,EAAYohB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOmhC,KAAMnhC,EAAOmC,OAAQ,CAClC89B,IAAKA,EACLthC,KAAMgb,EACNulB,SAAUvgC,EACV8gB,KAAMA,EACNyjB,QAAS/hC,GACPnB,EAAO2C,cAAes9B,IAASA,OAIpCjgC,EAAOihC,cAAe,SAAUhD,GAC/B,IAAI9+B,EACJ,IAAMA,KAAK8+B,EAAE+E,QACa,iBAApB7jC,EAAEsF,gBACNw5B,EAAEqC,YAAcrC,EAAE+E,QAAS7jC,IAAO,MAMrCa,EAAOwsB,SAAW,SAAUyT,EAAK79B,EAASlD,GACzC,OAAOc,EAAOmhC,KAAM,CACnBlB,IAAKA,EAGLthC,KAAM,MACNugC,SAAU,SACVh0B,OAAO,EACPm1B,OAAO,EACP7jC,QAAQ,EAKRkkC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBvjC,EAAO0D,WAAY6/B,EAAUnhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBmiC,QAAS,SAAU/X,GAClB,IAAI/H,EAyBJ,OAvBKxnB,KAAM,KACLqB,EAAYkuB,KAChBA,EAAOA,EAAK9uB,KAAMT,KAAM,KAIzBwnB,EAAOxkB,EAAQusB,EAAMvvB,KAAM,GAAIkN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDxF,KAAM,GAAI4C,YACd4kB,EAAK2I,aAAcnwB,KAAM,IAG1BwnB,EAAKpjB,IAAK,WACT,IAAIC,EAAOrE,KAEX,MAAQqE,EAAKkjC,kBACZljC,EAAOA,EAAKkjC,kBAGb,OAAOljC,IACJ4rB,OAAQjwB,OAGNA,MAGRwnC,UAAW,SAAUjY,GACpB,OAAKluB,EAAYkuB,GACTvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOwnC,UAAWjY,EAAK9uB,KAAMT,KAAMmC,MAItCnC,KAAKkE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQhD,MAClBgb,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASssB,QAAS/X,GAGlB9U,EAAKwV,OAAQV,MAKhB/H,KAAM,SAAU+H,GACf,IAAIkY,EAAiBpmC,EAAYkuB,GAEjC,OAAOvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOsnC,QAASG,EAAiBlY,EAAK9uB,KAAMT,KAAMmC,GAAMotB,MAIlEmY,OAAQ,SAAUzkC,GAIjB,OAHAjD,KAAKmU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQhD,MAAOswB,YAAatwB,KAAKwM,cAE3BxM,QAKTgD,EAAO6O,KAAKhI,QAAQ4vB,OAAS,SAAUp1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ89B,QAAStjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ89B,QAAU,SAAUtjC,GACvC,SAAWA,EAAKuuB,aAAevuB,EAAK0vB,cAAgB1vB,EAAKyxB,iBAAiBxyB,SAM3EN,EAAO6/B,aAAa+E,IAAM,WACzB,IACC,OAAO,IAAI7nC,EAAO8nC,eACjB,MAAQp7B,MAGX,IAAIq7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAejlC,EAAO6/B,aAAa+E,MAEpCxmC,EAAQ8mC,OAASD,IAAkB,oBAAqBA,GACxD7mC,EAAQ+iC,KAAO8D,KAAiBA,GAEhCjlC,EAAOkhC,cAAe,SAAU9+B,GAC/B,IAAIjB,EAAUgkC,EAGd,GAAK/mC,EAAQ8mC,MAAQD,KAAiB7iC,EAAQwgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS/K,GACxB,IAAI94B,EACHylC,EAAMxiC,EAAQwiC,MAWf,GATAA,EAAIQ,KACHhjC,EAAQzD,KACRyD,EAAQ69B,IACR79B,EAAQi+B,MACRj+B,EAAQijC,SACRjjC,EAAQmR,UAIJnR,EAAQkjC,UACZ,IAAMnmC,KAAKiD,EAAQkjC,UAClBV,EAAKzlC,GAAMiD,EAAQkjC,UAAWnmC,GAmBhC,IAAMA,KAdDiD,EAAQmgC,UAAYqC,EAAItC,kBAC5BsC,EAAItC,iBAAkBlgC,EAAQmgC,UAQzBngC,EAAQwgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV4B,EAAIvC,iBAAkBljC,EAAG6jC,EAAS7jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAWgkC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAThnC,EACJimC,EAAInC,QACgB,UAAT9jC,EAKgB,iBAAfimC,EAAIpC,OACfvK,EAAU,EAAG,SAEbA,EAGC2M,EAAIpC,OACJoC,EAAIlC,YAINzK,EACC6M,GAAkBF,EAAIpC,SAAYoC,EAAIpC,OACtCoC,EAAIlC,WAK+B,UAAjCkC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAIrB,UACd,CAAEhkC,KAAMqlC,EAAIiB,cACbjB,EAAIxC,4BAQTwC,EAAIW,OAASpkC,IACbgkC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYvkC,EAAU,cAKnC2B,IAAhB8hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAI1mB,YAMRnhB,EAAO+f,WAAY,WACb3b,GACJgkC,OAQLhkC,EAAWA,EAAU,SAErB,IAGCyjC,EAAIzB,KAAM/gC,EAAQ0gC,YAAc1gC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKTg5B,MAAO,WACDthC,GACJA,QAWLnB,EAAOihC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAEjmB,SAAS3Y,QAAS,KAKtBW,EAAO+gC,UAAW,CACjBR,QAAS,CACRlhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETqhC,WAAY,CACX2D,cAAe,SAAU9kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAOihC,cAAe,SAAU,SAAUhD,QACxBn7B,IAAZm7B,EAAE/yB,QACN+yB,EAAE/yB,OAAQ,GAEN+yB,EAAE2E,cACN3E,EAAEt/B,KAAO,SAKXqB,EAAOkhC,cAAe,SAAU,SAAUjD,GAIxC,IAAI5+B,EAAQ8B,EADb,GAAK88B,EAAE2E,aAAe3E,EAAE8H,YAEvB,MAAO,CACN5C,KAAM,SAAUlpB,EAAGge,GAClB54B,EAASW,EAAQ,YACf+O,KAAMkvB,EAAE8H,aAAe,IACvBrmB,KAAM,CAAEsmB,QAAS/H,EAAEgI,cAAernC,IAAKq/B,EAAEgC,MACzC7a,GAAI,aAAcjkB,EAAW,SAAU+kC,GACvC7mC,EAAOub,SACPzZ,EAAW,KACN+kC,GACJjO,EAAuB,UAAbiO,EAAIvnC,KAAmB,IAAM,IAAKunC,EAAIvnC,QAKnD/B,EAAS8C,KAAKC,YAAaN,EAAQ,KAEpCojC,MAAO,WACDthC,GACJA,QAUL,IAqGKshB,GArGD0jB,GAAe,GAClBC,GAAS,oBAGVpmC,EAAO+gC,UAAW,CACjBsF,MAAO,WACPC,cAAe,WACd,IAAInlC,EAAWglC,GAAa7/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADApH,KAAMmE,IAAa,EACZA,KAKTnB,EAAOihC,cAAe,aAAc,SAAUhD,EAAGsI,EAAkBlH,GAElE,IAAImH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ1I,EAAEoI,QAAqBD,GAAO37B,KAAMwzB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAExe,MAE6C,KADnDwe,EAAEqC,aAAe,IACjBziC,QAAS,sCACXuoC,GAAO37B,KAAMwzB,EAAExe,OAAU,QAI5B,GAAKknB,GAAiC,UAArB1I,EAAEkB,UAAW,GA8D7B,OA3DAqH,EAAevI,EAAEqI,cAAgBjoC,EAAY4/B,EAAEqI,eAC9CrI,EAAEqI,gBACFrI,EAAEqI,cAGEK,EACJ1I,EAAG0I,GAAa1I,EAAG0I,GAAWzjC,QAASkjC,GAAQ,KAAOI,IAC/B,IAAZvI,EAAEoI,QACbpI,EAAEgC,MAAS5C,GAAO5yB,KAAMwzB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEoI,MAAQ,IAAMG,GAIjEvI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMgG,GACL1mC,EAAOoD,MAAOojC,EAAe,mBAEvBE,EAAmB,IAI3BzI,EAAEkB,UAAW,GAAM,OAGnBsH,EAAc1pC,EAAQypC,GACtBzpC,EAAQypC,GAAiB,WACxBE,EAAoBplC,WAIrB+9B,EAAMjkB,OAAQ,gBAGQtY,IAAhB2jC,EACJzmC,EAAQjD,GAASu+B,WAAYkL,GAI7BzpC,EAAQypC,GAAiBC,EAIrBxI,EAAGuI,KAGPvI,EAAEqI,cAAgBC,EAAiBD,cAGnCH,GAAavoC,KAAM4oC,IAIfE,GAAqBroC,EAAYooC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc3jC,IAI5B,WAYT1E,EAAQwoC,qBACHnkB,GAAO7lB,EAASiqC,eAAeD,mBAAoB,IAAKnkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS4mC,GAC3C,MAAqB,iBAATrnB,EACJ,IAEgB,kBAAZvf,IACX4mC,EAAc5mC,EACdA,GAAU,GAKLA,IAIA9B,EAAQwoC,qBAMZ/yB,GALA3T,EAAUtD,EAASiqC,eAAeD,mBAAoB,KAKvCtnC,cAAe,SACzBkT,KAAO5V,EAASuV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUtD,GAKZynB,GAAWyiB,GAAe,IAD1BC,EAASzvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAeynC,EAAQ,MAGzCA,EAAS3iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI+lC,EAAOv9B,cAlChC,IAAIqK,EAAMkzB,EAAQ1iB,GAyCnBrkB,EAAOG,GAAGsoB,KAAO,SAAUwX,EAAK+G,EAAQ7lC,GACvC,IAAIlB,EAAUtB,EAAM4kC,EACnB9rB,EAAOza,KACPyoB,EAAMwa,EAAIpiC,QAAS,KAsDpB,OApDY,EAAP4nB,IACJxlB,EAAWk7B,GAAkB8E,EAAI3iC,MAAOmoB,IACxCwa,EAAMA,EAAI3iC,MAAO,EAAGmoB,IAIhBpnB,EAAY2oC,IAGhB7lC,EAAW6lC,EACXA,OAASlkC,GAGEkkC,GAA4B,iBAAXA,IAC5BroC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOmhC,KAAM,CACZlB,IAAKA,EAKLthC,KAAMA,GAAQ,MACdugC,SAAU,OACVzf,KAAMunB,IACHnhC,KAAM,SAAUggC,GAGnBtC,EAAWjiC,UAEXmW,EAAK8U,KAAMtsB,EAIVD,EAAQ,SAAUitB,OAAQjtB,EAAO2X,UAAWkuB,IAAiBr4B,KAAMvN,GAGnE4lC,KAKEzqB,OAAQja,GAAY,SAAUk+B,EAAOmD,GACxC/qB,EAAKvW,KAAM,WACVC,EAASxD,MAAOX,KAAMumC,GAAY,CAAElE,EAAMwG,aAAcrD,EAAQnD,QAK5DriC,MAMRgD,EAAO6O,KAAKhI,QAAQogC,SAAW,SAAU5lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOy5B,OAAQ,SAAUt5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOknC,OAAS,CACfC,UAAW,SAAU9lC,EAAMe,EAASjD,GACnC,IAAIioC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD/X,EAAW1vB,EAAOyhB,IAAKpgB,EAAM,YAC7BqmC,EAAU1nC,EAAQqB,GAClBynB,EAAQ,GAGS,WAAb4G,IACJruB,EAAKkgB,MAAMmO,SAAW,YAGvB8X,EAAYE,EAAQR,SACpBI,EAAYtnC,EAAOyhB,IAAKpgB,EAAM,OAC9BomC,EAAaznC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbquB,GAAwC,UAAbA,KACA,GAA9C4X,EAAYG,GAAa5pC,QAAS,SAMpC0pC,GADAH,EAAcM,EAAQhY,YACD3iB,IACrBs6B,EAAUD,EAAYzS,OAGtB4S,EAASxX,WAAYuX,IAAe,EACpCD,EAAUtX,WAAY0X,IAAgB,GAGlCppC,EAAY+D,KAGhBA,EAAUA,EAAQ3E,KAAM4D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIqlC,KAGjC,MAAfplC,EAAQ2K,MACZ+b,EAAM/b,IAAQ3K,EAAQ2K,IAAMy6B,EAAUz6B,IAAQw6B,GAE1B,MAAhBnlC,EAAQuyB,OACZ7L,EAAM6L,KAASvyB,EAAQuyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWjlC,EACfA,EAAQulC,MAAMlqC,KAAM4D,EAAMynB,GAG1B4e,EAAQjmB,IAAKqH,KAKhB9oB,EAAOG,GAAGgC,OAAQ,CAGjB+kC,OAAQ,SAAU9kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNpF,KACAA,KAAKkE,KAAM,SAAU/B,GACpBa,EAAOknC,OAAOC,UAAWnqC,KAAMoF,EAASjD,KAI3C,IAAIyoC,EAAMC,EACTxmC,EAAOrE,KAAM,GAEd,OAAMqE,EAQAA,EAAKyxB,iBAAiBxyB,QAK5BsnC,EAAOvmC,EAAKozB,wBACZoT,EAAMxmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK66B,EAAK76B,IAAM86B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAEh7B,IAAK,EAAG4nB,KAAM,QATxB,GAuBDjF,SAAU,WACT,GAAM1yB,KAAM,GAAZ,CAIA,IAAIgrC,EAAcd,EAAQhoC,EACzBmC,EAAOrE,KAAM,GACbirC,EAAe,CAAEl7B,IAAK,EAAG4nB,KAAM,GAGhC,GAAwC,UAAnC30B,EAAOyhB,IAAKpgB,EAAM,YAGtB6lC,EAAS7lC,EAAKozB,4BAER,CACNyS,EAASlqC,KAAKkqC,SAIdhoC,EAAMmC,EAAK6I,cACX89B,EAAe3mC,EAAK2mC,cAAgB9oC,EAAIyN,gBACxC,MAAQq7B,IACLA,IAAiB9oC,EAAIujB,MAAQulB,IAAiB9oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKumB,EAAc,YAE1BA,EAAeA,EAAapoC,WAExBooC,GAAgBA,IAAiB3mC,GAAkC,IAA1B2mC,EAAazpC,YAG1D0pC,EAAejoC,EAAQgoC,GAAed,UACzBn6B,KAAO/M,EAAOyhB,IAAKumB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ30B,EAAOyhB,IAAKumB,EAAc,mBAAmB,IAKpE,MAAO,CACNj7B,IAAKm6B,EAAOn6B,IAAMk7B,EAAal7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEszB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO30B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E2mC,aAAc,WACb,OAAOhrC,KAAKoE,IAAK,WAChB,IAAI4mC,EAAehrC,KAAKgrC,aAExB,MAAQA,GAA2D,WAA3ChoC,EAAOyhB,IAAKumB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBr7B,QAM1B3M,EAAOkB,KAAM,CAAE20B,WAAY,cAAeD,UAAW,eAAiB,SAAUjc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQphB,KAAM,SAAUqE,EAAMsY,EAAQva,GAG5C,IAAIyoC,EAOJ,GANKppC,EAAU4C,GACdwmC,EAAMxmC,EACuB,IAAlBA,EAAK9C,WAChBspC,EAAMxmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOyoC,EAAMA,EAAKnoB,GAASre,EAAMsY,GAG7BkuB,EACJA,EAAIK,SACFn7B,EAAY86B,EAAIE,YAAV3oC,EACP2N,EAAM3N,EAAMyoC,EAAIC,aAIjBzmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOizB,SAAUvT,GAASkP,GAAcxwB,EAAQgyB,cAC/C,SAAU/uB,EAAMitB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQhtB,EAAMqe,GAGlBoO,GAAUrjB,KAAM6jB,GACtBtuB,EAAQqB,GAAOquB,WAAYhQ,GAAS,KACpC4O,MAQLtuB,EAAOkB,KAAM,CAAEinC,OAAQ,SAAUC,MAAO,SAAW,SAAU/lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CACZ2zB,QAAS,QAAUxyB,EACnB2W,QAASra,EACT0pC,GAAI,QAAUhmC,GACZ,SAAUimC,EAAcC,GAG1BvoC,EAAOG,GAAIooC,GAAa,SAAU3T,EAAQzwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAYgoC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVzwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQphB,KAAM,SAAUqE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCknC,EAAS1qC,QAAS,SACxBwD,EAAM,QAAUgB,GAChBhB,EAAKzE,SAAS+P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK9C,UACTW,EAAMmC,EAAKsL,gBAIJ3J,KAAKivB,IACX5wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM6zB,GAGxBxyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOquB,IAChC7zB,EAAM0f,EAAYuW,OAAS9xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOnD,KAAKooB,GAAIzmB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB61B,KAAM,SAAU3S,EAAO5F,EAAMtf,GAC5B,OAAOnD,KAAKooB,GAAIC,EAAO,KAAM5F,EAAMtf,IAEpCqoC,OAAQ,SAAUnjB,EAAOllB,GACxB,OAAOnD,KAAKyoB,IAAKJ,EAAO,KAAMllB,IAG/BsoC,SAAU,SAAUxoC,EAAUolB,EAAO5F,EAAMtf,GAC1C,OAAOnD,KAAKooB,GAAIC,EAAOplB,EAAUwf,EAAMtf,IAExCuoC,WAAY,SAAUzoC,EAAUolB,EAAOllB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBtD,KAAKyoB,IAAKxlB,EAAU,MACpBjD,KAAKyoB,IAAKJ,EAAOplB,GAAY,KAAME,IAGrCwoC,MAAO,SAAUC,EAAQC,GACxB,OAAO7rC,KAAKkuB,WAAY0d,GAASzd,WAAY0d,GAASD,MAIxD5oC,EAAOkB,KACN,wLAE4DqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBtD,KAAKooB,GAAI/iB,EAAM,KAAMod,EAAMtf,GAC3BnD,KAAKkpB,QAAS7jB,MAUlB,IAAI2E,GAAQ,qCAMZhH,EAAO8oC,MAAQ,SAAU3oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMs3B,EAUf,GARwB,iBAAZ5oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKAtP,EAAY8B,GAalB,OARAqR,EAAOlU,EAAMG,KAAM6D,UAAW,IAC9BwnC,EAAQ,WACP,OAAO3oC,EAAGxC,MAAOuC,GAAWlD,KAAMwU,EAAK9T,OAAQJ,EAAMG,KAAM6D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElC0kC,GAGR9oC,EAAO+oC,UAAY,SAAUC,GACvBA,EACJhpC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOipC,UAAYhpB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO3B,WAAaA,EACpB2B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOmpB,IAAMzjB,KAAKyjB,IAElBnpB,EAAOkpC,UAAY,SAAU5qC,GAK5B,IAAIK,EAAOqB,EAAOrB,KAAML,GACxB,OAAkB,WAATK,GAA8B,WAATA,KAK5BwqC,MAAO7qC,EAAMyxB,WAAYzxB,KAG5B0B,EAAOopC,KAAO,SAAU7pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXqiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOrpC,IAOT,IAGCupC,GAAUxsC,EAAOiD,OAGjBwpC,GAAKzsC,EAAO0sC,EAwBb,OAtBAzpC,EAAO0pC,WAAa,SAAUhnC,GAS7B,OARK3F,EAAO0sC,IAAMzpC,IACjBjD,EAAO0sC,EAAID,IAGP9mC,GAAQ3F,EAAOiD,SAAWA,IAC9BjD,EAAOiD,OAASupC,IAGVvpC,GAMiB,oBAAb/C,IACXF,EAAOiD,OAASjD,EAAO0sC,EAAIzpC,GAMrBA","file":"jquery.min.js"} \ No newline at end of file +{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","rhtmlSuffix","jQuery","selector","context","fn","init","isArrayLike","length","nodeName","elem","name","toLowerCase","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","textContent","documentElement","nodeValue","makeArray","results","inArray","isXMLDoc","namespace","namespaceURI","docElem","ownerDocument","test","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","pop","whitespace","rtrimCSS","RegExp","contains","a","b","bup","compareDocumentPosition","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","escapeSelector","sel","preferredDoc","pushNative","Expr","outermostContext","sortInput","hasDuplicate","documentIsHTML","rbuggyQSA","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","booleans","identifier","attributes","pseudos","rwhitespace","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","unloadHandler","setDocument","inDisabledFieldset","addCombinator","disabled","dir","next","childNodes","e","els","find","seed","m","nid","match","groups","newSelector","newContext","exec","getElementById","id","getElementsByTagName","getElementsByClassName","testContext","scope","tokenize","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","key","cacheLength","shift","markFunction","assert","el","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","subWindow","webkitMatchesSelector","msMatchesSelector","defaultView","top","addEventListener","getById","getElementsByName","disconnectedMatch","cssHas","querySelector","filter","attrId","getAttributeNode","tag","className","input","innerHTML","compare","sortDetached","expr","elements","matchesSelector","attr","attrHandle","uniqueSort","duplicates","sortStable","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","expectedNodeName","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","outerCache","nodeIndex","start","parent","useCache","diff","firstChild","lastChild","pseudo","args","setFilters","idx","matched","not","matcher","compile","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","err","safeActiveElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","nextSibling","header","button","_matchIndexes","lt","gt","nth","radio","checkbox","file","password","image","submit","reset","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","matcherOut","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","filters","unique","getText","isXML","selectors","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","cur","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","list","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","handler","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","rejectWith","getErrorHook","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","asyncError","console","warn","message","stack","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","attrs","dequeue","startLength","hooks","_queueHooks","unshift","stop","setter","clearQueue","tmp","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","defaultValue","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","rhtml","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","on","types","one","origFn","event","off","leverageNative","isSetup","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","isImmediatePropagationStopped","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","Date","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","focusMappedHandler","documentMode","simulate","attaches","dataHolder","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","rcustomProp","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","isCustomProp","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","marginDelta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","aspectRatio","borderImageSlice","columnCount","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","origName","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classNames","curValue","finalValue","removeClass","toggleClass","stateVal","isValidValue","hasClass","rreturn","valHooks","optionSet","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","triggerHandler","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","rtrim","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file diff --git a/node_modules/jquery/dist/jquery.slim.js b/node_modules/jquery/dist/jquery.slim.js index 665bf108c..f122b10de 100644 --- a/node_modules/jquery/dist/jquery.slim.js +++ b/node_modules/jquery/dist/jquery.slim.js @@ -1,15 +1,12 @@ /*! - * jQuery JavaScript Library v3.6.0 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector + * jQuery JavaScript Library v3.7.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/animatedSelector,-effects/Tween * https://jquery.com/ * - * Includes Sizzle.js - * https://sizzlejs.com/ - * * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * - * Date: 2021-03-02T17:08Z + * Date: 2023-08-28T13:37Z */ ( function( global, factory ) { @@ -23,7 +20,7 @@ // (such as Node.js), expose a factory as module.exports. // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. + // See ticket trac-14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { @@ -150,8 +147,9 @@ function toType( obj ) { -var - version = "3.6.0 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector", +var version = "3.7.1 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/animatedSelector,-effects/Tween", + + rhtmlSuffix = /HTML$/i, // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -397,6 +395,38 @@ jQuery.extend( { return obj; }, + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; @@ -419,6 +449,15 @@ jQuery.extend( { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { @@ -520,43 +559,98 @@ function isArrayLike( obj ) { return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ -( function( window ) { + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + var i, - support, Expr, - getText, - isXML, - tokenize, - compile, - select, outermostContext, sortInput, hasDuplicate, + push = pushNative, // Local document vars - setDocument, document, - docElem, + documentElement, documentIsHTML, rbuggyQSA, - rbuggyMatches, matches, - contains, // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, + expando = jQuery.expando, dirruns = 0, done = 0, classCache = createCache(), @@ -570,47 +664,22 @@ var i, return 0; }, - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", // Regular expressions - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", @@ -629,101 +698,88 @@ var i, // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + bool: new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + + needsContext: new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, - rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, - rnative = /^[^{]+\{\s*\[native \w/, - // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonHex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; - return nonHex ? + if ( nonHex ) { // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + return nonHex; } - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, - // Used for iframes - // See setDocument() + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ // Removing the function wrapper causes a "Permission Denied" - // error in IE + // error in IE/Edge. unloadHandler = function() { setDocument(); }, inDisabledFieldset = addCombinator( function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + return elem.disabled === true && nodeName( elem, "fieldset" ); }, { dir: "parentNode", next: "legend" } ); +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + // Optimize for push.apply( _, NodeList ) try { push.apply( @@ -731,32 +787,22 @@ try { preferredDoc.childNodes ); - // Support: Android<4.0 + // Support: Android <=4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { + push = { + apply: function( target, els ) { pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); } }; } -function Sizzle( selector, context, results, seed ) { +function find( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, @@ -790,11 +836,10 @@ function Sizzle( selector, context, results, seed ) { if ( nodeType === 9 ) { if ( ( elem = context.getElementById( m ) ) ) { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if ( elem.id === m ) { - results.push( elem ); + push.call( results, elem ); return results; } } else { @@ -804,14 +849,13 @@ function Sizzle( selector, context, results, seed ) { // Element context } else { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && + find.contains( context, elem ) && elem.id === m ) { - results.push( elem ); + push.call( results, elem ); return results; } } @@ -822,22 +866,15 @@ function Sizzle( selector, context, results, seed ) { return results; // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { newSelector = selector; newContext = context; @@ -850,7 +887,7 @@ function Sizzle( selector, context, results, seed ) { // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { // Expand context for sibling selectors newContext = rsibling.test( selector ) && testContext( context.parentNode ) || @@ -858,11 +895,15 @@ function Sizzle( selector, context, results, seed ) { // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { // Capture the context ID, setting it first if necessary if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); + nid = jQuery.escapeSelector( nid ); } else { context.setAttribute( "id", ( nid = expando ) ); } @@ -895,7 +936,7 @@ function Sizzle( selector, context, results, seed ) { } // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); } /** @@ -909,7 +950,8 @@ function createCache() { function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries @@ -921,7 +963,7 @@ function createCache() { } /** - * Mark a function for special use by Sizzle + * Mark a function for special use by jQuery selector module * @param {Function} fn The function to mark */ function markFunction( fn ) { @@ -952,56 +994,13 @@ function assert( fn ) { } } -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; + return nodeName( elem, "input" ) && elem.type === type; }; } @@ -1011,8 +1010,8 @@ function createInputPseudo( type ) { */ function createButtonPseudo( type ) { return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; }; } @@ -1048,14 +1047,13 @@ function createDisabledPseudo( disabled ) { } } - // Support: IE 6 - 11 + // Support: IE 6 - 11+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually - /* jshint -W018 */ elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; + inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; @@ -1095,7 +1093,7 @@ function createPositionalPseudo( fn ) { } /** - * Checks a node for validity as a Sizzle context + * Checks a node for validity as a jQuery selector context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ @@ -1103,31 +1101,13 @@ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - /** * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document + * @param {Element|Object} [node] An element or document object to use to set the document * @returns {Object} Returns the current document */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, +function setDocument( node ) { + var subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected @@ -1141,87 +1121,90 @@ setDocument = Sizzle.setDocument = function( node ) { // Update global variables document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); } - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; } ); - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); } ); - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); } ); - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } } ); // ID filter and find if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { + Expr.filter.ID = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute( "id" ) === attrId; }; }; - Expr.find[ "ID" ] = function( id, context ) { + Expr.find.ID = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { - Expr.filter[ "ID" ] = function( id ) { + Expr.filter.ID = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && @@ -1232,7 +1215,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { + Expr.find.ID = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); @@ -1262,40 +1245,18 @@ setDocument = Sizzle.setDocument = function( node ) { } // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); + Expr.find.TAG = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + Expr.find.CLASS = function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } @@ -1306,177 +1267,94 @@ setDocument = Sizzle.setDocument = function( node ) { // QSA and matchesSelector support - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { - assert( function( el ) { - el.innerHTML = "" + - ""; + var input; - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); + documentElement.appendChild( el ).innerHTML = + "" + + ""; - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } - assert( function( el ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); + if ( !support.cssHas ) { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { + sortOrder = function( a, b ) { // Flag for duplicate removal if ( a === b ) { @@ -1510,8 +1388,8 @@ setDocument = Sizzle.setDocument = function( node ) { // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { + if ( a === document || a.ownerDocument == preferredDoc && + find.contains( preferredDoc, a ) ) { return -1; } @@ -1519,100 +1397,33 @@ setDocument = Sizzle.setDocument = function( node ) { // IE/Edge sometimes throw a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { + if ( b === document || b.ownerDocument == preferredDoc && + find.contains( preferredDoc, b ) ) { return 1; } // Maintain original order return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; }; return document; -}; +} -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); }; -Sizzle.matchesSelector = function( elem, expr ) { +find.matchesSelector = function( elem, expr ) { setDocument( elem ); - if ( support.matchesSelector && documentIsHTML && + if ( documentIsHTML && !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); @@ -1620,9 +1431,9 @@ Sizzle.matchesSelector = function( elem, expr ) { // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch ( e ) { @@ -1630,10 +1441,10 @@ Sizzle.matchesSelector = function( elem, expr ) { } } - return Sizzle( expr, document, null, [ elem ] ).length > 0; + return find( expr, document, null, [ elem ] ).length > 0; }; -Sizzle.contains = function( context, elem ) { +find.contains = function( context, elem ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ @@ -1643,10 +1454,11 @@ Sizzle.contains = function( context, elem ) { if ( ( context.ownerDocument || context ) != document ) { setDocument( context ); } - return contains( context, elem ); + return jQuery.contains( context, elem ); }; -Sizzle.attr = function( elem, name ) { + +find.attr = function( elem, name ) { // Set document vars if needed // Support: IE 11+, Edge 17 - 18+ @@ -1659,25 +1471,19 @@ Sizzle.attr = function( elem, name ) { var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) + // Don't get fooled by Object.prototype properties (see trac-13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; + if ( val !== undefined ) { + return val; + } -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); + return elem.getAttribute( name ); }; -Sizzle.error = function( msg ) { +find.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; @@ -1685,16 +1491,20 @@ Sizzle.error = function( msg ) { * Document sorting and removing duplicates * @param {ArrayLike} results */ -Sizzle.uniqueSort = function( results ) { +jQuery.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); if ( hasDuplicate ) { while ( ( elem = results[ i++ ] ) ) { @@ -1703,7 +1513,7 @@ Sizzle.uniqueSort = function( results ) { } } while ( j-- ) { - results.splice( duplicates[ j ], 1 ); + splice.call( results, duplicates[ j ], 1 ); } } @@ -1714,47 +1524,11 @@ Sizzle.uniqueSort = function( results ) { return results; }; -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); }; -Expr = Sizzle.selectors = { +Expr = jQuery.expr = { // Can be adjusted by the user cacheLength: 50, @@ -1775,12 +1549,12 @@ Expr = Sizzle.selectors = { }, preFilter: { - "ATTR": function( match ) { + ATTR: function( match ) { match[ 1 ] = match[ 1 ].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) + .replace( runescape, funescape ); if ( match[ 2 ] === "~=" ) { match[ 3 ] = " " + match[ 3 ] + " "; @@ -1789,7 +1563,7 @@ Expr = Sizzle.selectors = { return match.slice( 0, 4 ); }, - "CHILD": function( match ) { + CHILD: function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) @@ -1807,29 +1581,30 @@ Expr = Sizzle.selectors = { // nth-* requires argument if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); + find.error( match[ 0 ] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[ 4 ] = +( match[ 4 ] ? match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) + ); match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - // other types prohibit arguments + // other types prohibit arguments } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); + find.error( match[ 0 ] ); } return match; }, - "PSEUDO": function( match ) { + PSEUDO: function( match ) { var excess, unquoted = !match[ 6 ] && match[ 2 ]; - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { + if ( matchExpr.CHILD.test( match[ 0 ] ) ) { return null; } @@ -1858,36 +1633,36 @@ Expr = Sizzle.selectors = { filter: { - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + TAG: function( nodeNameSelector ) { + var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + return nodeName( elem, expectedNodeName ); }; }, - "CLASS": function( className ) { + CLASS: function( className ) { var pattern = classCache[ className + " " ]; return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); + ( pattern = new RegExp( "(^|" + whitespace + ")" + className + + "(" + whitespace + "|$)" ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); } ); }, - "ATTR": function( name, operator, check ) { + ATTR: function( name, operator, check ) { return function( elem ) { - var result = Sizzle.attr( elem, name ); + var result = find.attr( elem, name ); if ( result == null ) { return operator === "!="; @@ -1898,22 +1673,34 @@ Expr = Sizzle.selectors = { result += ""; - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + return false; }; }, - "CHILD": function( type, what, _argument, first, last ) { + CHILD: function( type, what, _argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; @@ -1926,7 +1713,7 @@ Expr = Sizzle.selectors = { } : function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, + var cache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), @@ -1941,7 +1728,7 @@ Expr = Sizzle.selectors = { node = elem; while ( ( node = node[ dir ] ) ) { if ( ofType ? - node.nodeName.toLowerCase() === name : + nodeName( node, name ) : node.nodeType === 1 ) { return false; @@ -1960,17 +1747,8 @@ Expr = Sizzle.selectors = { if ( forward && useCache ) { // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; @@ -1982,7 +1760,7 @@ Expr = Sizzle.selectors = { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } @@ -1991,17 +1769,8 @@ Expr = Sizzle.selectors = { // Use previously-cached element index if available if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex; } @@ -2015,7 +1784,7 @@ Expr = Sizzle.selectors = { ( diff = nodeIndex = 0 ) || start.pop() ) ) { if ( ( ofType ? - node.nodeName.toLowerCase() === name : + nodeName( node, name ) : node.nodeType === 1 ) && ++diff ) { @@ -2023,13 +1792,7 @@ Expr = Sizzle.selectors = { if ( useCache ) { outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; + outerCache[ type ] = [ dirruns, diff ]; } if ( node === elem ) { @@ -2047,19 +1810,19 @@ Expr = Sizzle.selectors = { }; }, - "PSEUDO": function( pseudo, argument ) { + PSEUDO: function( pseudo, argument ) { // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes + // https://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); + find.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function - // just as Sizzle does + // just as jQuery does if ( fn[ expando ] ) { return fn( argument ); } @@ -2073,7 +1836,7 @@ Expr = Sizzle.selectors = { matched = fn( seed, argument ), i = matched.length; while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); + idx = indexOf.call( seed, matched[ i ] ); seed[ idx ] = !( matches[ idx ] = matched[ i ] ); } } ) : @@ -2089,14 +1852,14 @@ Expr = Sizzle.selectors = { pseudos: { // Potentially complex pseudos - "not": markFunction( function( selector ) { + not: markFunction( function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); + matcher = compile( selector.replace( rtrimCSS, "$1" ) ); return matcher[ expando ] ? markFunction( function( seed, matches, _context, xml ) { @@ -2115,22 +1878,23 @@ Expr = Sizzle.selectors = { input[ 0 ] = elem; matcher( input, null, xml, results ); - // Don't keep the element (issue #299) + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) input[ 0 ] = null; return !results.pop(); }; } ), - "has": markFunction( function( selector ) { + has: markFunction( function( selector ) { return function( elem ) { - return Sizzle( selector, elem ).length > 0; + return find( selector, elem ).length > 0; }; } ), - "contains": markFunction( function( text ) { + contains: markFunction( function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; }; } ), @@ -2140,12 +1904,12 @@ Expr = Sizzle.selectors = { // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); + find.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { @@ -2164,38 +1928,39 @@ Expr = Sizzle.selectors = { } ), // Miscellaneous - "target": function( elem ) { + target: function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, - "root": function( elem ) { - return elem === docElem; + root: function( elem ) { + return elem === documentElement; }, - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && + focus: function( elem ) { + return elem === safeActiveElement() && + document.hasFocus() && !!( elem.type || elem.href || ~elem.tabIndex ); }, // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), - "checked": function( elem ) { + checked: function( elem ) { // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); }, - "selected": function( elem ) { + selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. if ( elem.parentNode ) { // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; @@ -2205,9 +1970,9 @@ Expr = Sizzle.selectors = { }, // Contents - "empty": function( elem ) { + empty: function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo + // https://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children @@ -2219,49 +1984,49 @@ Expr = Sizzle.selectors = { return true; }, - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); + parent: function( elem ) { + return !Expr.pseudos.empty( elem ); }, // Element/input types - "header": function( elem ) { + header: function( elem ) { return rheader.test( elem.nodeName ); }, - "input": function( elem ) { + input: function( elem ) { return rinputs.test( elem.nodeName ); }, - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; + button: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); }, - "text": function( elem ) { + text: function( elem ) { var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && + return nodeName( elem, "input" ) && elem.type === "text" && - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + // Support: IE <10 only + // New HTML5 attribute values (e.g., "search") appear + // with elem.type === "text" ( ( attr = elem.getAttribute( "type" ) ) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection - "first": createPositionalPseudo( function() { + first: createPositionalPseudo( function() { return [ 0 ]; } ), - "last": createPositionalPseudo( function( _matchIndexes, length ) { + last: createPositionalPseudo( function( _matchIndexes, length ) { return [ length - 1 ]; } ), - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; } ), - "even": createPositionalPseudo( function( matchIndexes, length ) { + even: createPositionalPseudo( function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); @@ -2269,7 +2034,7 @@ Expr = Sizzle.selectors = { return matchIndexes; } ), - "odd": createPositionalPseudo( function( matchIndexes, length ) { + odd: createPositionalPseudo( function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); @@ -2277,19 +2042,24 @@ Expr = Sizzle.selectors = { return matchIndexes; } ), - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; } ), - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); @@ -2299,7 +2069,7 @@ Expr = Sizzle.selectors = { } }; -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; +Expr.pseudos.nth = Expr.pseudos.eq; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { @@ -2314,7 +2084,7 @@ function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { +function tokenize( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; @@ -2342,13 +2112,13 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) { matched = false; // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { matched = match.shift(); tokens.push( { value: matched, // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) + type: match[ 0 ].replace( rtrimCSS, " " ) } ); soFar = soFar.slice( matched.length ); } @@ -2375,14 +2145,16 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) { // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : + if ( parseOnly ) { + return soFar.length; + } - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; + return soFar ? + find.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} function toSelector( tokens ) { var i = 0, @@ -2415,7 +2187,7 @@ function addCombinator( matcher, combinator, base ) { // Check against all ancestor/preceding elements function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, + var oldCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching @@ -2432,14 +2204,9 @@ function addCombinator( matcher, combinator, base ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { + if ( skip && nodeName( elem, skip ) ) { elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && + } else if ( ( oldCache = outerCache[ key ] ) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements @@ -2447,7 +2214,7 @@ function addCombinator( matcher, combinator, base ) { } else { // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; + outerCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { @@ -2479,7 +2246,7 @@ function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); + find( selector, contexts[ i ], results ); } return results; } @@ -2513,38 +2280,37 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS postFinder = setMatcher( postFinder, postSelector ); } return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, + var temp, i, elem, matcherOut, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), + elems = seed || + multipleContexts( selector || "*", + context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : - elems, + elems; - matcherOut = matcher ? + if ( matcher ) { - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - // ...intermediate processing is necessary - [] : + // ...intermediate processing is necessary + [] : - // ...otherwise use results directly - results : - matcherIn; + // ...otherwise use results directly + results; - // Find primary matches - if ( matcher ) { + // Find primary matches matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; } // Apply postFilter @@ -2582,7 +2348,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS i = matcherOut.length; while ( i-- ) { if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { seed[ temp ] = !( results[ temp ] = elem ); } @@ -2617,15 +2383,21 @@ function matcherFromTokens( tokens ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; + return indexOf.call( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( ( checkContext = context ).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) checkContext = null; return ret; } ]; @@ -2650,11 +2422,10 @@ function matcherFromTokens( tokens ) { i > 1 && elementMatcher( matchers ), i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrimCSS, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), @@ -2680,7 +2451,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { contextBackup = outermostContext, // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + elems = seed || byElement && Expr.find.TAG( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), @@ -2696,8 +2467,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { } // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + // Support: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: ) matching + // elements by id. (see trac-14142) for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { if ( byElement && elem ) { j = 0; @@ -2712,7 +2484,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { } while ( ( matcher = elementMatchers[ j++ ] ) ) { if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); + push.call( results, elem ); break; } } @@ -2775,7 +2547,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { - Sizzle.uniqueSort( results ); + jQuery.uniqueSort( results ); } } @@ -2793,7 +2565,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { superMatcher; } -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { +function compile( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], @@ -2816,27 +2588,25 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { } // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; -}; +} /** - * A low-level selection function that works with Sizzle's compiled + * A low-level selection function that works with jQuery's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile + * selector function built with jQuery selector compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ -select = Sizzle.select = function( selector, context, results, seed ) { +function select( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( ( selector = compiled.selector || selector ) ); @@ -2850,10 +2620,12 @@ select = Sizzle.select = function( selector, context, results, seed ) { // Reduce context if the leading compound selector is an ID tokens = match[ 0 ] = match[ 0 ].slice( 0 ); if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; + context = ( Expr.find.ID( + token.matches[ 0 ].replace( runescape, funescape ), + context + ) || [] )[ 0 ]; if ( !context ) { return results; @@ -2866,7 +2638,7 @@ select = Sizzle.select = function( selector, context, results, seed ) { } // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[ i ]; @@ -2879,8 +2651,8 @@ select = Sizzle.select = function( selector, context, results, seed ) { // Search, expanding context for leading sibling combinators if ( ( seed = find( token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context ) ) ) { // If seed is empty or no tokens remain, we can return early @@ -2907,21 +2679,18 @@ select = Sizzle.select = function( selector, context, results, seed ) { !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; -}; +} // One-time assignments +// Support: Android <=4.0 - 4.1+ // Sort stability support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - // Initialize against the default document setDocument(); -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Support: Android <=4.0 - 4.1+ // Detached nodes confoundingly follow *each other* support.sortDetached = assert( function( el ) { @@ -2929,68 +2698,29 @@ support.sortDetached = assert( function( el ) { return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; } ); -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; +jQuery.find = find; // Deprecated jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + /* eslint-enable */ + +} )(); var dir = function( elem, dir, until ) { @@ -3024,13 +2754,6 @@ var siblings = function( n, elem ) { var rneedsContext = jQuery.expr.match.needsContext; - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -} var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); @@ -3129,8 +2852,8 @@ jQuery.fn.extend( { var rootjQuery, // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) + // Prioritize #id over to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, @@ -3281,7 +3004,7 @@ jQuery.fn.extend( { if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : - // Don't pass non-elements to Sizzle + // Don't pass non-elements to jQuery#find cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { @@ -3836,7 +3559,7 @@ jQuery.extend( { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, - process.stackTrace ); + process.error ); } // Support: Promises/A+ section 2.3.3.3.4.1 @@ -3864,10 +3587,17 @@ jQuery.extend( { process(); } else { - // Call an optional hook to record the stack, in case of exception + // Call an optional hook to record the error, in case of exception // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } @@ -4042,12 +3772,16 @@ jQuery.extend( { // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; -jQuery.Deferred.exceptionHook = function( error, stack ) { +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + window.console.warn( "jQuery.Deferred exception: " + error.message, + error.stack, asyncError ); } }; @@ -4087,7 +3821,7 @@ jQuery.extend( { isReady: false, // A counter to track how many items to wait for before - // the ready event fires. See #6781 + // the ready event fires. See trac-6781 readyWait: 1, // Handle when the DOM is ready @@ -4215,7 +3949,7 @@ function fcamelCase( _all, letter ) { // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) +// Microsoft forgot to hump their vendor prefix (trac-9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } @@ -4251,7 +3985,7 @@ Data.prototype = { value = {}; // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. + // but we should not, see trac-8335. // Always return an empty object. if ( acceptData( owner ) ) { @@ -4490,7 +4224,7 @@ jQuery.fn.extend( { while ( i-- ) { // Support: IE 11 only - // The attrs elements can be null (#14894) + // The attrs elements can be null (trac-14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { @@ -4913,9 +4647,9 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) + // Check state lost if the name is set (trac-11217) // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) + // `name` and `type` must use .setAttribute for WWA (trac-14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); @@ -4939,7 +4673,7 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); } )(); -// We have to close these tags to support XHTML (#13200) +// We have to close these tags to support XHTML (trac-13200) var wrapMap = { // XHTML parsers do not magically insert elements in the @@ -4965,7 +4699,7 @@ if ( !support.option ) { function getAll( context, tag ) { // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { @@ -5048,7 +4782,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { // Remember the top-level container tmp = fragment.firstChild; - // Ensure the created nodes are orphaned (#12392) + // Ensure the created nodes are orphaned (trac-12392) tmp.textContent = ""; } } @@ -5103,25 +4837,6 @@ function returnFalse() { return false; } -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - function on( elem, types, selector, data, fn, one ) { var origFn, type; @@ -5469,15 +5184,15 @@ jQuery.event = { for ( ; cur !== this; cur = cur.parentNode || this ) { - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; - // Don't conflict with Object.prototype properties (#13203) + // Don't conflict with Object.prototype properties (trac-13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { @@ -5559,7 +5274,7 @@ jQuery.event = { el.click && nodeName( el, "input" ) ) { // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); + leverageNative( el, "click", true ); } // Return false to allow normal processing in the caller @@ -5610,10 +5325,10 @@ jQuery.event = { // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { +function leverageNative( el, type, isSetup ) { - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { if ( dataPriv.get( el, type ) === undefined ) { jQuery.event.add( el, type, returnTrue ); } @@ -5625,15 +5340,13 @@ function leverageNative( el, type, expectSync ) { jQuery.event.add( el, type, { namespace: false, handler: function( event ) { - var notAsync, result, + var result, saved = dataPriv.get( this, type ); if ( ( event.isTrigger & 1 ) && this[ type ] ) { // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { + if ( !saved ) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array @@ -5642,33 +5355,22 @@ function leverageNative( el, type, expectSync ) { dataPriv.set( this, type, saved ); // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); this[ type ](); result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } + dataPriv.set( this, type, false ); + if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; + return result; } // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. @@ -5678,22 +5380,25 @@ function leverageNative( el, type, expectSync ) { // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { + } else if ( saved ) { // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; } } } ); @@ -5731,7 +5436,7 @@ jQuery.Event = function( src, props ) { // Create target properties // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) + // Target should not be a text node (trac-504, trac-13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; @@ -5832,18 +5537,73 @@ jQuery.each( { }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); + } + } else { + + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); + } + } + jQuery.event.special[ type ] = { // Utilize native event if possible so blur/focus sequence is correct setup: function() { + var attaches; + // Claim the first handler // dataPriv.set( this, "focus", ... ) // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); + leverageNative( this, type, true ); - // Return false to allow normal processing in the caller - return false; + if ( document.documentMode ) { + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // Return false to allow normal processing in the caller + return false; + } }, trigger: function() { @@ -5854,14 +5614,84 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp return true; }, - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); }, delegateType: delegateType }; + + // Support: Firefox <=44 + // Firefox doesn't have focus(in | out) events + // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + // + // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 + // focus(in | out) events fire after focus & blur events, + // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order + // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; } ); // Create mouseenter/leave events using mouseover/out and event-time checks @@ -5956,7 +5786,8 @@ var // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rcleanScript = /^\s*\s*$/g; + + rcleanScript = /^\s*\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { @@ -6070,7 +5901,7 @@ function domManip( collection, args, callback, ignored ) { // Use the original fragment for the last item // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). + // being emptied incorrectly in certain situations (trac-8070). for ( ; i < l; i++ ) { node = fragment; @@ -6092,7 +5923,7 @@ function domManip( collection, args, callback, ignored ) { if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; - // Reenable scripts + // Re-enable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion @@ -6111,6 +5942,12 @@ function domManip( collection, args, callback, ignored ) { }, doc ); } } else { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } @@ -6157,7 +5994,8 @@ jQuery.extend( { if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + // We eschew jQuery#find here for performance reasons: + // https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); @@ -6393,9 +6231,12 @@ jQuery.each( { } ); var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); +var rcustomProp = /^--/; + + var getStyles = function( elem ) { - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; @@ -6495,7 +6336,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); } // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) + // Style of cloned element affects source element cloned (trac-8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; @@ -6539,7 +6380,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); trChild = document.createElement( "div" ); table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; // Support: Chrome 86+ // Height set through cssText does not get applied. @@ -6551,7 +6392,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); // In our bodyBackground.html iframe, // display for all div elements is set to "inline", // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block + // Ensuring the div is `display: block` // gets around this issue. trChild.style.display = "block"; @@ -6575,6 +6416,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), // Support: Firefox 51+ // Retrieving style before computed somehow @@ -6585,11 +6427,42 @@ function curCSS( elem, name, computed ) { computed = computed || getStyles( elem ); // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) + // .css('filter') (IE 9 only, trac-12537) + // .css('--customProperty) (gh-3144) if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` ret = computed.getPropertyValue( name ) || computed[ name ]; + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } @@ -6685,7 +6558,6 @@ var // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", @@ -6707,7 +6579,8 @@ function setPositiveNumber( _elem, value, subtract ) { function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, - delta = 0; + delta = 0, + marginDelta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { @@ -6717,8 +6590,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed for ( ; i < 4; i += 2 ) { // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" @@ -6769,7 +6644,7 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed ) ) || 0; } - return delta; + return delta + marginDelta; } function getWidthOrHeight( elem, dimension, extra ) { @@ -6867,26 +6742,35 @@ jQuery.extend( { // Don't automatically add "px" to these possibly-unitless properties cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true + animationIterationCount: true, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: true }, // Add in properties whose names you wish to fix before @@ -6921,15 +6805,15 @@ jQuery.extend( { if ( value !== undefined ) { type = typeof value; - // Convert "+=" or "-=" to relative numbers (#7345) + // Convert "+=" or "-=" to relative numbers (trac-7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); - // Fixes bug #9237 + // Fixes bug trac-9237 type = "number"; } - // Make sure that null and NaN values aren't set (#7116) + // Make sure that null and NaN values aren't set (trac-7116) if ( value == null || value !== value ) { return; } @@ -7149,7 +7033,6 @@ jQuery.fn.extend( { // Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; @@ -7374,8 +7257,7 @@ jQuery.extend( { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) + // Use proper attribute retrieval (trac-12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { @@ -7479,8 +7361,7 @@ function classesToArray( value ) { jQuery.fn.extend( { addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; + var classNames, cur, curValue, className, i, finalValue; if ( isFunction( value ) ) { return this.each( function( j ) { @@ -7488,36 +7369,35 @@ jQuery.fn.extend( { } ); } - classes = classesToArray( value ); + classNames = classesToArray( value ); - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); + this.setAttribute( "class", finalValue ); } } - } + } ); } return this; }, removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; + var classNames, cur, curValue, className, i, finalValue; if ( isFunction( value ) ) { return this.each( function( j ) { @@ -7529,45 +7409,42 @@ jQuery.fn.extend( { return this.attr( "class", "" ); } - classes = classesToArray( value ); + classNames = classesToArray( value ); - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); + this.setAttribute( "class", finalValue ); } } - } + } ); } return this; }, toggleClass: function( value, stateVal ) { - var type = typeof value, + var classNames, className, i, self, + type = typeof value, isValidValue = type === "string" || Array.isArray( value ); - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( @@ -7577,17 +7454,20 @@ jQuery.fn.extend( { } ); } - return this.each( function() { - var className, i, self, classNames; + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + classNames = classesToArray( value ); + return this.each( function() { if ( isValidValue ) { // Toggle individual class names - i = 0; self = jQuery( this ); - classNames = classesToArray( value ); - while ( ( className = classNames[ i++ ] ) ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; // Check each className given, space separated list if ( self.hasClass( className ) ) { @@ -7721,7 +7601,7 @@ jQuery.extend( { val : // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) + // option.text throws exceptions (trac-14686, trac-14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); @@ -7748,7 +7628,7 @@ jQuery.extend( { option = options[ i ]; // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) + // IE8-9 doesn't update selected after form reset (trac-2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup @@ -7824,7 +7704,31 @@ jQuery.each( [ "radio", "checkbox" ], function() { // Return jQuery for attributes-only inclusion -support.focusin = "onfocusin" in window; +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, @@ -7891,8 +7795,8 @@ jQuery.extend( jQuery.event, { return; } - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + // Determine event propagation path in advance, per W3C events spec (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; @@ -7944,7 +7848,7 @@ jQuery.extend( jQuery.event, { acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) + // Don't do default actions on window, that's where global variables be (trac-6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method @@ -8012,79 +7916,6 @@ jQuery.fn.extend( { } ); -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml, parserErrorElem; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) {} - - parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; - if ( !xml || parserErrorElem ) { - jQuery.error( "Invalid XML: " + ( - parserErrorElem ? - jQuery.map( parserErrorElem.childNodes, function( el ) { - return el.textContent; - } ).join( "\n" ) : - data - ) ); - } - return xml; -}; - - var rbracket = /\[\]$/, rCRLF = /\r?\n/g, @@ -8630,7 +8461,9 @@ jQuery.fn.extend( { }, hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + return this + .on( "mouseenter", fnOver ) + .on( "mouseleave", fnOut || fnOver ); } } ); @@ -8654,7 +8487,9 @@ jQuery.each( // Support: Android <=4.0 only // Make sure we trim BOM and NBSP -var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; +// Require that the "whitespace run" starts from a non-whitespace +// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. +var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; // Bind a function to a context, optionally partially applying any // arguments. @@ -8721,7 +8556,7 @@ jQuery.isNumeric = function( obj ) { jQuery.trim = function( text ) { return text == null ? "" : - ( text + "" ).replace( rtrim, "" ); + ( text + "" ).replace( rtrim, "$1" ); }; @@ -8769,8 +8604,8 @@ jQuery.noConflict = function( deep ) { }; // Expose jQuery and $ identifiers, even in AMD -// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (#13566) +// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (trac-13566) if ( typeof noGlobal === "undefined" ) { window.jQuery = window.$ = jQuery; } diff --git a/node_modules/jquery/dist/jquery.slim.min.js b/node_modules/jquery/dist/jquery.slim.min.js index 7556941f5..35906b929 100644 --- a/node_modules/jquery/dist/jquery.slim.min.js +++ b/node_modules/jquery/dist/jquery.slim.min.js @@ -1,2 +1,2 @@ -/*! jQuery v3.6.0 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(g,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,v=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),m={},b=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},w=g.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function C(e,t,n){var r,i,o=(n=n||w).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function T(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0 -ajax,-ajax/jsonp,-ajax/load,-ajax/script,-ajax/var/location,-ajax/var/nonce,-ajax/var/rquery,-ajax/xhr,-manipulation/_evalUrl,-deprecated/ajax-event-alias,-effects,-effects/Tween,-effects/animatedSelector",E=function(e,t){return new E.fn.init(e,t)};function d(e){var t=!!e&&"length"in e&&e.length,n=T(e);return!b(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+R+")"+R+"*"),U=new RegExp(R+"|>"),V=new RegExp(W),X=new RegExp("^"+B+"$"),Q={ID:new RegExp("^#("+B+")"),CLASS:new RegExp("^\\.("+B+")"),TAG:new RegExp("^("+B+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+I+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,G=/^(?:input|select|textarea|button)$/i,K=/^h\d$/i,J=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+R+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){C()},ae=xe(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{O.apply(t=P.call(d.childNodes),d.childNodes),t[d.childNodes.length].nodeType}catch(e){O={apply:t.length?function(e,t){q.apply(e,P.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(C(e),e=e||T,E)){if(11!==d&&(u=Z.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return O.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&p.getElementsByClassName&&e.getElementsByClassName)return O.apply(n,e.getElementsByClassName(i)),n}if(p.qsa&&!k[t+" "]&&(!v||!v.test(t))&&(1!==d||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===d&&(U.test(t)||_.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&p.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=A)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+be(l[o]);c=l.join(",")}try{return O.apply(n,f.querySelectorAll(c)),n}catch(e){k(t,!0)}finally{s===A&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[A]=!0,e}function ce(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)x.attrHandle[n[r]]=t}function de(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in p=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},C=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:d;return r!=T&&9===r.nodeType&&r.documentElement&&(a=(T=r).documentElement,E=!i(T),d!=T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),p.scope=ce(function(e){return a.appendChild(e).appendChild(T.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),p.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=ce(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=J.test(T.getElementsByClassName),p.getById=ce(function(e){return a.appendChild(e).id=A,!T.getElementsByName||!T.getElementsByName(A).length}),p.getById?(x.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=p.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},x.find.CLASS=p.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(p.qsa=J.test(T.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+R+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+R+"*(?:value|"+I+")"),e.querySelectorAll("[id~="+A+"-]").length||v.push("~="),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+R+"*name"+R+"*="+R+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+A+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+R+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(p.matchesSelector=J.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){p.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",W)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=J.test(a.compareDocumentPosition),y=t||J.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e==T||e.ownerDocument==d&&y(d,e)?-1:t==T||t.ownerDocument==d&&y(d,t)?1:u?H(u,e)-H(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==T?-1:t==T?1:i?-1:o?1:u?H(u,e)-H(u,t):0;if(i===o)return de(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?de(a[r],s[r]):a[r]==d?-1:s[r]==d?1:0}),T},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(C(e),p.matchesSelector&&E&&!k[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){k(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&V.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+R+")"+e+"("+R+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return b(n)?E.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?E.grep(e,function(e){return e===n!==r}):"string"!=typeof n?E.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(E.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||L,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:j.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof E?t[0]:t,E.merge(this,E.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:w,!0)),k.test(r[1])&&E.isPlainObject(t))for(r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=w.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(E):E.makeArray(e,this)}).prototype=E.fn,L=E(w);var q=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}E.fn.extend({has:function(e){var t=E(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,pe=/^$|^module$|\/(?:java|ecma)script/i;le=w.createDocumentFragment().appendChild(w.createElement("div")),(ce=w.createElement("input")).setAttribute("type","radio"),ce.setAttribute("checked","checked"),ce.setAttribute("name","t"),le.appendChild(ce),m.checkClone=le.cloneNode(!0).cloneNode(!0).lastChild.checked,le.innerHTML="",m.noCloneChecked=!!le.cloneNode(!0).lastChild.defaultValue,le.innerHTML="",m.option=!!le.lastChild;var he={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ge(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&S(e,t)?E.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|&#?\w+;/;function me(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function ke(e,t){return S(e,"table")&&S(11!==t.nodeType?t:t.firstChild,"tr")&&E(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function je(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n
    ",2===lt.childNodes.length),E.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(m.createHTMLDocument?((r=(t=w.implementation.createHTMLDocument("")).createElement("base")).href=w.location.href,t.head.appendChild(r)):t=w),o=!n&&[],(i=k.exec(e))?[t.createElement(i[1])]:(i=me([e],t,o),o&&o.length&&E(o).remove(),E.merge([],i.childNodes)));var r,i,o},E.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=E.css(e,"position"),c=E(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=E.css(e,"top"),u=E.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),b(t)&&(t=t.call(e,n,E.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},E.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){E.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===E.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===E.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=E(e).offset()).top+=E.css(e,"borderTopWidth",!0),i.left+=E.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-E.css(r,"marginTop",!0),left:t.left-i.left-E.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===E.css(e,"position"))e=e.offsetParent;return e||re})}}),E.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;E.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),E.each(["top","left"],function(e,n){E.cssHooks[n]=Me(m.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?E(e).position()[n]+"px":t})}),E.each({Height:"height",Width:"width"},function(a,s){E.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){E.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?E.css(e,t,i):E.style(e,t,n,i)},s,n?e:void 0,n)}})}),E.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),E.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){E.fn[n]=function(e,t){return 0+~]|"+ge+")"+ge+"*"),b=new RegExp(ge+"|>"),A=new RegExp(g),D=new RegExp("^"+t+"$"),N={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+d),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},L=/^(?:input|select|textarea|button)$/i,j=/^h\d$/i,O=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,P=/[+~]/,H=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),q=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},R=function(){V()},M=K(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{E.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){E={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(V(e),e=e||C,T)){if(11!==d&&(u=O.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return E.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return E.call(n,a),n}else{if(u[2])return E.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return E.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||p&&p.test(t))){if(c=t,f=e,1===d&&(b.test(t)||m.test(t))){(f=P.test(t)&&X(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=k)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+G(l[o]);c=l.join(",")}try{return E.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function B(e){return e[k]=!0,e}function F(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function $(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&M(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function U(a){return B(function(o){return o=+o,B(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function X(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=C&&9===n.nodeType&&n.documentElement&&(r=(C=n).documentElement,T=!ce.isXMLDoc(C),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=C&&(t=C.defaultView)&&t.top!==t&&t.addEventListener("unload",R),le.getById=F(function(e){return r.appendChild(e).id=ce.expando,!C.getElementsByName||!C.getElementsByName(ce.expando).length}),le.disconnectedMatch=F(function(e){return i.call(e,"*")}),le.scope=F(function(){return C.querySelectorAll(":scope")}),le.cssHas=F(function(){try{return C.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(x.filter.ID=function(e){var t=e.replace(H,q);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&T){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(H,q);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&T){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},x.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&T)return t.getElementsByClassName(e)},p=[],F(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||p.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+k+"-]").length||p.push("~="),e.querySelectorAll("a#"+k+"+*").length||p.push(".#.+[+~]"),e.querySelectorAll(":checked").length||p.push(":checked"),(t=C.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&p.push(":enabled",":disabled"),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||p.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||p.push(":has"),p=p.length&&new RegExp(p.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===C||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),C}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),T&&!h[t+" "]&&(!p||!p.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(H,q),e[3]=(e[3]||e[4]||e[5]||"").replace(H,q),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return N.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&A.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(H,q).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||E,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:k.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:m,!0)),C.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=m.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,E=ce(m);var S=/^(?:parents|prev(?:Until|All))/,A={children:!0,contents:!0,next:!0,prev:!0};function D(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;re=m.createDocumentFragment().appendChild(m.createElement("div")),(be=m.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),re.appendChild(be),le.checkClone=re.cloneNode(!0).cloneNode(!0).lastChild.checked,re.innerHTML="",le.noCloneChecked=!!re.cloneNode(!0).lastChild.defaultValue,re.innerHTML="",le.option=!!re.lastChild;var Te={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function Ee(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function ke(e,t){for(var n=0,r=e.length;n",""]);var Se=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Me(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Ie(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function We(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n
    ",2===yt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=m.implementation.createHTMLDocument("")).createElement("base")).href=m.location.href,t.head.appendChild(r)):t=m),o=!n&&[],(i=C.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||K})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return R(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Qe(le.pixelPosition,function(e,t){if(t)return t=Ve(e,n),$e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return R(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 0"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","opt","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","cssHooks","opacity","cssNumber","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","initialInUnit","adjustCSS","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","delay","time","fx","speeds","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","propHooks","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","hidden","visible","createHTMLDocument","implementation","keepScripts","parsed","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollLeft","scrollTop","scrollTo","Height","Width","","defaultExtra","funcName","bind","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.slim.min.js"} \ No newline at end of file +{"version":3,"sources":["jquery.slim.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","rhtmlSuffix","jQuery","selector","context","fn","init","isArrayLike","length","nodeName","elem","name","toLowerCase","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","textContent","documentElement","nodeValue","makeArray","results","inArray","isXMLDoc","namespace","namespaceURI","docElem","ownerDocument","test","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","pop","whitespace","rtrimCSS","RegExp","contains","a","b","bup","compareDocumentPosition","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","escapeSelector","sel","preferredDoc","pushNative","Expr","outermostContext","sortInput","hasDuplicate","documentIsHTML","rbuggyQSA","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","booleans","identifier","attributes","pseudos","rwhitespace","rcomma","rleadingCombinator","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","unloadHandler","setDocument","inDisabledFieldset","addCombinator","disabled","dir","next","childNodes","e","els","find","seed","m","nid","match","groups","newSelector","newContext","exec","getElementById","id","getElementsByTagName","getElementsByClassName","testContext","scope","tokenize","toSelector","join","querySelectorAll","qsaError","removeAttribute","select","keys","cache","key","cacheLength","shift","markFunction","assert","el","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","subWindow","webkitMatchesSelector","msMatchesSelector","defaultView","top","addEventListener","getById","getElementsByName","disconnectedMatch","cssHas","querySelector","filter","attrId","getAttributeNode","tag","className","input","innerHTML","compare","sortDetached","expr","elements","matchesSelector","attr","attrHandle","uniqueSort","duplicates","sortStable","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","expectedNodeName","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","outerCache","nodeIndex","start","parent","useCache","diff","firstChild","lastChild","pseudo","args","setFilters","idx","matched","not","matcher","compile","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","err","safeActiveElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","nextSibling","header","button","_matchIndexes","lt","gt","nth","radio","checkbox","file","password","image","submit","reset","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","matcherOut","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","filters","unique","getText","isXML","selectors","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","cur","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","list","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","handler","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","rejectWith","getErrorHook","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","asyncError","console","warn","message","stack","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","attrs","dequeue","startLength","hooks","_queueHooks","unshift","stop","setter","clearQueue","tmp","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","defaultValue","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","rhtml","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","on","types","one","origFn","event","off","leverageNative","isSetup","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","isImmediatePropagationStopped","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","Event","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","Date","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","focusMappedHandler","documentMode","simulate","attaches","dataHolder","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","rcustomProp","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","isCustomProp","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","opt","rdisplayswap","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","marginDelta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","cssHooks","opacity","cssNumber","animationIterationCount","aspectRatio","borderImageSlice","columnCount","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","scale","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeMiterlimit","strokeOpacity","origName","valueParts","tween","adjusted","maxIterations","currentValue","initial","unit","initialInUnit","adjustCSS","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","delay","time","fx","speeds","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","propHooks","tabindex","for","class","addClass","classNames","curValue","finalValue","removeClass","toggleClass","stateVal","isValidValue","hasClass","rreturn","valHooks","optionSet","parseXML","parserErrorElem","DOMParser","parseFromString","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","triggerHandler","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","hidden","visible","createHTMLDocument","implementation","keepScripts","parsed","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollLeft","scrollTop","scrollTo","Height","Width","","defaultExtra","funcName","bind","unbind","delegate","undelegate","hover","fnOver","fnOut","rtrim","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.slim.min.js"} \ No newline at end of file diff --git a/node_modules/jquery/external/sizzle/LICENSE.txt b/node_modules/jquery/external/sizzle/LICENSE.txt deleted file mode 100644 index 88fcd178b..000000000 --- a/node_modules/jquery/external/sizzle/LICENSE.txt +++ /dev/null @@ -1,36 +0,0 @@ -Copyright JS Foundation and other contributors, https://js.foundation/ - -This software consists of voluntary contributions made by many -individuals. For exact contribution history, see the revision history -available at https://github.com/jquery/sizzle - -The following license applies to all parts of this software except as -documented below: - -==== - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -==== - -All files located in the node_modules and external directories are -externally maintained libraries used by this software which have their -own licenses; we recommend you read them, as their terms may differ from -the terms above. diff --git a/node_modules/jquery/external/sizzle/dist/sizzle.js b/node_modules/jquery/external/sizzle/dist/sizzle.js deleted file mode 100644 index 24a496423..000000000 --- a/node_modules/jquery/external/sizzle/dist/sizzle.js +++ /dev/null @@ -1,2478 +0,0 @@ -/*! - * Sizzle CSS Selector Engine v2.3.6 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2021-02-16 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -// EXPOSE -var _sizzle = window.Sizzle; - -Sizzle.noConflict = function() { - if ( window.Sizzle === Sizzle ) { - window.Sizzle = _sizzle; - } - - return Sizzle; -}; - -if ( typeof define === "function" && define.amd ) { - define( function() { - return Sizzle; - } ); - -// Sizzle requires that there be a global window in Common-JS like environments -} else if ( typeof module !== "undefined" && module.exports ) { - module.exports = Sizzle; -} else { - window.Sizzle = Sizzle; -} - -// EXPOSE - -} )( window ); diff --git a/node_modules/jquery/external/sizzle/dist/sizzle.min.js b/node_modules/jquery/external/sizzle/dist/sizzle.min.js deleted file mode 100644 index 82af986f2..000000000 --- a/node_modules/jquery/external/sizzle/dist/sizzle.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! Sizzle v2.3.6 | (c) JS Foundation and other contributors | js.foundation */ -!function(e){var t,n,r,i,o,u,l,a,c,s,d,f,p,h,g,m,y,v,w,b="sizzle"+1*new Date,N=e.document,C=0,x=0,E=ae(),A=ae(),S=ae(),D=ae(),T=function(e,t){return e===t&&(d=!0),0},L={}.hasOwnProperty,q=[],I=q.pop,B=q.push,R=q.push,$=q.slice,k=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),V=new RegExp(M+"|>"),X=new RegExp(F),J=new RegExp("^"+P+"$"),K={ID:new RegExp("^#("+P+")"),CLASS:new RegExp("^\\.("+P+")"),TAG:new RegExp("^("+P+"|[*])"),ATTR:new RegExp("^"+z),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+H+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/HTML$/i,W=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){f()},ue=ve(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{R.apply(q=$.call(N.childNodes),N.childNodes),q[N.childNodes.length].nodeType}catch(e){R={apply:q.length?function(e,t){B.apply(e,$.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function le(e,t,r,i){var o,l,c,s,d,h,y,v=t&&t.ownerDocument,N=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==N&&9!==N&&11!==N)return r;if(!i&&(f(t),t=t||p,g)){if(11!==N&&(d=_.exec(e)))if(o=d[1]){if(9===N){if(!(c=t.getElementById(o)))return r;if(c.id===o)return r.push(c),r}else if(v&&(c=v.getElementById(o))&&w(t,c)&&c.id===o)return r.push(c),r}else{if(d[2])return R.apply(r,t.getElementsByTagName(e)),r;if((o=d[3])&&n.getElementsByClassName&&t.getElementsByClassName)return R.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!D[e+" "]&&(!m||!m.test(e))&&(1!==N||"object"!==t.nodeName.toLowerCase())){if(y=e,v=t,1===N&&(V.test(e)||U.test(e))){(v=ee.test(e)&&ge(t.parentNode)||t)===t&&n.scope||((s=t.getAttribute("id"))?s=s.replace(re,ie):t.setAttribute("id",s=b)),l=(h=u(e)).length;while(l--)h[l]=(s?"#"+s:":scope")+" "+ye(h[l]);y=h.join(",")}try{return R.apply(r,v.querySelectorAll(y)),r}catch(t){D(e,!0)}finally{s===b&&t.removeAttribute("id")}}}return a(e.replace(j,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function ce(e){return e[b]=!0,e}function se(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function fe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pe(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ue(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return ce(function(t){return t=+t,ce(function(n,r){var i,o=e([],n.length,t),u=o.length;while(u--)n[i=o[u]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}n=le.support={},o=le.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Q.test(t||n&&n.nodeName||"HTML")},f=le.setDocument=function(e){var t,i,u=e?e.ownerDocument||e:N;return u!=p&&9===u.nodeType&&u.documentElement?(p=u,h=p.documentElement,g=!o(p),N!=p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",oe,!1):i.attachEvent&&i.attachEvent("onunload",oe)),n.scope=se(function(e){return h.appendChild(e).appendChild(p.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),n.attributes=se(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=se(function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Z.test(p.getElementsByClassName),n.getById=se(function(e){return h.appendChild(e).id=b,!p.getElementsByName||!p.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},y=[],m=[],(n.qsa=Z.test(p.querySelectorAll))&&(se(function(e){var t;h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&m.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||m.push("\\["+M+"*(?:value|"+H+")"),e.querySelectorAll("[id~="+b+"-]").length||m.push("~="),(t=p.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||m.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||m.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||m.push(".#.+[+~]"),e.querySelectorAll("\\\f"),m.push("[\\r\\n\\f]")}),se(function(e){e.innerHTML="";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&m.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&m.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&m.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),m.push(",.*:")})),(n.matchesSelector=Z.test(v=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&se(function(e){n.disconnectedMatch=v.call(e,"*"),v.call(e,"[s!='']:x"),y.push("!=",F)}),m=m.length&&new RegExp(m.join("|")),y=y.length&&new RegExp(y.join("|")),t=Z.test(h.compareDocumentPosition),w=t||Z.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},T=t?function(e,t){if(e===t)return d=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e==p||e.ownerDocument==N&&w(N,e)?-1:t==p||t.ownerDocument==N&&w(N,t)?1:s?k(s,e)-k(s,t):0:4&r?-1:1)}:function(e,t){if(e===t)return d=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,u=[e],l=[t];if(!i||!o)return e==p?-1:t==p?1:i?-1:o?1:s?k(s,e)-k(s,t):0;if(i===o)return fe(e,t);n=e;while(n=n.parentNode)u.unshift(n);n=t;while(n=n.parentNode)l.unshift(n);while(u[r]===l[r])r++;return r?fe(u[r],l[r]):u[r]==N?-1:l[r]==N?1:0},p):p},le.matches=function(e,t){return le(e,null,null,t)},le.matchesSelector=function(e,t){if(f(e),n.matchesSelector&&g&&!D[t+" "]&&(!y||!y.test(t))&&(!m||!m.test(t)))try{var r=v.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){D(t,!0)}return le(t,p,null,[e]).length>0},le.contains=function(e,t){return(e.ownerDocument||e)!=p&&f(e),w(e,t)},le.attr=function(e,t){(e.ownerDocument||e)!=p&&f(e);var i=r.attrHandle[t.toLowerCase()],o=i&&L.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},le.escape=function(e){return(e+"").replace(re,ie)},le.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},le.uniqueSort=function(e){var t,r=[],i=0,o=0;if(d=!n.detectDuplicates,s=!n.sortStable&&e.slice(0),e.sort(T),d){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return s=null,e},i=le.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=le.selectors={cacheLength:50,createPseudo:ce,match:K,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||le.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&le.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return K.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=u(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=le.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(O," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),u="last"!==e.slice(-4),l="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,a){var c,s,d,f,p,h,g=o!==u?"nextSibling":"previousSibling",m=t.parentNode,y=l&&t.nodeName.toLowerCase(),v=!a&&!l,w=!1;if(m){if(o){while(g){f=t;while(f=f[g])if(l?f.nodeName.toLowerCase()===y:1===f.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[u?m.firstChild:m.lastChild],u&&v){w=(p=(c=(s=(d=(f=m)[b]||(f[b]={}))[f.uniqueID]||(d[f.uniqueID]={}))[e]||[])[0]===C&&c[1])&&c[2],f=p&&m.childNodes[p];while(f=++p&&f&&f[g]||(w=p=0)||h.pop())if(1===f.nodeType&&++w&&f===t){s[e]=[C,p,w];break}}else if(v&&(w=p=(c=(s=(d=(f=t)[b]||(f[b]={}))[f.uniqueID]||(d[f.uniqueID]={}))[e]||[])[0]===C&&c[1]),!1===w)while(f=++p&&f&&f[g]||(w=p=0)||h.pop())if((l?f.nodeName.toLowerCase()===y:1===f.nodeType)&&++w&&(v&&((s=(d=f[b]||(f[b]={}))[f.uniqueID]||(d[f.uniqueID]={}))[e]=[C,w]),f===t))break;return(w-=i)===r||w%r==0&&w/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||le.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?ce(function(e,n){var r,o=i(e,t),u=o.length;while(u--)e[r=k(e,o[u])]=!(n[r]=o[u])}):function(e){return i(e,0,n)}):i}},pseudos:{not:ce(function(e){var t=[],n=[],r=l(e.replace(j,"$1"));return r[b]?ce(function(e,t,n,i){var o,u=r(e,null,i,[]),l=e.length;while(l--)(o=u[l])&&(e[l]=!(t[l]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:ce(function(e){return function(t){return le(e,t).length>0}}),contains:ce(function(e){return e=e.replace(te,ne),function(t){return(t.textContent||i(t)).indexOf(e)>-1}}),lang:ce(function(e){return J.test(e||"")||le.error("unsupported lang: "+e),e=e.replace(te,ne).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:pe(!1),disabled:pe(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return W.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[c]=!(u[c]=d))}}else y=Ne(y===u?y.splice(h,y.length):y),i?i(null,u,y,a):R.apply(u,y)})}function xe(e){for(var t,n,i,o=e.length,u=r.relative[e[0].type],l=u||r.relative[" "],a=u?1:0,s=ve(function(e){return e===t},l,!0),d=ve(function(e){return k(t,e)>-1},l,!0),f=[function(e,n,r){var i=!u&&(r||n!==c)||((t=n).nodeType?s(e,n,r):d(e,n,r));return t=null,i}];a1&&we(f),a>1&&ye(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(j,"$1"),n,a0,i=e.length>0,o=function(o,u,l,a,s){var d,h,m,y=0,v="0",w=o&&[],b=[],N=c,x=o||i&&r.find.TAG("*",s),E=C+=null==N?1:Math.random()||.1,A=x.length;for(s&&(c=u==p||u||s);v!==A&&null!=(d=x[v]);v++){if(i&&d){h=0,u||d.ownerDocument==p||(f(d),l=!g);while(m=e[h++])if(m(d,u||p,l)){a.push(d);break}s&&(C=E)}n&&((d=!m&&d)&&y--,o&&w.push(d))}if(y+=v,n&&v!==y){h=0;while(m=t[h++])m(w,b,u,l);if(o){if(y>0)while(v--)w[v]||b[v]||(b[v]=I.call(a));b=Ne(b)}R.apply(a,b),s&&!o&&b.length>0&&y+t.length>1&&le.uniqueSort(a)}return s&&(C=E,c=N),w};return n?ce(o):o}l=le.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=u(e)),n=t.length;while(n--)(o=xe(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},a=le.select=function(e,t,n,i){var o,a,c,s,d,f="function"==typeof e&&e,p=!i&&u(e=f.selector||e);if(n=n||[],1===p.length){if((a=p[0]=p[0].slice(0)).length>2&&"ID"===(c=a[0]).type&&9===t.nodeType&&g&&r.relative[a[1].type]){if(!(t=(r.find.ID(c.matches[0].replace(te,ne),t)||[])[0]))return n;f&&(t=t.parentNode),e=e.slice(a.shift().value.length)}o=K.needsContext.test(e)?0:a.length;while(o--){if(c=a[o],r.relative[s=c.type])break;if((d=r.find[s])&&(i=d(c.matches[0].replace(te,ne),ee.test(a[0].type)&&ge(t.parentNode)||t))){if(a.splice(o,1),!(e=i.length&&ye(a)))return R.apply(n,i),n;break}}}return(f||l(e,p))(i,t,!g,n,!t||ee.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(T).join("")===b,n.detectDuplicates=!!d,f(),n.sortDetached=se(function(e){return 1&e.compareDocumentPosition(p.createElement("fieldset"))}),se(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||de("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&se(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||de("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),se(function(e){return null==e.getAttribute("disabled")})||de(H,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null});var Ae=e.Sizzle;le.noConflict=function(){return e.Sizzle===le&&(e.Sizzle=Ae),le},"function"==typeof define&&define.amd?define(function(){return le}):"undefined"!=typeof module&&module.exports?module.exports=le:e.Sizzle=le}(window); -//# sourceMappingURL=sizzle.min.map \ No newline at end of file diff --git a/node_modules/jquery/external/sizzle/dist/sizzle.min.map b/node_modules/jquery/external/sizzle/dist/sizzle.min.map deleted file mode 100644 index 06ebc1f7e..000000000 --- a/node_modules/jquery/external/sizzle/dist/sizzle.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["sizzle.js"],"names":["window","i","support","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","document","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","matches","contains","expando","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","hasOwn","hasOwnProperty","arr","pop","pushNative","push","slice","indexOf","list","elem","len","length","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","toString","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","toLowerCase","dir","next","apply","call","childNodes","nodeType","e","target","els","j","Sizzle","selector","context","results","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","parentNode","scope","getAttribute","replace","setAttribute","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","value","cacheLength","shift","markFunction","fn","assert","el","createElement","removeChild","addHandle","attrs","handler","split","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","node","hasCompare","subWindow","doc","defaultView","top","addEventListener","attachEvent","appendChild","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","elems","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","ret","attr","name","val","undefined","specified","sel","error","msg","Error","uniqueSort","duplicates","detectDuplicates","sortStable","sort","splice","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","first"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","type","what","_argument","last","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","text","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","eq","even","odd","lt","gt","radio","checkbox","file","password","image","createInputPseudo","submit","reset","createButtonPseudo","prototype","filters","parseOnly","tokens","soFar","preFilters","cached","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","map","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","concat","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","Math","random","token","compiled","_name","defaultValue","_sizzle","noConflict","define","amd","module","exports"],"mappings":"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","file":"sizzle.min.js"} \ No newline at end of file diff --git a/node_modules/jquery/package.json b/node_modules/jquery/package.json index c060d7d1e..944c39b82 100644 --- a/node_modules/jquery/package.json +++ b/node_modules/jquery/package.json @@ -2,12 +2,12 @@ "name": "jquery", "title": "jQuery", "description": "JavaScript library for DOM operations", - "version": "3.6.0", + "version": "3.7.1", "main": "dist/jquery.js", "homepage": "https://jquery.com", "author": { "name": "OpenJS Foundation and other contributors", - "url": "https://github.com/jquery/jquery/blob/3.6.0/AUTHORS.txt" + "url": "https://github.com/jquery/jquery/blob/3.7.1/AUTHORS.txt" }, "repository": { "type": "git", @@ -26,55 +26,61 @@ "devDependencies": { "@babel/core": "7.3.3", "@babel/plugin-transform-for-of": "7.2.0", + "bootstrap": "5.3.0", + "colors": "1.4.0", "commitplease": "3.2.0", "core-js": "2.6.5", "eslint-config-jquery": "3.0.0", - "grunt": "1.3.0", + "grunt": "1.5.3", "grunt-babel": "8.0.0", - "grunt-cli": "1.3.2", + "grunt-cli": "1.4.3", "grunt-compare-size": "0.4.2", "grunt-contrib-uglify": "3.4.0", "grunt-contrib-watch": "1.1.0", "grunt-eslint": "22.0.0", "grunt-git-authors": "3.2.0", - "grunt-jsonlint": "1.1.0", - "grunt-karma": "4.0.0", + "grunt-jsonlint": "2.1.2", + "grunt-karma": "4.0.2", "grunt-newer": "1.3.0", "grunt-npmcopy": "0.2.0", "gzip-js": "0.3.2", - "husky": "1.3.1", - "insight": "0.10.1", - "jsdom": "13.2.0", - "karma": "5.2.3", - "karma-browserstack-launcher": "1.4.0", - "karma-chrome-launcher": "2.2.0", - "karma-firefox-launcher": "1.1.0", + "husky": "4.2.5", + "jsdom": "19.0.0", + "karma": "6.4.1", + "karma-browserstack-launcher": "1.6.0", + "karma-chrome-launcher": "3.1.1", + "karma-firefox-launcher": "2.1.2", "karma-ie-launcher": "1.0.0", - "karma-jsdom-launcher": "8.0.2", - "karma-qunit": "3.0.0", + "karma-jsdom-launcher": "12.0.0", + "karma-qunit": "4.1.2", + "karma-webkit-launcher": "2.1.0", "load-grunt-tasks": "5.1.0", "native-promise-only": "0.8.1", + "playwright-webkit": "1.30.0", "promises-aplus-tests": "2.1.2", "q": "1.5.1", "qunit": "2.9.2", "raw-body": "2.3.3", "requirejs": "2.3.6", "sinon": "2.3.7", - "sizzle": "2.3.6", "strip-json-comments": "2.0.1", "testswarm": "1.1.2", "uglify-js": "3.4.7" }, "scripts": { - "build": "npm install && grunt", + "build": "npm install && npm run build-all-variants", + "build-all-variants": "grunt custom:slim --filename=jquery.slim.js && grunt custom", "start": "grunt watch", - "test:browserless": "grunt && grunt test:slow", + "test:browserless": "grunt && npm run test:node_smoke_tests && grunt test:slow", "test:browser": "grunt && grunt karma:main", "test:amd": "grunt && grunt karma:amd", "test:no-deprecated": "grunt test:prepare && grunt custom:-deprecated && grunt karma:main", - "test:no-sizzle": "grunt test:prepare && grunt custom:-sizzle && grunt karma:main", + "test:selector-native": "grunt test:prepare && grunt custom:-selector && grunt karma:main", "test:slim": "grunt test:prepare && grunt custom:slim && grunt karma:main", - "test": "npm run test:slim && npm run test:no-deprecated && npm run test:no-sizzle && grunt && grunt test:slow && grunt karma:main && grunt karma:amd", + "test:node_smoke_tests:full": "grunt node_smoke_tests:./dist/jquery.js", + "test:node_smoke_tests:slim": "grunt node_smoke_tests:./dist/jquery.slim.js", + "test:node_smoke_tests": "npm run test:node_smoke_tests:full && npm run test:node_smoke_tests:slim", + "test": "npm run test:browserless && npm run test:slim && npm run test:no-deprecated && npm run test:selector-native && grunt && grunt test:slow && grunt karma:main && grunt karma:amd", "jenkins": "npm run test:browserless" }, "commitplease": { diff --git a/node_modules/jquery/src/ajax.js b/node_modules/jquery/src/ajax.js index 4be4a9e92..1fa310424 100644 --- a/node_modules/jquery/src/ajax.js +++ b/node_modules/jquery/src/ajax.js @@ -22,7 +22,7 @@ var rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - // #7653, #8125, #8152: local protocol detection + // trac-7653, trac-8125, trac-8152: local protocol detection rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, @@ -45,7 +45,7 @@ var */ transports = {}, - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression allTypes = "*/".concat( "*" ), // Anchor tag for parsing the document origin @@ -116,7 +116,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX // A special extend for ajax options // that takes "flat" options (not to be deep extended) -// Fixes #9887 +// Fixes trac-9887 function ajaxExtend( target, src ) { var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {}; @@ -527,12 +527,12 @@ jQuery.extend( { deferred.promise( jqXHR ); // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) + // Handle falsy url in the settings object (trac-10093: consistency with old signature) // We also use the url parameter if available s.url = ( ( url || s.url || location.href ) + "" ) .replace( rprotocol, location.protocol + "//" ); - // Alias method option to type as per ticket #12004 + // Alias method option to type as per ticket trac-12004 s.type = options.method || options.type || s.method || s.type; // Extract dataTypes list @@ -575,7 +575,7 @@ jQuery.extend( { } // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) fireGlobals = jQuery.event && s.global; // Watch for a new set of requests @@ -604,7 +604,7 @@ jQuery.extend( { if ( s.data && ( s.processData || typeof s.data === "string" ) ) { cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - // #9682: remove data so that it's not used in an eventual retry + // trac-9682: remove data so that it's not used in an eventual retry delete s.data; } diff --git a/node_modules/jquery/src/ajax/xhr.js b/node_modules/jquery/src/ajax/xhr.js index 4a31171ac..0c4418bc6 100644 --- a/node_modules/jquery/src/ajax/xhr.js +++ b/node_modules/jquery/src/ajax/xhr.js @@ -18,7 +18,7 @@ var xhrSuccessStatus = { 0: 200, // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 + // trac-1450: sometimes IE returns 1223 when it should be 204 1223: 204 }, xhrSupported = jQuery.ajaxSettings.xhr(); @@ -90,7 +90,7 @@ jQuery.ajaxTransport( function( options ) { } else { complete( - // File: protocol always yields status 0; see #8605, #14207 + // File: protocol always yields status 0; see trac-8605, trac-14207 xhr.status, xhr.statusText ); @@ -151,7 +151,7 @@ jQuery.ajaxTransport( function( options ) { xhr.send( options.hasContent && options.data || null ); } catch ( e ) { - // #14683: Only rethrow if this hasn't been notified as an error yet + // trac-14683: Only rethrow if this hasn't been notified as an error yet if ( callback ) { throw e; } diff --git a/node_modules/jquery/src/attributes/classes.js b/node_modules/jquery/src/attributes/classes.js index 23e48471c..2ac919b87 100644 --- a/node_modules/jquery/src/attributes/classes.js +++ b/node_modules/jquery/src/attributes/classes.js @@ -25,8 +25,7 @@ function classesToArray( value ) { jQuery.fn.extend( { addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; + var classNames, cur, curValue, className, i, finalValue; if ( isFunction( value ) ) { return this.each( function( j ) { @@ -34,36 +33,35 @@ jQuery.fn.extend( { } ); } - classes = classesToArray( value ); + classNames = classesToArray( value ); - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); + this.setAttribute( "class", finalValue ); } } - } + } ); } return this; }, removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; + var classNames, cur, curValue, className, i, finalValue; if ( isFunction( value ) ) { return this.each( function( j ) { @@ -75,45 +73,42 @@ jQuery.fn.extend( { return this.attr( "class", "" ); } - classes = classesToArray( value ); + classNames = classesToArray( value ); - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); } } // Only assign if different to avoid unneeded rendering. finalValue = stripAndCollapse( cur ); if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); + this.setAttribute( "class", finalValue ); } } - } + } ); } return this; }, toggleClass: function( value, stateVal ) { - var type = typeof value, + var classNames, className, i, self, + type = typeof value, isValidValue = type === "string" || Array.isArray( value ); - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - if ( isFunction( value ) ) { return this.each( function( i ) { jQuery( this ).toggleClass( @@ -123,17 +118,20 @@ jQuery.fn.extend( { } ); } - return this.each( function() { - var className, i, self, classNames; + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + classNames = classesToArray( value ); + + return this.each( function() { if ( isValidValue ) { // Toggle individual class names - i = 0; self = jQuery( this ); - classNames = classesToArray( value ); - while ( ( className = classNames[ i++ ] ) ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; // Check each className given, space separated list if ( self.hasClass( className ) ) { diff --git a/node_modules/jquery/src/attributes/prop.js b/node_modules/jquery/src/attributes/prop.js index 49ac244df..150b38922 100644 --- a/node_modules/jquery/src/attributes/prop.js +++ b/node_modules/jquery/src/attributes/prop.js @@ -62,8 +62,7 @@ jQuery.extend( { // Support: IE <=9 - 11 only // elem.tabIndex doesn't always return the // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) + // Use proper attribute retrieval (trac-12072) var tabindex = jQuery.find.attr( elem, "tabindex" ); if ( tabindex ) { diff --git a/node_modules/jquery/src/attributes/val.js b/node_modules/jquery/src/attributes/val.js index c719b34b3..2879a626c 100644 --- a/node_modules/jquery/src/attributes/val.js +++ b/node_modules/jquery/src/attributes/val.js @@ -91,7 +91,7 @@ jQuery.extend( { val : // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) + // option.text throws exceptions (trac-14686, trac-14858) // Strip and collapse whitespace // https://html.spec.whatwg.org/#strip-and-collapse-whitespace stripAndCollapse( jQuery.text( elem ) ); @@ -118,7 +118,7 @@ jQuery.extend( { option = options[ i ]; // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) + // IE8-9 doesn't update selected after form reset (trac-2551) if ( ( option.selected || i === index ) && // Don't return options that are disabled or in a disabled optgroup diff --git a/node_modules/jquery/src/core.js b/node_modules/jquery/src/core.js index 03eefa73a..ae1b24be8 100644 --- a/node_modules/jquery/src/core.js +++ b/node_modules/jquery/src/core.js @@ -25,8 +25,9 @@ define( [ "use strict"; -var - version = "3.6.0", +var version = "3.7.1", + + rhtmlSuffix = /HTML$/i, // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -272,6 +273,38 @@ jQuery.extend( { return obj; }, + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; @@ -294,6 +327,15 @@ jQuery.extend( { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { diff --git a/node_modules/jquery/src/core/camelCase.js b/node_modules/jquery/src/core/camelCase.js index b271044d5..352a08051 100644 --- a/node_modules/jquery/src/core/camelCase.js +++ b/node_modules/jquery/src/core/camelCase.js @@ -13,7 +13,7 @@ function fcamelCase( _all, letter ) { // Convert dashed to camelCase; used by the css and data modules // Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) +// Microsoft forgot to hump their vendor prefix (trac-9572) function camelCase( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); } diff --git a/node_modules/jquery/src/core/init.js b/node_modules/jquery/src/core/init.js index 8865238c8..83d061847 100644 --- a/node_modules/jquery/src/core/init.js +++ b/node_modules/jquery/src/core/init.js @@ -14,8 +14,8 @@ define( [ var rootjQuery, // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) + // Prioritize #id over to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) // Shortcut simple #id case for speed rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, diff --git a/node_modules/jquery/src/core/isAttached.js b/node_modules/jquery/src/core/isAttached.js index bd525194a..ed66a4d52 100644 --- a/node_modules/jquery/src/core/isAttached.js +++ b/node_modules/jquery/src/core/isAttached.js @@ -1,7 +1,7 @@ define( [ "../core", "../var/documentElement", - "../selector" // jQuery.contains + "../selector/contains" // jQuery.contains ], function( jQuery, documentElement ) { "use strict"; diff --git a/node_modules/jquery/src/core/ready-no-deferred.js b/node_modules/jquery/src/core/ready-no-deferred.js index 4428020ef..20cf8dca4 100644 --- a/node_modules/jquery/src/core/ready-no-deferred.js +++ b/node_modules/jquery/src/core/ready-no-deferred.js @@ -30,7 +30,7 @@ jQuery.extend( { isReady: false, // A counter to track how many items to wait for before - // the ready event fires. See #6781 + // the ready event fires. See trac-6781 readyWait: 1, ready: function( wait ) { diff --git a/node_modules/jquery/src/core/ready.js b/node_modules/jquery/src/core/ready.js index 794feeec0..a80248327 100644 --- a/node_modules/jquery/src/core/ready.js +++ b/node_modules/jquery/src/core/ready.js @@ -31,7 +31,7 @@ jQuery.extend( { isReady: false, // A counter to track how many items to wait for before - // the ready event fires. See #6781 + // the ready event fires. See trac-6781 readyWait: 1, // Handle when the DOM is ready diff --git a/node_modules/jquery/src/css.js b/node_modules/jquery/src/css.js index a41cc2c92..1ec1aa8f4 100644 --- a/node_modules/jquery/src/css.js +++ b/node_modules/jquery/src/css.js @@ -5,6 +5,7 @@ define( [ "./core/nodeName", "./var/rcssNum", "./css/var/rnumnonpx", + "./css/var/rcustomProp", "./css/var/cssExpand", "./css/var/getStyles", "./css/var/swap", @@ -17,8 +18,9 @@ define( [ "./core/init", "./core/ready", "./selector" // contains -], function( jQuery, access, camelCase, nodeName, rcssNum, rnumnonpx, cssExpand, - getStyles, swap, curCSS, adjustCSS, addGetHookIf, support, finalPropName ) { +], function( jQuery, access, camelCase, nodeName, rcssNum, rnumnonpx, + rcustomProp, cssExpand, getStyles, swap, curCSS, adjustCSS, addGetHookIf, + support, finalPropName ) { "use strict"; @@ -28,7 +30,6 @@ var // except "table", "table-cell", or "table-caption" // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = { letterSpacing: "0", @@ -50,7 +51,8 @@ function setPositiveNumber( _elem, value, subtract ) { function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { var i = dimension === "width" ? 1 : 0, extra = 0, - delta = 0; + delta = 0, + marginDelta = 0; // Adjustment may not be necessary if ( box === ( isBorderBox ? "border" : "content" ) ) { @@ -60,8 +62,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed for ( ; i < 4; i += 2 ) { // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); } // If we get here with a content-box, we're seeking "padding" or "border" or "margin" @@ -112,7 +116,7 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed ) ) || 0; } - return delta; + return delta + marginDelta; } function getWidthOrHeight( elem, dimension, extra ) { @@ -210,26 +214,35 @@ jQuery.extend( { // Don't automatically add "px" to these possibly-unitless properties cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true + animationIterationCount: true, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: true }, // Add in properties whose names you wish to fix before @@ -264,15 +277,15 @@ jQuery.extend( { if ( value !== undefined ) { type = typeof value; - // Convert "+=" or "-=" to relative numbers (#7345) + // Convert "+=" or "-=" to relative numbers (trac-7345) if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { value = adjustCSS( elem, name, ret ); - // Fixes bug #9237 + // Fixes bug trac-9237 type = "number"; } - // Make sure that null and NaN values aren't set (#7116) + // Make sure that null and NaN values aren't set (trac-7116) if ( value == null || value !== value ) { return; } diff --git a/node_modules/jquery/src/css/curCSS.js b/node_modules/jquery/src/css/curCSS.js index 98a594a77..cde40b6d4 100644 --- a/node_modules/jquery/src/css/curCSS.js +++ b/node_modules/jquery/src/css/curCSS.js @@ -4,13 +4,17 @@ define( [ "./var/rboxStyle", "./var/rnumnonpx", "./var/getStyles", + "./var/rcustomProp", + "../var/rtrimCSS", "./support" -], function( jQuery, isAttached, rboxStyle, rnumnonpx, getStyles, support ) { +], function( jQuery, isAttached, rboxStyle, rnumnonpx, getStyles, + rcustomProp, rtrimCSS, support ) { "use strict"; function curCSS( elem, name, computed ) { var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), // Support: Firefox 51+ // Retrieving style before computed somehow @@ -21,11 +25,42 @@ function curCSS( elem, name, computed ) { computed = computed || getStyles( elem ); // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) + // .css('filter') (IE 9 only, trac-12537) + // .css('--customProperty) (gh-3144) if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` ret = computed.getPropertyValue( name ) || computed[ name ]; + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + if ( ret === "" && !isAttached( elem ) ) { ret = jQuery.style( elem, name ); } diff --git a/node_modules/jquery/src/css/support.js b/node_modules/jquery/src/css/support.js index 3a9d25c73..6f6f63ad8 100644 --- a/node_modules/jquery/src/css/support.js +++ b/node_modules/jquery/src/css/support.js @@ -70,7 +70,7 @@ define( [ } // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) + // Style of cloned element affects source element cloned (trac-8908) div.style.backgroundClip = "content-box"; div.cloneNode( true ).style.backgroundClip = ""; support.clearCloneStyle = div.style.backgroundClip === "content-box"; @@ -114,7 +114,7 @@ define( [ trChild = document.createElement( "div" ); table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; - tr.style.cssText = "border:1px solid"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; // Support: Chrome 86+ // Height set through cssText does not get applied. @@ -126,7 +126,7 @@ define( [ // In our bodyBackground.html iframe, // display for all div elements is set to "inline", // which causes a problem only in Android 8 Chrome 86. - // Ensuring the div is display: block + // Ensuring the div is `display: block` // gets around this issue. trChild.style.display = "block"; diff --git a/node_modules/jquery/src/css/var/getStyles.js b/node_modules/jquery/src/css/var/getStyles.js index 0b893acf0..a2d5f3d50 100644 --- a/node_modules/jquery/src/css/var/getStyles.js +++ b/node_modules/jquery/src/css/var/getStyles.js @@ -3,7 +3,7 @@ define( function() { return function( elem ) { - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) // IE throws on elements created in popups // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" var view = elem.ownerDocument.defaultView; diff --git a/node_modules/jquery/src/data.js b/node_modules/jquery/src/data.js index 95c365a5a..236b00ec7 100644 --- a/node_modules/jquery/src/data.js +++ b/node_modules/jquery/src/data.js @@ -109,7 +109,7 @@ jQuery.fn.extend( { while ( i-- ) { // Support: IE 11 only - // The attrs elements can be null (#14894) + // The attrs elements can be null (trac-14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { diff --git a/node_modules/jquery/src/data/Data.js b/node_modules/jquery/src/data/Data.js index 31ff4318c..a7a4c56a7 100644 --- a/node_modules/jquery/src/data/Data.js +++ b/node_modules/jquery/src/data/Data.js @@ -25,7 +25,7 @@ Data.prototype = { value = {}; // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. + // but we should not, see trac-8335. // Always return an empty object. if ( acceptData( owner ) ) { diff --git a/node_modules/jquery/src/deferred.js b/node_modules/jquery/src/deferred.js index 439653f58..5e390b7f6 100644 --- a/node_modules/jquery/src/deferred.js +++ b/node_modules/jquery/src/deferred.js @@ -194,7 +194,7 @@ jQuery.extend( { if ( jQuery.Deferred.exceptionHook ) { jQuery.Deferred.exceptionHook( e, - process.stackTrace ); + process.error ); } // Support: Promises/A+ section 2.3.3.3.4.1 @@ -222,10 +222,17 @@ jQuery.extend( { process(); } else { - // Call an optional hook to record the stack, in case of exception + // Call an optional hook to record the error, in case of exception // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = jQuery.Deferred.getStackHook(); } window.setTimeout( process ); } diff --git a/node_modules/jquery/src/deferred/exceptionHook.js b/node_modules/jquery/src/deferred/exceptionHook.js index 6dbdc8520..cc2cf9c26 100644 --- a/node_modules/jquery/src/deferred/exceptionHook.js +++ b/node_modules/jquery/src/deferred/exceptionHook.js @@ -9,12 +9,16 @@ define( [ // warn about them ASAP rather than swallowing them by default. var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; -jQuery.Deferred.exceptionHook = function( error, stack ) { +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { // Support: IE 8 - 9 only // Console exists when dev tools are open, which can happen at any time if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + window.console.warn( "jQuery.Deferred exception: " + error.message, + error.stack, asyncError ); } }; diff --git a/node_modules/jquery/src/deprecated.js b/node_modules/jquery/src/deprecated.js index cc13c3c82..ca54982d7 100644 --- a/node_modules/jquery/src/deprecated.js +++ b/node_modules/jquery/src/deprecated.js @@ -15,7 +15,9 @@ define( [ // Support: Android <=4.0 only // Make sure we trim BOM and NBSP -var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; +// Require that the "whitespace run" starts from a non-whitespace +// to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. +var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; // Bind a function to a context, optionally partially applying any // arguments. @@ -82,6 +84,6 @@ jQuery.isNumeric = function( obj ) { jQuery.trim = function( text ) { return text == null ? "" : - ( text + "" ).replace( rtrim, "" ); + ( text + "" ).replace( rtrim, "$1" ); }; } ); diff --git a/node_modules/jquery/src/deprecated/event.js b/node_modules/jquery/src/deprecated/event.js index d46a3b87c..4c6e60c10 100644 --- a/node_modules/jquery/src/deprecated/event.js +++ b/node_modules/jquery/src/deprecated/event.js @@ -28,7 +28,9 @@ jQuery.fn.extend( { }, hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + return this + .on( "mouseenter", fnOver ) + .on( "mouseleave", fnOut || fnOver ); } } ); diff --git a/node_modules/jquery/src/effects.js b/node_modules/jquery/src/effects.js index 4c011b105..d0feb01d4 100644 --- a/node_modules/jquery/src/effects.js +++ b/node_modules/jquery/src/effects.js @@ -310,7 +310,7 @@ function Animation( elem, properties, options ) { remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) temp = remaining / animation.duration || 0, percent = 1 - temp, index = 0, diff --git a/node_modules/jquery/src/event.js b/node_modules/jquery/src/event.js index a954400a3..15818f3c0 100644 --- a/node_modules/jquery/src/event.js +++ b/node_modules/jquery/src/event.js @@ -27,25 +27,6 @@ function returnFalse() { return false; } -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - function on( elem, types, selector, data, fn, one ) { var origFn, type; @@ -393,15 +374,15 @@ jQuery.event = { for ( ; cur !== this; cur = cur.parentNode || this ) { - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { matchedHandlers = []; matchedSelectors = {}; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; - // Don't conflict with Object.prototype properties (#13203) + // Don't conflict with Object.prototype properties (trac-13203) sel = handleObj.selector + " "; if ( matchedSelectors[ sel ] === undefined ) { @@ -483,7 +464,7 @@ jQuery.event = { el.click && nodeName( el, "input" ) ) { // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); + leverageNative( el, "click", true ); } // Return false to allow normal processing in the caller @@ -534,10 +515,10 @@ jQuery.event = { // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { +function leverageNative( el, type, isSetup ) { - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { if ( dataPriv.get( el, type ) === undefined ) { jQuery.event.add( el, type, returnTrue ); } @@ -549,15 +530,13 @@ function leverageNative( el, type, expectSync ) { jQuery.event.add( el, type, { namespace: false, handler: function( event ) { - var notAsync, result, + var result, saved = dataPriv.get( this, type ); if ( ( event.isTrigger & 1 ) && this[ type ] ) { // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { + if ( !saved ) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array @@ -566,33 +545,22 @@ function leverageNative( el, type, expectSync ) { dataPriv.set( this, type, saved ); // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); this[ type ](); result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } + dataPriv.set( this, type, false ); + if ( saved !== result ) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); - // Support: Chrome 86+ - // In Chrome, if an element having a focusout handler is blurred by - // clicking outside of it, it invokes the handler synchronously. If - // that handler calls `.remove()` on the element, the data is cleared, - // leaving `result` undefined. We need to guard against this. - return result && result.value; + return result; } // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. @@ -602,22 +570,25 @@ function leverageNative( el, type, expectSync ) { // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { + } else if ( saved ) { // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; } } } ); @@ -655,7 +626,7 @@ jQuery.Event = function( src, props ) { // Create target properties // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) + // Target should not be a text node (trac-504, trac-13143) this.target = ( src.target && src.target.nodeType === 3 ) ? src.target.parentNode : src.target; @@ -756,18 +727,73 @@ jQuery.each( { }, jQuery.event.addProp ); jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); + } + } else { + + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); + } + } + jQuery.event.special[ type ] = { // Utilize native event if possible so blur/focus sequence is correct setup: function() { + var attaches; + // Claim the first handler // dataPriv.set( this, "focus", ... ) // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); + leverageNative( this, type, true ); + + if ( document.documentMode ) { - // Return false to allow normal processing in the caller - return false; + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // Return false to allow normal processing in the caller + return false; + } }, trigger: function() { @@ -778,14 +804,84 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp return true; }, - // Suppress native focus or blur as it's already being fired - // in leverageNative. - _default: function() { - return true; + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); }, delegateType: delegateType }; + + // Support: Firefox <=44 + // Firefox doesn't have focus(in | out) events + // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + // + // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 + // focus(in | out) events fire after focus & blur events, + // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order + // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; } ); // Create mouseenter/leave events using mouseover/out and event-time checks diff --git a/node_modules/jquery/src/event/focusin.js b/node_modules/jquery/src/event/focusin.js deleted file mode 100644 index 3da86c787..000000000 --- a/node_modules/jquery/src/event/focusin.js +++ /dev/null @@ -1,58 +0,0 @@ -define( [ - "../core", - "../data/var/dataPriv", - "./support", - - "../event", - "./trigger" -], function( jQuery, dataPriv, support ) { - -"use strict"; - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} - -return jQuery; -} ); diff --git a/node_modules/jquery/src/event/support.js b/node_modules/jquery/src/event/support.js deleted file mode 100644 index e3db9ad83..000000000 --- a/node_modules/jquery/src/event/support.js +++ /dev/null @@ -1,11 +0,0 @@ -define( [ - "../var/support" -], function( support ) { - -"use strict"; - -support.focusin = "onfocusin" in window; - -return support; - -} ); diff --git a/node_modules/jquery/src/event/trigger.js b/node_modules/jquery/src/event/trigger.js index 2f5e65e05..28ec6b361 100644 --- a/node_modules/jquery/src/event/trigger.js +++ b/node_modules/jquery/src/event/trigger.js @@ -75,8 +75,8 @@ jQuery.extend( jQuery.event, { return; } - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + // Determine event propagation path in advance, per W3C events spec (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { bubbleType = special.delegateType || type; @@ -128,7 +128,7 @@ jQuery.extend( jQuery.event, { acceptData( elem ) ) { // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) + // Don't do default actions on window, that's where global variables be (trac-6170) if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method diff --git a/node_modules/jquery/src/exports/global.js b/node_modules/jquery/src/exports/global.js index 2cc9577d7..51b43b260 100644 --- a/node_modules/jquery/src/exports/global.js +++ b/node_modules/jquery/src/exports/global.js @@ -25,8 +25,8 @@ jQuery.noConflict = function( deep ) { }; // Expose jQuery and $ identifiers, even in AMD -// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) -// and CommonJS for browser emulators (#13566) +// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (trac-13566) if ( typeof noGlobal === "undefined" ) { window.jQuery = window.$ = jQuery; } diff --git a/node_modules/jquery/src/jquery.js b/node_modules/jquery/src/jquery.js index 0c144c194..46cda5e4b 100644 --- a/node_modules/jquery/src/jquery.js +++ b/node_modules/jquery/src/jquery.js @@ -11,7 +11,6 @@ define( [ "./queue/delay", "./attributes", "./event", - "./event/focusin", "./manipulation", "./manipulation/_evalUrl", "./wrap", diff --git a/node_modules/jquery/src/manipulation.js b/node_modules/jquery/src/manipulation.js index dec21ea0b..5269e7333 100644 --- a/node_modules/jquery/src/manipulation.js +++ b/node_modules/jquery/src/manipulation.js @@ -40,7 +40,8 @@ var // checked="checked" or checked rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rcleanScript = /^\s*\s*$/g; + + rcleanScript = /^\s*\s*$/g; // Prefer a tbody over its parent table for containing new rows function manipulationTarget( elem, content ) { @@ -154,7 +155,7 @@ function domManip( collection, args, callback, ignored ) { // Use the original fragment for the last item // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). + // being emptied incorrectly in certain situations (trac-8070). for ( ; i < l; i++ ) { node = fragment; @@ -176,7 +177,7 @@ function domManip( collection, args, callback, ignored ) { if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; - // Reenable scripts + // Re-enable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion @@ -195,6 +196,12 @@ function domManip( collection, args, callback, ignored ) { }, doc ); } } else { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); } } @@ -241,7 +248,8 @@ jQuery.extend( { if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + // We eschew jQuery#find here for performance reasons: + // https://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); diff --git a/node_modules/jquery/src/manipulation/_evalUrl.js b/node_modules/jquery/src/manipulation/_evalUrl.js index 6163b68c4..810b5b518 100644 --- a/node_modules/jquery/src/manipulation/_evalUrl.js +++ b/node_modules/jquery/src/manipulation/_evalUrl.js @@ -8,7 +8,7 @@ jQuery._evalUrl = function( url, options, doc ) { return jQuery.ajax( { url: url, - // Make this explicit, since user can override this through ajaxSetup (#11264) + // Make this explicit, since user can override this through ajaxSetup (trac-11264) type: "GET", dataType: "script", cache: true, diff --git a/node_modules/jquery/src/manipulation/buildFragment.js b/node_modules/jquery/src/manipulation/buildFragment.js index 40c2ed1dc..b16d7abc7 100644 --- a/node_modules/jquery/src/manipulation/buildFragment.js +++ b/node_modules/jquery/src/manipulation/buildFragment.js @@ -58,7 +58,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) { // Remember the top-level container tmp = fragment.firstChild; - // Ensure the created nodes are orphaned (#12392) + // Ensure the created nodes are orphaned (trac-12392) tmp.textContent = ""; } } diff --git a/node_modules/jquery/src/manipulation/getAll.js b/node_modules/jquery/src/manipulation/getAll.js index fede6c78a..65dcc1e90 100644 --- a/node_modules/jquery/src/manipulation/getAll.js +++ b/node_modules/jquery/src/manipulation/getAll.js @@ -8,7 +8,7 @@ define( [ function getAll( context, tag ) { // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) var ret; if ( typeof context.getElementsByTagName !== "undefined" ) { diff --git a/node_modules/jquery/src/manipulation/support.js b/node_modules/jquery/src/manipulation/support.js index 62d6bb3e0..01583637c 100644 --- a/node_modules/jquery/src/manipulation/support.js +++ b/node_modules/jquery/src/manipulation/support.js @@ -11,9 +11,9 @@ define( [ input = document.createElement( "input" ); // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) + // Check state lost if the name is set (trac-11217) // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) + // `name` and `type` must use .setAttribute for WWA (trac-14901) input.setAttribute( "type", "radio" ); input.setAttribute( "checked", "checked" ); input.setAttribute( "name", "t" ); diff --git a/node_modules/jquery/src/manipulation/wrapMap.js b/node_modules/jquery/src/manipulation/wrapMap.js index da48bf9fe..9868e56d4 100644 --- a/node_modules/jquery/src/manipulation/wrapMap.js +++ b/node_modules/jquery/src/manipulation/wrapMap.js @@ -4,7 +4,7 @@ define( [ "use strict"; -// We have to close these tags to support XHTML (#13200) +// We have to close these tags to support XHTML (trac-13200) var wrapMap = { // XHTML parsers do not magically insert elements in the diff --git a/node_modules/jquery/src/queue/delay.js b/node_modules/jquery/src/queue/delay.js index d471eedc5..de3bef520 100644 --- a/node_modules/jquery/src/queue/delay.js +++ b/node_modules/jquery/src/queue/delay.js @@ -7,7 +7,6 @@ define( [ "use strict"; // Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ jQuery.fn.delay = function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; diff --git a/node_modules/jquery/src/selector-native.js b/node_modules/jquery/src/selector-native.js index 05cd8eaeb..9402b6152 100644 --- a/node_modules/jquery/src/selector-native.js +++ b/node_modules/jquery/src/selector-native.js @@ -3,63 +3,47 @@ define( [ "./var/document", "./var/documentElement", "./var/hasOwn", - "./var/indexOf" -], function( jQuery, document, documentElement, hasOwn, indexOf ) { + "./var/indexOf", + "./var/slice", + + // The following utils are attached directly to the jQuery object. + "./selector/contains", + "./selector/escapeSelector" +], function( jQuery, document, documentElement, hasOwn, indexOf, slice ) { "use strict"; /* - * Optional (non-Sizzle) selector module for custom builds. + * Optional limited selector module for custom builds. * * Note that this DOES NOT SUPPORT many documented jQuery * features in exchange for its smaller size: * - * Attribute not equal selector - * Positional selectors (:first; :eq(n); :odd; etc.) - * Type selectors (:input; :checkbox; :button; etc.) - * State-based selectors (:animated; :visible; :hidden; etc.) - * :has(selector) - * :not(complex selector) - * custom selectors via Sizzle extensions - * Leading combinators (e.g., $collection.find("> *")) - * Reliable functionality on XML fragments - * Requiring all parts of a selector to match elements under context - * (e.g., $div.find("div > *") now matches children of $div) - * Matching against non-elements - * Reliable sorting of disconnected nodes - * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit) + * * Attribute not equal selector (!=) + * * Positional selectors (:first; :eq(n); :odd; etc.) + * * Type selectors (:input; :checkbox; :button; etc.) + * * State-based selectors (:animated; :visible; :hidden; etc.) + * * :has(selector) + * * :not(complex selector) + * * custom selectors via jQuery extensions + * * Leading combinators (e.g., $collection.find("> *")) + * * Reliable functionality on XML fragments + * * Requiring all parts of a selector to match elements under context + * (e.g., $div.find("div > *") now matches children of $div) + * * Matching against non-elements + * * Reliable sorting of disconnected nodes + * * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit) * - * If any of these are unacceptable tradeoffs, either use Sizzle or - * customize this stub for the project's specific needs. + * If any of these are unacceptable tradeoffs, either use the full + * selector engine or customize this stub for the project's specific + * needs. */ var hasDuplicate, sortInput, - rhtmlSuffix = /HTML$/i, sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando, matches = documentElement.matches || documentElement.webkitMatchesSelector || - documentElement.mozMatchesSelector || - documentElement.oMatchesSelector || - documentElement.msMatchesSelector, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }; + documentElement.msMatchesSelector; function sortOrder( a, b ) { @@ -132,14 +116,16 @@ function uniqueSort( results ) { return results; } -function escape( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -} - jQuery.extend( { + + // This method cannot be shared with the main selector module + // as it does in 4.x because of an edge case quirk of putting + // disconnected elements in the preferred document before other + // elements in the full selector module. This will be a minor + // breaking change in 4.0.0. uniqueSort: uniqueSort, unique: uniqueSort, - escapeSelector: escape, + find: function( selector, context, results, seed ) { var elem, nodeType, i = 0; @@ -147,13 +133,13 @@ jQuery.extend( { results = results || []; context = context || document; - // Same basic safeguard as Sizzle + // Same basic safeguard as in the full selector module if ( !selector || typeof selector !== "string" ) { return results; } - // Early return if context is not an element or document - if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) { + // Early return if context is not an element, document or document fragment + if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 && nodeType !== 11 ) { return []; } @@ -169,47 +155,6 @@ jQuery.extend( { return results; }, - text: function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += jQuery.text( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - return elem.textContent; - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; - }, - contains: function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && adown.contains( bup ) ); - }, - isXMLDoc: function( elem ) { - var namespace = elem.namespaceURI, - documentElement = ( elem.ownerDocument || elem ).documentElement; - - // Assume HTML when documentElement doesn't yet exist, such as inside - // document fragments. - return !rhtmlSuffix.test( namespace || - documentElement && documentElement.nodeName || - "HTML" ); - }, expr: { attrHandle: {}, match: { @@ -220,6 +165,10 @@ jQuery.extend( { } } ); +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + jQuery.extend( jQuery.find, { matches: function( expr, elements ) { return jQuery.find( expr, null, null, elements ); @@ -230,7 +179,7 @@ jQuery.extend( jQuery.find, { attr: function( elem, name ) { var fn = jQuery.expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) + // Don't get fooled by Object.prototype properties (jQuery trac-13807) value = fn && hasOwn.call( jQuery.expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, jQuery.isXMLDoc( elem ) ) : undefined; diff --git a/node_modules/jquery/src/selector-sizzle.js b/node_modules/jquery/src/selector-sizzle.js deleted file mode 100644 index ff7bc70ee..000000000 --- a/node_modules/jquery/src/selector-sizzle.js +++ /dev/null @@ -1,19 +0,0 @@ -define( [ - "./core", - "../external/sizzle/dist/sizzle" -], function( jQuery, Sizzle ) { - -"use strict"; - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - -} ); diff --git a/node_modules/jquery/src/selector.js b/node_modules/jquery/src/selector.js index 2e0c17e15..706a7f1e9 100644 --- a/node_modules/jquery/src/selector.js +++ b/node_modules/jquery/src/selector.js @@ -1,3 +1,2117 @@ -define( [ "./selector-sizzle" ], function() { - "use strict"; +define( [ + "./core", + "./core/nodeName", + "./var/arr", + "./var/document", + "./var/indexOf", + "./var/hasOwn", + "./var/pop", + "./var/push", + "./var/slice", + "./var/sort", + "./var/splice", + "./var/whitespace", + "./var/rtrimCSS", + "./var/support", + + // The following utils are attached directly to the jQuery object. + "./selector/contains", + "./selector/escapeSelector" +], function( jQuery, nodeName, arr, document, indexOf, hasOwn, pop, push, + slice, sort, splice, whitespace, rtrimCSS, support ) { + +"use strict"; + +var preferredDoc = document, + pushNative = push; + +( function() { + +var i, + Expr, + outermostContext, + sortInput, + hasDuplicate, + push = pushNative, + + // Local document vars + document, + documentElement, + documentIsHTML, + rbuggyQSA, + matches, + + // Instance-specific data + expando = jQuery.expando, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + bool: new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + needsContext: new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + if ( nonHex ) { + + // Strip the backslash prefix from a non-hex escape sequence + return nonHex; + } + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ + // Removing the function wrapper causes a "Permission Denied" + // error in IE/Edge. + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && nodeName( elem, "fieldset" ); + }, + { dir: "parentNode", next: "legend" } + ); + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android <=4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { + apply: function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); + } + }; +} + +function find( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + push.call( results, elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + find.contains( context, elem ) && + elem.id === m ) { + + push.call( results, elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = jQuery.escapeSelector( nid ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by jQuery selector module + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + return nodeName( elem, "input" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11+ + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a jQuery selector context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [node] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +function setDocument( node ) { + var subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); + } + + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; + } ); + + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); + } ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); + } ); + + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter.ID = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find.ID = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter.ID = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find.ID = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find.TAG = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; + + // Class + Expr.find.CLASS = function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + rbuggyQSA = []; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + documentElement.appendChild( el ).innerHTML = + "" + + ""; + + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); + + if ( !support.cssHas ) { + + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a === document || a.ownerDocument == preferredDoc && + find.contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b === document || b.ownerDocument == preferredDoc && + find.contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + }; + + return document; +} + +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); +}; + +find.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return find( expr, document, null, [ elem ] ).length > 0; +}; + +find.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return jQuery.contains( context, elem ); +}; + + +find.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (see trac-13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + if ( val !== undefined ) { + return val; + } + + return elem.getAttribute( name ); +}; + +find.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +jQuery.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + +Expr = jQuery.expr = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + ATTR: function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) + .replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + CHILD: function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + find.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) + ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + find.error( match[ 0 ] ); + } + + return match; + }, + + PSEUDO: function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr.CHILD.test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + TAG: function( nodeNameSelector ) { + var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return nodeName( elem, expectedNodeName ); + }; + }, + + CLASS: function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + ")" + className + + "(" + whitespace + "|$)" ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + ATTR: function( name, operator, check ) { + return function( elem ) { + var result = find.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + + return false; + }; + }, + + CHILD: function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + outerCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + PSEUDO: function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // https://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + find.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as jQuery does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + not: markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrimCSS, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + has: markFunction( function( selector ) { + return function( elem ) { + return find( selector, elem ).length > 0; + }; + } ), + + contains: markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + find.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + target: function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + root: function( elem ) { + return elem === documentElement; + }, + + focus: function( elem ) { + return elem === safeActiveElement() && + document.hasFocus() && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), + + checked: function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); + }, + + selected: function( elem ) { + + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + empty: function( elem ) { + + // https://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + parent: function( elem ) { + return !Expr.pseudos.empty( elem ); + }, + + // Element/input types + header: function( elem ) { + return rheader.test( elem.nodeName ); + }, + + input: function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + button: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); + }, + + text: function( elem ) { + var attr; + return nodeName( elem, "input" ) && elem.type === "text" && + + // Support: IE <10 only + // New HTML5 attribute values (e.g., "search") appear + // with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + first: createPositionalPseudo( function() { + return [ 0 ]; + } ), + + last: createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + even: createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + odd: createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos.nth = Expr.pseudos.eq; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrimCSS, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + if ( parseOnly ) { + return soFar.length; + } + + return soFar ? + find.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + if ( skip && nodeName( elem, skip ) ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = outerCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + outerCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + find( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, matcherOut, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || + multipleContexts( selector || "*", + context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems; + + if ( matcher ) { + + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results; + + // Find primary matches + matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrimCSS, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find.TAG( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: ) matching + // elements by id. (see trac-14142) + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + push.call( results, elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + jQuery.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +function compile( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +} + +/** + * A low-level selection function that works with jQuery's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with jQuery selector compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find.ID( + token.matches[ 0 ].replace( runescape, funescape ), + context + ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +} + +// One-time assignments + +// Support: Android <=4.0 - 4.1+ +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Initialize against the default document +setDocument(); + +// Support: Android <=4.0 - 4.1+ +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +jQuery.find = find; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + + /* eslint-enable */ + +} )(); + } ); diff --git a/node_modules/jquery/src/traversing.js b/node_modules/jquery/src/traversing.js index de377188f..c19bde5c2 100644 --- a/node_modules/jquery/src/traversing.js +++ b/node_modules/jquery/src/traversing.js @@ -55,7 +55,7 @@ jQuery.fn.extend( { if ( cur.nodeType < 11 && ( targets ? targets.index( cur ) > -1 : - // Don't pass non-elements to Sizzle + // Don't pass non-elements to jQuery#find cur.nodeType === 1 && jQuery.find.matchesSelector( cur, selectors ) ) ) { diff --git a/package-lock.json b/package-lock.json index 181f0c554..0aacc6eba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "AVideo-Encoder", + "name": "encoder", "lockfileVersion": 2, "requires": true, "packages": { @@ -18,9 +18,9 @@ } }, "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" } }, "dependencies": { @@ -30,9 +30,9 @@ "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" }, "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" } } } From 7f1b6cee147b990cae13be7dc270a0efbe4874a2 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Nov 2024 17:28:49 -0300 Subject: [PATCH 332/416] https://github.com/WWBN/AVideo/issues/9242 --- objects/Encoder.php | 89 +++++++++++++++++++++++++++------ objects/youtube.py | 119 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+), 15 deletions(-) create mode 100644 objects/youtube.py diff --git a/objects/Encoder.php b/objects/Encoder.php index 789f6c059..78d443aa6 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -518,6 +518,55 @@ public static function getNext() return false; } + static function isPythonAndPytubeInstalled() + { + $pythonCommand = 'python3 --version'; + $pytubeCommand = 'python3 -m pip show pytube'; + + // Check if Python is installed + exec($pythonCommand, $pythonOutput, $pythonReturnCode); + if ($pythonReturnCode !== 0) { + error_log("Python is not installed. Please install Python on Ubuntu using the following commands:"); + error_log("sudo apt update && sudo apt install -y python3 python3-pip"); + return false; + } + + // Check if pytube is installed + exec($pytubeCommand, $pytubeOutput, $pytubeReturnCode); + if ($pytubeReturnCode !== 0) { + error_log("Pytube is not installed. Install it using pip with the following command:"); + error_log("python3 -m pip install pytube"); + return false; + } + + // Both Python and pytube are installed + return true; + } + + public static function downloadWithPytube($video_url, $filename) + { + global $global; + + $pythonScript = $global['systemRootPath'] . "objects/youtube.py"; + $command = escapeshellcmd("python3 $pythonScript " . escapeshellarg($video_url) . " " . escapeshellarg($filename)); + _error_log("downloadWithPytube($video_url, $filename) " . $command); + exec($command, $output, $return_var); + + $response = new stdClass(); + $response->command = $command; + $response->output = $output; + $response->error = $return_var !== 0; + + if ($response->error) { + $response->msg = "Error downloading video. Check progress.json for details."; + } else { + $response->msg = "Video downloaded successfully."; + } + + return $response; + } + + public static function downloadFile($queue_id) { @@ -578,15 +627,25 @@ public static function downloadFile($queue_id) } if (!empty($q->getVideoDownloadedLink())) { - //begin youtube-dl downloading and symlink it to the video temp file - $response = static::getYoutubeDl($q->getVideoDownloadedLink(), $queue_id, $obj->pathFileName); - if (!empty($response)) { - _error_log("downloadFile:getYoutubeDl SUCCESS queue_id = {$queue_id}"); - $obj->pathFileName = $response; - $obj->error = false; - } else { - _error_log("downloadFile:getYoutubeDl ERROR queue_id = {$queue_id}"); - $obj->error = false; + $videoURL = $q->getVideoDownloadedLink(); + $downloadWithPytubeFilename = ''; + if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($videoURL)) { + $downloadWithPytubeFilename = 'video_download_' . $queue_id; + $response = self::downloadWithPytube($videoURL, $downloadWithPytubeFilename); + } + if(empty($downloadWithPytubeFilename) || $response->error){ + //begin youtube-dl downloading and symlink it to the video temp file + $response = static::getYoutubeDl($videoURL, $queue_id, $obj->pathFileName); + if (!empty($response)) { + _error_log("downloadFile:getYoutubeDl SUCCESS queue_id = {$queue_id}"); + $obj->pathFileName = $response; + $obj->error = false; + } else { + _error_log("downloadFile:getYoutubeDl ERROR queue_id = {$queue_id}"); + $obj->error = false; + } + }else{ + $obj->pathFileName = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/video.mp4"; } } else { _error_log("downloadFile: not using getYoutubeDl"); @@ -631,7 +690,7 @@ public static function downloadFile($queue_id) _error_log("downloadFile: " . json_encode($obj)); if (empty($obj->error)) { self::setDownloaded($queue_id, $obj->pathFileName); - }else{ + } else { self::setStatusError($queue_id, $obj->msg, 1); } return $obj; @@ -701,14 +760,14 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add if (empty($addOauthFromProvider) && isYouTubeUrl($videoURL) && Encoder::streamerHasOauth('youtube', $streamers_id)) { _error_log("getYoutubeDl: ERROR try oauth "); return self::getYoutubeDl($videoURL, $queue_id, $destinationFile, 'youtube'); - }else{ - if(!empty($addOauthFromProvider)){ + } else { + if (!empty($addOauthFromProvider)) { _error_log("getYoutubeDl: ERROR addOauthFromProvider not empty"); } - if(!isYouTubeUrl($videoURL)){ + if (!isYouTubeUrl($videoURL)) { _error_log("getYoutubeDl: ERROR not a youtube URL $videoURL"); } - if(!Encoder::streamerHasOauth('youtube', $streamers_id)){ + if (!Encoder::streamerHasOauth('youtube', $streamers_id)) { _error_log("getYoutubeDl: ERROR streamers_id does not have oauth streamers_id=$streamers_id"); } } @@ -2122,7 +2181,7 @@ public static function sendToStreamer($target, $postFields, $return_vars = false $time_end = microtime(true); $execution_time = number_format($time_end - $time_start, 3); $error = "sendToStreamer {$url} in {$execution_time} seconds "; - _error_log($error . json_encode($obj).' debug_backtrace='.json_encode(debug_backtrace())); + _error_log($error . json_encode($obj) . ' debug_backtrace=' . json_encode(debug_backtrace())); $newObj = $obj; unset($newObj->postFields); diff --git a/objects/youtube.py b/objects/youtube.py new file mode 100644 index 000000000..0d9d2c944 --- /dev/null +++ b/objects/youtube.py @@ -0,0 +1,119 @@ +import re +import ssl +import os +import json +import sys +import subprocess +import urllib.request + +# Function to ensure pytube is installed +def ensure_pytube_installed(): + try: + import pytube + except ImportError: + print("pytube is not installed. Installing it now...") + subprocess.check_call([sys.executable, "-m", "pip", "install", "pytube"]) + import pytube + return pytube + +# Ensure pytube is available +pytube = ensure_pytube_installed() +from pytube import YouTube +from pytube.innertube import _default_clients +from pytube.exceptions import RegexMatchError + +# Patching pytube for throttling +_default_clients["ANDROID"]["context"]["client"]["clientVersion"] = "19.08.35" +_default_clients["IOS"]["context"]["client"]["clientVersion"] = "19.08.35" +_default_clients["ANDROID_EMBED"]["context"]["client"]["clientVersion"] = "19.08.35" +_default_clients["IOS_EMBED"]["context"]["client"]["clientVersion"] = "19.08.35" +_default_clients["IOS_MUSIC"]["context"]["client"]["clientVersion"] = "6.41" +_default_clients["ANDROID_MUSIC"] = _default_clients["ANDROID"] + +def patched_get_throttling_function_name(js: str) -> str: + function_patterns = [ + r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&.*?\|\|\s*([a-z]+)', + r'\([a-z]\s*=\s*([a-zA-Z0-9$]+)(\[\d+\])?\([a-z]\)', + r'\([a-z]\s*=\s*([a-zA-Z0-9$]+)(\[\d+\])\([a-z]\)', + ] + for pattern in function_patterns: + regex = re.compile(pattern) + function_match = regex.search(js) + if function_match: + if len(function_match.groups()) == 1: + return function_match.group(1) + idx = function_match.group(2) + if idx: + idx = idx.strip("[]") + array = re.search( + r'var {nfunc}\s*=\s*(\[.+?\]);'.format( + nfunc=re.escape(function_match.group(1))), + js + ) + if array: + array = array.group(1).strip("[]").split(",") + array = [x.strip() for x in array] + return array[int(idx)] + + raise RegexMatchError( + caller="get_throttling_function_name", pattern="multiple" + ) + +ssl._create_default_https_context = ssl._create_unverified_context +pytube.cipher.get_throttling_function_name = patched_get_throttling_function_name + +def save_metadata(yt, folder): + metadata = { + "title": yt.title, + "description": yt.description, + "url": yt.watch_url + } + with open(os.path.join(folder, "metadata.json"), "w") as meta_file: + json.dump(metadata, meta_file, indent=4) + +def save_thumbnail(yt, folder): + thumbnail_url = yt.thumbnail_url + thumbnail_path = os.path.join(folder, "thumbs.jpg") + urllib.request.urlretrieve(thumbnail_url, thumbnail_path) + +def download_video(yt, folder): + video_stream = yt.streams.get_highest_resolution() + video_path = os.path.join(folder, "video.mp4") + yt.register_on_progress_callback(lambda stream, chunk, bytes_remaining: save_progress(stream, bytes_remaining, folder)) + video_stream.download(output_path=folder, filename="video.mp4") + +def save_progress(stream, bytes_remaining, folder): + total_size = stream.filesize + downloaded = total_size - bytes_remaining + progress = { + "total_size": total_size, + "downloaded": downloaded, + "progress": round((downloaded / total_size) * 100, 2) + } + with open(os.path.join(folder, "progress.json"), "w") as progress_file: + json.dump(progress, progress_file, indent=4) + +def main(): + if len(sys.argv) != 3: + print("Usage: python yt_downloader.py ") + sys.exit(1) + + url = sys.argv[1] + folder_name = '../videos/pytube/'+sys.argv[2] + + # Create the folder + os.makedirs(folder_name, exist_ok=True) + + try: + # Download YouTube Video + yt = YouTube(url) + save_metadata(yt, folder_name) + save_thumbnail(yt, folder_name) + download_video(yt, folder_name) + + print(f"Download completed. Files saved in '{folder_name}'.") + except Exception as e: + print(f"Error: {e}") + +if __name__ == "__main__": + main() From b0543b7a5968f5a39f147e48765fe339c8b462a2 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Nov 2024 17:33:18 -0300 Subject: [PATCH 333/416] Update --- objects/Encoder.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/objects/Encoder.php b/objects/Encoder.php index 78d443aa6..6dff7f5ed 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2600,6 +2600,10 @@ public function delete() @rrmdir($file); } } + $files = glob("{$global['systemRootPath']}videos/pytube/video_download_{$this->id}"); // get all file names + foreach ($files as $file) { // iterate files + @rrmdir($file); + } $this->deleteOriginal(); if (!empty($global['progressiveUpload'])) { From 94a70444bdd0d69d40d82c917b33f5e86b909ad4 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Nov 2024 20:29:35 -0300 Subject: [PATCH 334/416] Update use pytube to get title, description duration and thumbs --- objects/Encoder.php | 118 ++++++++++++++++++++++++++++++++++++++++++-- objects/youtube.py | 97 +++++++++++++++++++++++++++++------- 2 files changed, 195 insertions(+), 20 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 6dff7f5ed..285ee2112 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -543,12 +543,88 @@ static function isPythonAndPytubeInstalled() return true; } - public static function downloadWithPytube($video_url, $filename) + public static function getTitleFromLinkWithPytube($video_url) + { + global $global; + + $downloadWithPytubeFilename = 'video_download_' . md5($video_url); + $metadataFile = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/metadata.json"; + if(!file_exists($metadataFile)){ + $response = self::downloadWithPytube($video_url, $downloadWithPytubeFilename, 'metadata'); + } + + if(file_exists($metadataFile)){ + $content = file_get_contents($metadataFile); + $json = json_decode($content); + return $json->title; + } + return false; + } + + public static function getDescriptionFromLinkWithPytube($video_url) + { + global $global; + + $downloadWithPytubeFilename = 'video_download_' . md5($video_url); + $metadataFile = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/metadata.json"; + if(!file_exists($metadataFile)){ + $response = self::downloadWithPytube($video_url, $downloadWithPytubeFilename, 'metadata'); + } + + if(file_exists($metadataFile)){ + $content = file_get_contents($metadataFile); + $json = json_decode($content); + return $json->description; + } + return false; + } + + public static function getDurationFromLinkWithPytube($video_url) + { + global $global; + + $downloadWithPytubeFilename = 'video_download_' . md5($video_url); + $metadataFile = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/metadata.json"; + if(!file_exists($metadataFile)){ + $response = self::downloadWithPytube($video_url, $downloadWithPytubeFilename, 'metadata'); + } + + if(file_exists($metadataFile)){ + $content = file_get_contents($metadataFile); + $json = json_decode($content); + return $json->duration_seconds; + } + return false; + } + + public static function getThumbsFromLinkWithPytube($video_url, $returnFileName = false) + { + global $global; + + $downloadWithPytubeFilename = 'video_download_' . md5($video_url); + $File = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/thumbs.jpg"; + if(!file_exists($File)){ + $response = self::downloadWithPytube($video_url, $downloadWithPytubeFilename, 'thumbnail'); + } + + if(file_exists($File)){ + if ($returnFileName) { + return $File; + } else { + $content = url_get_contents($File); + //unlink($returnTmpfname); + return $content; + } + } + return false; + } + + public static function downloadWithPytube($video_url, $filename, $action = 'video') { global $global; $pythonScript = $global['systemRootPath'] . "objects/youtube.py"; - $command = escapeshellcmd("python3 $pythonScript " . escapeshellarg($video_url) . " " . escapeshellarg($filename)); + $command = escapeshellcmd("python3 $pythonScript " . escapeshellarg($video_url) . " " . escapeshellarg($filename)." {$action}"); _error_log("downloadWithPytube($video_url, $filename) " . $command); exec($command, $output, $return_var); @@ -556,6 +632,10 @@ public static function downloadWithPytube($video_url, $filename) $response->command = $command; $response->output = $output; $response->error = $return_var !== 0; + $response->filename = $filename; + $response->metadata = "{$global['systemRootPath']}videos/pytube/{$response->filename}/metadata.json"; + $response->thumbnail = "{$global['systemRootPath']}videos/pytube/{$response->filename}/thumbs.jpg"; + $response->video = "{$global['systemRootPath']}videos/pytube/{$response->filename}/video.mp4"; if ($response->error) { $response->msg = "Error downloading video. Check progress.json for details."; @@ -2704,13 +2784,20 @@ public static function getReverseVideosJsonListFromLink($link, $streamers_id, $a public static function getTitleFromLink($link, $streamers_id, $addOauthFromProvider = '') { + if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { + $resp = self::getTitleFromLinkWithPytube($link); + if(!empty($resp)){ + return array('error' => false, 'output' => $resp); + } + } $prepend = ''; if (!isWindows()) { $prepend = 'LC_ALL=en_US.UTF-8 '; } + $link = str_replace("'", '', $link); $link = escapeshellarg($link); - $response = array('error' => true, 'output' => array()); + $response = array('error' => true, 'output' => ''); $cmd = $prepend . self::getYouTubeDLCommand($addOauthFromProvider, $streamers_id) . " --no-check-certificate --no-playlist --force-ipv4 --skip-download -e {$link}"; exec($cmd . " 2>&1", $output, $return_val); if ($return_val !== 0) { @@ -2730,6 +2817,12 @@ public static function getTitleFromLink($link, $streamers_id, $addOauthFromProvi public static function getDurationFromLink($link, $streamers_id, $addOauthFromProvider = '') { + if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { + $resp = self::getDurationFromLinkWithPytube($link); + if(!empty($resp)){ + return static::parseSecondsToDuration($resp); + } + } $link = escapeshellarg($link); $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $streamers_id) . " --no-check-certificate --no-playlist --force-ipv4 --get-duration --skip-download {$link}"; exec($cmd . " 2>&1", $output, $return_val); @@ -2751,6 +2844,13 @@ public static function getDurationFromLink($link, $streamers_id, $addOauthFromPr public static function getThumbsFromLink($link, $streamers_id, $returnFileName = false, $addOauthFromProvider = '') { + if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { + $resp = self::getThumbsFromLinkWithPytube($link, $returnFileName); + if(!empty($resp)){ + return $resp; + } + } + $link = str_replace(array('"', "'"), array('', ''), $link); $link = escapeshellarg($link); @@ -2796,6 +2896,13 @@ public static function getDescriptionFromLink($link, $streamers_id, $addOauthFro if (empty($link)) { return ''; } + + if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { + $resp = self::getDescriptionFromLinkWithPytube($link); + if(!empty($resp)){ + return $resp; + } + } $link = escapeshellarg($link); $tmpfname = _get_temp_file('thumbs'); $cmd = self::getYouTubeDLCommand($addOauthFromProvider, $streamers_id) . " --no-check-certificate --no-playlist --force-ipv4 --write-description --skip-download -o \"{$tmpfname}\" {$link}"; @@ -2836,6 +2943,11 @@ public static function streamerHasOauth($OauthFromProvider, $streamers_id = 0) public static function getYouTubeDLCommand($addOauthFromProvider = '', $streamers_id = 0, $forceYoutubeDL = false) { global $global; + $cacheDir = '/var/www/.cache/'; + if(!is_dir($cacheDir)){ + @mkdir($cacheDir); + } + $ytdl = "youtube-dl "; if (!empty($global['youtube-dl'])) { $ytdl = $global['youtube-dl'] . ' '; diff --git a/objects/youtube.py b/objects/youtube.py index 0d9d2c944..7d909315e 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -5,6 +5,7 @@ import sys import subprocess import urllib.request +from datetime import datetime, timedelta # Function to ensure pytube is installed def ensure_pytube_installed(): @@ -64,23 +65,50 @@ def patched_get_throttling_function_name(js: str) -> str: def save_metadata(yt, folder): metadata = { - "title": yt.title, - "description": yt.description, - "url": yt.watch_url + "title": yt.title if yt.title else "No Title", + "description": yt.description if yt.description else "No Description", + "url": yt.watch_url, + "duration_seconds": yt.length, # Add duration in seconds + "created_date": datetime.now().isoformat() # Track creation time } - with open(os.path.join(folder, "metadata.json"), "w") as meta_file: + os.makedirs(folder, exist_ok=True) + metadata_file_path = os.path.join(folder, "metadata.json") + with open(metadata_file_path, "w") as meta_file: json.dump(metadata, meta_file, indent=4) + print(f"Metadata saved successfully to '{metadata_file_path}'.") def save_thumbnail(yt, folder): - thumbnail_url = yt.thumbnail_url + """Save the highest resolution thumbnail available.""" + video_id = yt.video_id + thumbnail_urls = [ + f"https://img.youtube.com/vi/{video_id}/maxresdefault.jpg", # Highest resolution + f"https://img.youtube.com/vi/{video_id}/sddefault.jpg", # Standard definition + f"https://img.youtube.com/vi/{video_id}/hqdefault.jpg", # High quality + f"https://img.youtube.com/vi/{video_id}/mqdefault.jpg", # Medium quality + yt.thumbnail_url # Default thumbnail + ] + thumbnail_path = os.path.join(folder, "thumbs.jpg") - urllib.request.urlretrieve(thumbnail_url, thumbnail_path) + os.makedirs(folder, exist_ok=True) + + for url in thumbnail_urls: + try: + urllib.request.urlretrieve(url, thumbnail_path) + print(f"Thumbnail downloaded successfully to '{thumbnail_path}' from URL: {url}") + return # Exit the loop on success + except Exception as e: + print(f"Failed to download thumbnail from '{url}': {e}") + + print(f"Could not download any thumbnails for video '{yt.title}'.") + + def download_video(yt, folder): video_stream = yt.streams.get_highest_resolution() video_path = os.path.join(folder, "video.mp4") yt.register_on_progress_callback(lambda stream, chunk, bytes_remaining: save_progress(stream, bytes_remaining, folder)) video_stream.download(output_path=folder, filename="video.mp4") + print(f"Video downloaded successfully to '{video_path}'.") def save_progress(stream, bytes_remaining, folder): total_size = stream.filesize @@ -90,28 +118,63 @@ def save_progress(stream, bytes_remaining, folder): "downloaded": downloaded, "progress": round((downloaded / total_size) * 100, 2) } - with open(os.path.join(folder, "progress.json"), "w") as progress_file: + os.makedirs(folder, exist_ok=True) + progress_file_path = os.path.join(folder, "progress.json") + with open(progress_file_path, "w") as progress_file: json.dump(progress, progress_file, indent=4) + print(f"Progress saved to '{progress_file_path}'.") + +def clean_old_folders(base_folder, days=7): + """Delete folders older than a specified number of days.""" + now = datetime.now() + cutoff = now - timedelta(days=days) + + for folder in os.listdir(base_folder): + folder_path = os.path.join(base_folder, folder) + if os.path.isdir(folder_path): + metadata_path = os.path.join(folder_path, "metadata.json") + if os.path.exists(metadata_path): + try: + with open(metadata_path, "r") as meta_file: + metadata = json.load(meta_file) + created_date = datetime.fromisoformat(metadata.get("created_date")) + if created_date < cutoff: + print(f"Deleting folder '{folder_path}' (created on {created_date})") + subprocess.call(["rm", "-rf", folder_path]) + except Exception as e: + print(f"Error processing folder '{folder_path}': {e}") def main(): - if len(sys.argv) != 3: - print("Usage: python yt_downloader.py ") + if len(sys.argv) < 3: + print("Usage: python yt_downloader.py [metadata|thumbnail|video|all]") sys.exit(1) + # Get the directory where the script is located + script_dir = os.path.dirname(os.path.abspath(__file__)) + base_folder = os.path.join(script_dir, '../videos/pytube/') url = sys.argv[1] - folder_name = '../videos/pytube/'+sys.argv[2] + folder_name = os.path.join(base_folder, sys.argv[2]) + action = sys.argv[3].lower() if len(sys.argv) > 3 else "video" - # Create the folder os.makedirs(folder_name, exist_ok=True) try: - # Download YouTube Video yt = YouTube(url) - save_metadata(yt, folder_name) - save_thumbnail(yt, folder_name) - download_video(yt, folder_name) - - print(f"Download completed. Files saved in '{folder_name}'.") + if action == "metadata": + save_metadata(yt, folder_name) + elif action == "thumbnail": + save_thumbnail(yt, folder_name) + elif action == "video": + download_video(yt, folder_name) + elif action == "all": + save_metadata(yt, folder_name) + save_thumbnail(yt, folder_name) + download_video(yt, folder_name) + else: + print("Invalid action specified. Use 'metadata', 'thumbnail', 'video', or 'all'.") + + # Clean old folders after the operation + clean_old_folders(base_folder) except Exception as e: print(f"Error: {e}") From ea6c39bebdba45b0069fdfa5db631c40c1653da3 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:09:04 -0300 Subject: [PATCH 335/416] Update --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 285ee2112..9d0b5e161 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -622,7 +622,7 @@ public static function getThumbsFromLinkWithPytube($video_url, $returnFileName = public static function downloadWithPytube($video_url, $filename, $action = 'video') { global $global; - + $video_url = str_replace(array('\\', "'"), array('', ''), $video_url); $pythonScript = $global['systemRootPath'] . "objects/youtube.py"; $command = escapeshellcmd("python3 $pythonScript " . escapeshellarg($video_url) . " " . escapeshellarg($filename)." {$action}"); _error_log("downloadWithPytube($video_url, $filename) " . $command); From 0b8493a151c85a9ecc3abf24a086f392cc469e22 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:25:11 -0300 Subject: [PATCH 336/416] Update --- objects/youtube.py | 141 +++++++++++++++++++++++++++------------------ 1 file changed, 85 insertions(+), 56 deletions(-) diff --git a/objects/youtube.py b/objects/youtube.py index 7d909315e..c30dc2808 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -63,66 +63,89 @@ def patched_get_throttling_function_name(js: str) -> str: ssl._create_default_https_context = ssl._create_unverified_context pytube.cipher.get_throttling_function_name = patched_get_throttling_function_name +def log_system_details(): + print("Logging system details:") + print(f"Python version: {sys.version}") + print(f"Pytube version: {pytube.__version__}") + print(f"SSL version: {ssl.OPENSSL_VERSION}") + print(f"System platform: {sys.platform}") + print("Environment variables:") + for key, value in os.environ.items(): + print(f"{key}: {value}") + def save_metadata(yt, folder): - metadata = { - "title": yt.title if yt.title else "No Title", - "description": yt.description if yt.description else "No Description", - "url": yt.watch_url, - "duration_seconds": yt.length, # Add duration in seconds - "created_date": datetime.now().isoformat() # Track creation time - } - os.makedirs(folder, exist_ok=True) - metadata_file_path = os.path.join(folder, "metadata.json") - with open(metadata_file_path, "w") as meta_file: - json.dump(metadata, meta_file, indent=4) - print(f"Metadata saved successfully to '{metadata_file_path}'.") + try: + metadata = { + "title": yt.title if yt.title else "No Title", + "description": yt.description if yt.description else "No Description", + "url": yt.watch_url, + "duration_seconds": yt.length, # Add duration in seconds + "created_date": datetime.now().isoformat() # Track creation time + } + os.makedirs(folder, exist_ok=True) + metadata_file_path = os.path.join(folder, "metadata.json") + with open(metadata_file_path, "w") as meta_file: + json.dump(metadata, meta_file, indent=4) + print(f"Metadata saved successfully to '{metadata_file_path}'.") + except Exception as e: + print(f"Error saving metadata: {e}") + raise def save_thumbnail(yt, folder): - """Save the highest resolution thumbnail available.""" - video_id = yt.video_id - thumbnail_urls = [ - f"https://img.youtube.com/vi/{video_id}/maxresdefault.jpg", # Highest resolution - f"https://img.youtube.com/vi/{video_id}/sddefault.jpg", # Standard definition - f"https://img.youtube.com/vi/{video_id}/hqdefault.jpg", # High quality - f"https://img.youtube.com/vi/{video_id}/mqdefault.jpg", # Medium quality - yt.thumbnail_url # Default thumbnail - ] - - thumbnail_path = os.path.join(folder, "thumbs.jpg") - os.makedirs(folder, exist_ok=True) - - for url in thumbnail_urls: - try: - urllib.request.urlretrieve(url, thumbnail_path) - print(f"Thumbnail downloaded successfully to '{thumbnail_path}' from URL: {url}") - return # Exit the loop on success - except Exception as e: - print(f"Failed to download thumbnail from '{url}': {e}") - - print(f"Could not download any thumbnails for video '{yt.title}'.") - - + try: + video_id = yt.video_id + thumbnail_urls = [ + f"https://img.youtube.com/vi/{video_id}/maxresdefault.jpg", # Highest resolution + f"https://img.youtube.com/vi/{video_id}/sddefault.jpg", # Standard definition + f"https://img.youtube.com/vi/{video_id}/hqdefault.jpg", # High quality + f"https://img.youtube.com/vi/{video_id}/mqdefault.jpg", # Medium quality + yt.thumbnail_url # Default thumbnail + ] + + thumbnail_path = os.path.join(folder, "thumbs.jpg") + os.makedirs(folder, exist_ok=True) + + for url in thumbnail_urls: + try: + urllib.request.urlretrieve(url, thumbnail_path) + print(f"Thumbnail downloaded successfully to '{thumbnail_path}' from URL: {url}") + return # Exit the loop on success + except Exception as e: + print(f"Failed to download thumbnail from '{url}': {e}") + + print(f"Could not download any thumbnails for video '{yt.title}'.") + except Exception as e: + print(f"Error in save_thumbnail: {e}") + raise def download_video(yt, folder): - video_stream = yt.streams.get_highest_resolution() - video_path = os.path.join(folder, "video.mp4") - yt.register_on_progress_callback(lambda stream, chunk, bytes_remaining: save_progress(stream, bytes_remaining, folder)) - video_stream.download(output_path=folder, filename="video.mp4") - print(f"Video downloaded successfully to '{video_path}'.") + try: + video_stream = yt.streams.get_highest_resolution() + video_path = os.path.join(folder, "video.mp4") + yt.register_on_progress_callback(lambda stream, chunk, bytes_remaining: save_progress(stream, bytes_remaining, folder)) + video_stream.download(output_path=folder, filename="video.mp4") + print(f"Video downloaded successfully to '{video_path}'.") + except Exception as e: + print(f"Error downloading video: {e}") + raise def save_progress(stream, bytes_remaining, folder): - total_size = stream.filesize - downloaded = total_size - bytes_remaining - progress = { - "total_size": total_size, - "downloaded": downloaded, - "progress": round((downloaded / total_size) * 100, 2) - } - os.makedirs(folder, exist_ok=True) - progress_file_path = os.path.join(folder, "progress.json") - with open(progress_file_path, "w") as progress_file: - json.dump(progress, progress_file, indent=4) - print(f"Progress saved to '{progress_file_path}'.") + try: + total_size = stream.filesize + downloaded = total_size - bytes_remaining + progress = { + "total_size": total_size, + "downloaded": downloaded, + "progress": round((downloaded / total_size) * 100, 2) + } + os.makedirs(folder, exist_ok=True) + progress_file_path = os.path.join(folder, "progress.json") + with open(progress_file_path, "w") as progress_file: + json.dump(progress, progress_file, indent=4) + print(f"Progress saved to '{progress_file_path}'.") + except Exception as e: + print(f"Error saving progress: {e}") + raise def clean_old_folders(base_folder, days=7): """Delete folders older than a specified number of days.""" @@ -154,12 +177,17 @@ def main(): base_folder = os.path.join(script_dir, '../videos/pytube/') url = sys.argv[1] folder_name = os.path.join(base_folder, sys.argv[2]) - action = sys.argv[3].lower() if len(sys.argv) > 3 else "video" + action = sys.argv[3].lower() if len(sys.argv) > 3 else "all" os.makedirs(folder_name, exist_ok=True) try: + log_system_details() # Log environment details + print(f"Attempting to access YouTube video: {url}") yt = YouTube(url) + print(f"Video title: {yt.title}") + print(f"Available streams: {yt.streams}") + if action == "metadata": save_metadata(yt, folder_name) elif action == "thumbnail": @@ -173,10 +201,11 @@ def main(): else: print("Invalid action specified. Use 'metadata', 'thumbnail', 'video', or 'all'.") - # Clean old folders after the operation clean_old_folders(base_folder) except Exception as e: - print(f"Error: {e}") + print(f"Error encountered: {e}") + import traceback + traceback.print_exc() if __name__ == "__main__": main() From 5936896127b1c7079fb0db5cd35184d349d7e7a5 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:31:15 -0300 Subject: [PATCH 337/416] Update --- objects/youtube.py | 135 ++++++++++++++++++++++++++++----------------- 1 file changed, 83 insertions(+), 52 deletions(-) diff --git a/objects/youtube.py b/objects/youtube.py index c30dc2808..d9f745c88 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -73,25 +73,90 @@ def log_system_details(): for key, value in os.environ.items(): print(f"{key}: {value}") -def save_metadata(yt, folder): +def save_progress(stream, bytes_remaining, folder): try: - metadata = { - "title": yt.title if yt.title else "No Title", - "description": yt.description if yt.description else "No Description", - "url": yt.watch_url, - "duration_seconds": yt.length, # Add duration in seconds - "created_date": datetime.now().isoformat() # Track creation time + total_size = stream.filesize + downloaded = total_size - bytes_remaining + progress = { + "total_size": total_size, + "downloaded": downloaded, + "progress": round((downloaded / total_size) * 100, 2) } os.makedirs(folder, exist_ok=True) + progress_file_path = os.path.join(folder, "progress.json") + with open(progress_file_path, "w") as progress_file: + json.dump(progress, progress_file, indent=4) + print(f"Progress saved to '{progress_file_path}'.") + except Exception as e: + print(f"Error saving progress: {e}") + raise + +def clean_old_folders(base_folder, days=7): + """Delete folders older than a specified number of days.""" + now = datetime.now() + cutoff = now - timedelta(days=days) + + for folder in os.listdir(base_folder): + folder_path = os.path.join(base_folder, folder) + if os.path.isdir(folder_path): + metadata_path = os.path.join(folder_path, "metadata.json") + if os.path.exists(metadata_path): + try: + with open(metadata_path, "r") as meta_file: + metadata = json.load(meta_file) + created_date = datetime.fromisoformat(metadata.get("created_date")) + if created_date < cutoff: + print(f"Deleting folder '{folder_path}' (created on {created_date})") + subprocess.call(["rm", "-rf", folder_path]) + except Exception as e: + print(f"Error processing folder '{folder_path}': {e}") + +def get_metadata_safe(yt): + """Safely retrieve metadata from YouTube object.""" + metadata = {} + try: + metadata["title"] = yt.title if hasattr(yt, "title") and yt.title else "Unknown Title" + except Exception as e: + print(f"Error retrieving title: {e}") + metadata["title"] = "Unknown Title" + + try: + metadata["description"] = yt.description if hasattr(yt, "description") and yt.description else "No Description" + except Exception as e: + print(f"Error retrieving description: {e}") + metadata["description"] = "No Description" + + try: + metadata["url"] = yt.watch_url if hasattr(yt, "watch_url") else "Unknown URL" + except Exception as e: + print(f"Error retrieving URL: {e}") + metadata["url"] = "Unknown URL" + + try: + metadata["duration_seconds"] = yt.length if hasattr(yt, "length") else 0 + except Exception as e: + print(f"Error retrieving video length: {e}") + metadata["duration_seconds"] = 0 + + return metadata + + +def save_metadata(yt, folder): + """Save metadata with fallback.""" + try: + metadata = get_metadata_safe(yt) + metadata["created_date"] = datetime.now().isoformat() # Track creation time + os.makedirs(folder, exist_ok=True) metadata_file_path = os.path.join(folder, "metadata.json") with open(metadata_file_path, "w") as meta_file: json.dump(metadata, meta_file, indent=4) print(f"Metadata saved successfully to '{metadata_file_path}'.") except Exception as e: print(f"Error saving metadata: {e}") - raise + def save_thumbnail(yt, folder): + """Save the highest resolution thumbnail available, with fallback handling.""" try: video_id = yt.video_id thumbnail_urls = [ @@ -99,9 +164,10 @@ def save_thumbnail(yt, folder): f"https://img.youtube.com/vi/{video_id}/sddefault.jpg", # Standard definition f"https://img.youtube.com/vi/{video_id}/hqdefault.jpg", # High quality f"https://img.youtube.com/vi/{video_id}/mqdefault.jpg", # Medium quality - yt.thumbnail_url # Default thumbnail + yt.thumbnail_url if hasattr(yt, "thumbnail_url") else None # Default thumbnail ] + thumbnail_urls = [url for url in thumbnail_urls if url] # Remove None entries thumbnail_path = os.path.join(folder, "thumbs.jpg") os.makedirs(folder, exist_ok=True) @@ -116,56 +182,22 @@ def save_thumbnail(yt, folder): print(f"Could not download any thumbnails for video '{yt.title}'.") except Exception as e: print(f"Error in save_thumbnail: {e}") - raise + def download_video(yt, folder): + """Download the video at the highest resolution, with fallback.""" try: video_stream = yt.streams.get_highest_resolution() + if video_stream is None: + print("No streams available to download.") + return video_path = os.path.join(folder, "video.mp4") yt.register_on_progress_callback(lambda stream, chunk, bytes_remaining: save_progress(stream, bytes_remaining, folder)) video_stream.download(output_path=folder, filename="video.mp4") print(f"Video downloaded successfully to '{video_path}'.") except Exception as e: print(f"Error downloading video: {e}") - raise -def save_progress(stream, bytes_remaining, folder): - try: - total_size = stream.filesize - downloaded = total_size - bytes_remaining - progress = { - "total_size": total_size, - "downloaded": downloaded, - "progress": round((downloaded / total_size) * 100, 2) - } - os.makedirs(folder, exist_ok=True) - progress_file_path = os.path.join(folder, "progress.json") - with open(progress_file_path, "w") as progress_file: - json.dump(progress, progress_file, indent=4) - print(f"Progress saved to '{progress_file_path}'.") - except Exception as e: - print(f"Error saving progress: {e}") - raise - -def clean_old_folders(base_folder, days=7): - """Delete folders older than a specified number of days.""" - now = datetime.now() - cutoff = now - timedelta(days=days) - - for folder in os.listdir(base_folder): - folder_path = os.path.join(base_folder, folder) - if os.path.isdir(folder_path): - metadata_path = os.path.join(folder_path, "metadata.json") - if os.path.exists(metadata_path): - try: - with open(metadata_path, "r") as meta_file: - metadata = json.load(meta_file) - created_date = datetime.fromisoformat(metadata.get("created_date")) - if created_date < cutoff: - print(f"Deleting folder '{folder_path}' (created on {created_date})") - subprocess.call(["rm", "-rf", folder_path]) - except Exception as e: - print(f"Error processing folder '{folder_path}': {e}") def main(): if len(sys.argv) < 3: @@ -185,9 +217,7 @@ def main(): log_system_details() # Log environment details print(f"Attempting to access YouTube video: {url}") yt = YouTube(url) - print(f"Video title: {yt.title}") - print(f"Available streams: {yt.streams}") - + if action == "metadata": save_metadata(yt, folder_name) elif action == "thumbnail": @@ -203,9 +233,10 @@ def main(): clean_old_folders(base_folder) except Exception as e: - print(f"Error encountered: {e}") + print(f"Error encountered during processing: {e}") import traceback traceback.print_exc() + if __name__ == "__main__": main() From bd6fc44213d6bdc0bcf44a4524199228e90d5269 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:35:33 -0300 Subject: [PATCH 338/416] Update --- objects/youtube.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/objects/youtube.py b/objects/youtube.py index d9f745c88..9cfe07a13 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -63,6 +63,16 @@ def patched_get_throttling_function_name(js: str) -> str: ssl._create_default_https_context = ssl._create_unverified_context pytube.cipher.get_throttling_function_name = patched_get_throttling_function_name +# Add a User-Agent header to urllib requests +def add_user_agent(): + user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" + opener = urllib.request.build_opener() + opener.addheaders = [("User-Agent", user_agent)] + urllib.request.install_opener(opener) + +# Ensure User-Agent is applied +add_user_agent() + def log_system_details(): print("Logging system details:") print(f"Python version: {sys.version}") @@ -214,6 +224,7 @@ def main(): os.makedirs(folder_name, exist_ok=True) try: + add_user_agent() # Ensure all requests include a user-agent log_system_details() # Log environment details print(f"Attempting to access YouTube video: {url}") yt = YouTube(url) @@ -237,6 +248,5 @@ def main(): import traceback traceback.print_exc() - if __name__ == "__main__": main() From 7cc6c09899fcf6415f2915e159930c180799834d Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:43:13 -0300 Subject: [PATCH 339/416] Update --- objects/youtube.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/objects/youtube.py b/objects/youtube.py index 9cfe07a13..69c6b6405 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -6,6 +6,9 @@ import subprocess import urllib.request from datetime import datetime, timedelta +import http.client +http.client.HTTPConnection.debuglevel = 1 + # Function to ensure pytube is installed def ensure_pytube_installed(): @@ -65,11 +68,20 @@ def patched_get_throttling_function_name(js: str) -> str: # Add a User-Agent header to urllib requests def add_user_agent(): - user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" + user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)" + headers = [ + ("User-Agent", user_agent), + ("Accept-Language", "en-US,en;q=0.9"), + ("Accept-Encoding", "gzip, deflate, br"), + ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), + ("Connection", "keep-alive"), + ("Upgrade-Insecure-Requests", "1"), + ] opener = urllib.request.build_opener() - opener.addheaders = [("User-Agent", user_agent)] + opener.addheaders = headers urllib.request.install_opener(opener) + # Ensure User-Agent is applied add_user_agent() @@ -79,9 +91,6 @@ def log_system_details(): print(f"Pytube version: {pytube.__version__}") print(f"SSL version: {ssl.OPENSSL_VERSION}") print(f"System platform: {sys.platform}") - print("Environment variables:") - for key, value in os.environ.items(): - print(f"{key}: {value}") def save_progress(stream, bytes_remaining, folder): try: From 43b8d1e5099c9997bf22c27704eb47f38390763a Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:45:26 -0300 Subject: [PATCH 340/416] Update --- objects/youtube.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/objects/youtube.py b/objects/youtube.py index 69c6b6405..09e5a69b0 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -210,12 +210,18 @@ def download_video(yt, folder): if video_stream is None: print("No streams available to download.") return + print(f"Selected video stream: {video_stream}") video_path = os.path.join(folder, "video.mp4") - yt.register_on_progress_callback(lambda stream, chunk, bytes_remaining: save_progress(stream, bytes_remaining, folder)) + yt.register_on_progress_callback( + lambda stream, chunk, bytes_remaining: save_progress(stream, bytes_remaining, folder) + ) video_stream.download(output_path=folder, filename="video.mp4") print(f"Video downloaded successfully to '{video_path}'.") except Exception as e: print(f"Error downloading video: {e}") + import traceback + traceback.print_exc() + def main(): From ec8276d6af124df31f03b4b0f8b823a73a1b77aa Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:47:21 -0300 Subject: [PATCH 341/416] Update --- objects/youtube.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/youtube.py b/objects/youtube.py index 09e5a69b0..035e2ad05 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -72,7 +72,7 @@ def add_user_agent(): headers = [ ("User-Agent", user_agent), ("Accept-Language", "en-US,en;q=0.9"), - ("Accept-Encoding", "gzip, deflate, br"), + # ("Accept-Encoding", "gzip, deflate, br"), ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), ("Connection", "keep-alive"), ("Upgrade-Insecure-Requests", "1"), From 47da507af57da5f8737e69147727a9853f1b0488 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:53:10 -0300 Subject: [PATCH 342/416] Update --- objects/youtube.py | 125 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 96 insertions(+), 29 deletions(-) diff --git a/objects/youtube.py b/objects/youtube.py index 035e2ad05..33825ab94 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -7,8 +7,18 @@ import urllib.request from datetime import datetime, timedelta import http.client -http.client.HTTPConnection.debuglevel = 1 +import socket +http.client.HTTPConnection.debuglevel = 0 # Set to 1 for verbose HTTP output + +# Define the proxy list once at the top +PROXIES = [ + 'http://44.218.183.55:80', + 'http://44.195.247.145:80', + 'http://160.86.242.23:8080', + 'http://116.203.135.164:8090', + 'http://35.215.216.90:80', +] # Function to ensure pytube is installed def ensure_pytube_installed(): @@ -68,23 +78,35 @@ def patched_get_throttling_function_name(js: str) -> str: # Add a User-Agent header to urllib requests def add_user_agent(): - user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)" + user_agent = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/94.0.4606.61 Safari/537.36") headers = [ ("User-Agent", user_agent), ("Accept-Language", "en-US,en;q=0.9"), - # ("Accept-Encoding", "gzip, deflate, br"), - ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"), + ("Accept", "*/*"), ("Connection", "keep-alive"), - ("Upgrade-Insecure-Requests", "1"), ] opener = urllib.request.build_opener() opener.addheaders = headers urllib.request.install_opener(opener) - # Ensure User-Agent is applied add_user_agent() +def set_proxy(proxy_url): + proxy_handler = urllib.request.ProxyHandler({'http': proxy_url, 'https': proxy_url}) + opener = urllib.request.build_opener(proxy_handler) + opener.addheaders = urllib.request.build_opener().addheaders # Keep existing headers + urllib.request.install_opener(opener) + # Also set the proxy for pytube + pytube.request.default_proxy = proxy_url + +def reset_proxy(): + # Remove the proxy settings + urllib.request.install_opener(urllib.request.build_opener()) + pytube.request.default_proxy = None + def log_system_details(): print("Logging system details:") print(f"Python version: {sys.version}") @@ -92,7 +114,7 @@ def log_system_details(): print(f"SSL version: {ssl.OPENSSL_VERSION}") print(f"System platform: {sys.platform}") -def save_progress(stream, bytes_remaining, folder): +def save_progress(stream, chunk, bytes_remaining, folder): try: total_size = stream.filesize downloaded = total_size - bytes_remaining @@ -108,7 +130,6 @@ def save_progress(stream, bytes_remaining, folder): print(f"Progress saved to '{progress_file_path}'.") except Exception as e: print(f"Error saving progress: {e}") - raise def clean_old_folders(base_folder, days=7): """Delete folders older than a specified number of days.""" @@ -159,7 +180,6 @@ def get_metadata_safe(yt): return metadata - def save_metadata(yt, folder): """Save metadata with fallback.""" try: @@ -170,9 +190,10 @@ def save_metadata(yt, folder): with open(metadata_file_path, "w") as meta_file: json.dump(metadata, meta_file, indent=4) print(f"Metadata saved successfully to '{metadata_file_path}'.") + return True except Exception as e: print(f"Error saving metadata: {e}") - + return False def save_thumbnail(yt, folder): """Save the highest resolution thumbnail available, with fallback handling.""" @@ -185,23 +206,24 @@ def save_thumbnail(yt, folder): f"https://img.youtube.com/vi/{video_id}/mqdefault.jpg", # Medium quality yt.thumbnail_url if hasattr(yt, "thumbnail_url") else None # Default thumbnail ] - + thumbnail_urls = [url for url in thumbnail_urls if url] # Remove None entries thumbnail_path = os.path.join(folder, "thumbs.jpg") os.makedirs(folder, exist_ok=True) - + for url in thumbnail_urls: try: urllib.request.urlretrieve(url, thumbnail_path) print(f"Thumbnail downloaded successfully to '{thumbnail_path}' from URL: {url}") - return # Exit the loop on success + return True # Exit the loop on success except Exception as e: print(f"Failed to download thumbnail from '{url}': {e}") - + print(f"Could not download any thumbnails for video '{yt.title}'.") + return False except Exception as e: print(f"Error in save_thumbnail: {e}") - + return False def download_video(yt, folder): """Download the video at the highest resolution, with fallback.""" @@ -209,20 +231,39 @@ def download_video(yt, folder): video_stream = yt.streams.get_highest_resolution() if video_stream is None: print("No streams available to download.") - return + return False print(f"Selected video stream: {video_stream}") video_path = os.path.join(folder, "video.mp4") yt.register_on_progress_callback( - lambda stream, chunk, bytes_remaining: save_progress(stream, bytes_remaining, folder) + lambda stream, chunk, bytes_remaining: save_progress(stream, chunk, bytes_remaining, folder) ) video_stream.download(output_path=folder, filename="video.mp4") print(f"Video downloaded successfully to '{video_path}'.") + return True except Exception as e: print(f"Error downloading video: {e}") - import traceback - traceback.print_exc() - - + return False + +def attempt_with_proxies(function, *args): + # First attempt without proxy + reset_proxy() + success = function(*args) + if success: + return True + else: + for proxy in PROXIES: + print(f"Retrying with proxy {proxy}") + try: + set_proxy(proxy) + success = function(*args) + if success: + return True + except Exception as e: + print(f"Failed with proxy {proxy}: {e}") + finally: + reset_proxy() + print("All proxies failed.") + return False def main(): if len(sys.argv) < 3: @@ -242,21 +283,47 @@ def main(): add_user_agent() # Ensure all requests include a user-agent log_system_details() # Log environment details print(f"Attempting to access YouTube video: {url}") - yt = YouTube(url) + + yt = None + # Attempt to create YouTube object, retrying with proxies if necessary + success = False + # First attempt without proxy + reset_proxy() + try: + yt = YouTube(url) + success = True + except Exception as e: + print(f"Failed to create YouTube object without proxy: {e}") + if not success: + for proxy in PROXIES: + print(f"Retrying with proxy {proxy}") + try: + set_proxy(proxy) + yt = YouTube(url) + print(f"Successfully created YouTube object with proxy {proxy}") + success = True + break + except Exception as e: + print(f"Failed to create YouTube object with proxy {proxy}: {e}") + finally: + reset_proxy() + if not success: + print("Failed to access YouTube video with all proxies.") + sys.exit(1) if action == "metadata": - save_metadata(yt, folder_name) + attempt_with_proxies(save_metadata, yt, folder_name) elif action == "thumbnail": - save_thumbnail(yt, folder_name) + attempt_with_proxies(save_thumbnail, yt, folder_name) elif action == "video": - download_video(yt, folder_name) + attempt_with_proxies(download_video, yt, folder_name) elif action == "all": - save_metadata(yt, folder_name) - save_thumbnail(yt, folder_name) - download_video(yt, folder_name) + attempt_with_proxies(save_metadata, yt, folder_name) + attempt_with_proxies(save_thumbnail, yt, folder_name) + attempt_with_proxies(download_video, yt, folder_name) else: print("Invalid action specified. Use 'metadata', 'thumbnail', 'video', or 'all'.") - + clean_old_folders(base_folder) except Exception as e: print(f"Error encountered during processing: {e}") From f959c6bdf4b241ce45ec7d8e16b2600ed046c9ad Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:56:30 -0300 Subject: [PATCH 343/416] Update --- objects/youtube.py | 118 +++++++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 47 deletions(-) diff --git a/objects/youtube.py b/objects/youtube.py index 33825ab94..e888f87ad 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -8,6 +8,7 @@ from datetime import datetime, timedelta import http.client import socket +import concurrent.futures http.client.HTTPConnection.debuglevel = 0 # Set to 1 for verbose HTTP output @@ -226,44 +227,81 @@ def save_thumbnail(yt, folder): return False def download_video(yt, folder): - """Download the video at the highest resolution, with fallback.""" + """Download the video at the highest resolution, with merging audio and video.""" try: - video_stream = yt.streams.get_highest_resolution() - if video_stream is None: - print("No streams available to download.") + # Get the highest resolution video-only stream + video_stream = yt.streams.filter(adaptive=True, type="video").order_by('resolution').desc().first() + # Get the highest quality audio-only stream + audio_stream = yt.streams.filter(adaptive=True, type="audio").order_by('abr').desc().first() + + if video_stream is None or audio_stream is None: + print("No suitable streams available to download.") return False + print(f"Selected video stream: {video_stream}") + print(f"Selected audio stream: {audio_stream}") + video_path = os.path.join(folder, "video.mp4") - yt.register_on_progress_callback( - lambda stream, chunk, bytes_remaining: save_progress(stream, chunk, bytes_remaining, folder) - ) + audio_path = os.path.join(folder, "audio.mp4") + output_path = os.path.join(folder, "merged_video.mp4") + + # Download video and audio streams video_stream.download(output_path=folder, filename="video.mp4") - print(f"Video downloaded successfully to '{video_path}'.") + audio_stream.download(output_path=folder, filename="audio.mp4") + + print("Downloaded video and audio streams. Merging them now...") + + # Merge video and audio using ffmpeg + merge_command = [ + 'ffmpeg', + '-y', # Overwrite output file if it exists + '-i', video_path, + '-i', audio_path, + '-c', 'copy', + output_path + ] + subprocess.run(merge_command, check=True) + + print(f"Video merged successfully to '{output_path}'.") + # Optionally, remove the separate video and audio files + os.remove(video_path) + os.remove(audio_path) return True except Exception as e: - print(f"Error downloading video: {e}") + print(f"Error downloading or merging video: {e}") return False def attempt_with_proxies(function, *args): # First attempt without proxy reset_proxy() - success = function(*args) - if success: - return True - else: - for proxy in PROXIES: - print(f"Retrying with proxy {proxy}") - try: - set_proxy(proxy) - success = function(*args) - if success: - return True - except Exception as e: - print(f"Failed with proxy {proxy}: {e}") - finally: - reset_proxy() - print("All proxies failed.") - return False + try: + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit(function, *args) + success = future.result(timeout=10) + if success: + return True + except Exception as e: + print(f"Function failed without proxy: {e}") + except concurrent.futures.TimeoutError: + print("Function timed out without proxy") + + for proxy in PROXIES: + print(f"Retrying with proxy {proxy}") + try: + set_proxy(proxy) + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit(function, *args) + success = future.result(timeout=10) + if success: + return True + except concurrent.futures.TimeoutError: + print(f"Proxy {proxy} timed out") + except Exception as e: + print(f"Failed with proxy {proxy}: {e}") + finally: + reset_proxy() + print("All proxies failed.") + return False def main(): if len(sys.argv) < 3: @@ -285,28 +323,14 @@ def main(): print(f"Attempting to access YouTube video: {url}") yt = None - # Attempt to create YouTube object, retrying with proxies if necessary - success = False - # First attempt without proxy - reset_proxy() - try: + + def create_youtube_object(): + nonlocal yt yt = YouTube(url) - success = True - except Exception as e: - print(f"Failed to create YouTube object without proxy: {e}") - if not success: - for proxy in PROXIES: - print(f"Retrying with proxy {proxy}") - try: - set_proxy(proxy) - yt = YouTube(url) - print(f"Successfully created YouTube object with proxy {proxy}") - success = True - break - except Exception as e: - print(f"Failed to create YouTube object with proxy {proxy}: {e}") - finally: - reset_proxy() + return True + + success = attempt_with_proxies(create_youtube_object) + if not success: print("Failed to access YouTube video with all proxies.") sys.exit(1) From 072e20ff4321ac7611cdd29b1fb924eafbf2d0d5 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:58:00 -0300 Subject: [PATCH 344/416] Update --- objects/youtube.py | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/objects/youtube.py b/objects/youtube.py index e888f87ad..84ab4ad34 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -155,36 +155,34 @@ def clean_old_folders(base_folder, days=7): def get_metadata_safe(yt): """Safely retrieve metadata from YouTube object.""" metadata = {} - try: - metadata["title"] = yt.title if hasattr(yt, "title") and yt.title else "Unknown Title" - except Exception as e: - print(f"Error retrieving title: {e}") - metadata["title"] = "Unknown Title" - - try: - metadata["description"] = yt.description if hasattr(yt, "description") and yt.description else "No Description" - except Exception as e: - print(f"Error retrieving description: {e}") - metadata["description"] = "No Description" - - try: - metadata["url"] = yt.watch_url if hasattr(yt, "watch_url") else "Unknown URL" - except Exception as e: - print(f"Error retrieving URL: {e}") - metadata["url"] = "Unknown URL" - try: - metadata["duration_seconds"] = yt.length if hasattr(yt, "length") else 0 - except Exception as e: - print(f"Error retrieving video length: {e}") - metadata["duration_seconds"] = 0 + def fetch_metadata(): + try: + metadata["title"] = yt.title if hasattr(yt, "title") and yt.title else "Unknown Title" + metadata["description"] = yt.description if hasattr(yt, "description") and yt.description else "No Description" + metadata["url"] = yt.watch_url if hasattr(yt, "watch_url") else "Unknown URL" + metadata["duration_seconds"] = yt.length if hasattr(yt, "length") else 0 + return True # Indicate success + except Exception as e: + print(f"Error retrieving metadata: {e}") + return False + # Try fetching metadata directly, fallback to proxies if needed + success = attempt_with_proxies(fetch_metadata) + if not success: + print("Failed to retrieve metadata with all proxies.") + metadata = { + "title": "Unknown Title", + "description": "No Description", + "url": "Unknown URL", + "duration_seconds": 0, + } return metadata def save_metadata(yt, folder): """Save metadata with fallback.""" try: - metadata = get_metadata_safe(yt) + metadata = get_metadata_safe(yt) # Proxy-enabled metadata retrieval metadata["created_date"] = datetime.now().isoformat() # Track creation time os.makedirs(folder, exist_ok=True) metadata_file_path = os.path.join(folder, "metadata.json") From 18aebd85f7fba19edb228a86a164afd3ab0d3998 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 10:59:54 -0300 Subject: [PATCH 345/416] Update --- objects/youtube.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/objects/youtube.py b/objects/youtube.py index 84ab4ad34..80962c02a 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -19,8 +19,20 @@ 'http://160.86.242.23:8080', 'http://116.203.135.164:8090', 'http://35.215.216.90:80', + 'http://47.252.29.28:11222', + 'http://68.178.168.41:80', + 'http://148.72.165.171:10501', + 'http://47.242.47.64:8888', + 'http://200.174.198.86:8888', + 'http://13.208.56.180:80', + 'http://5.252.22.45:80', + 'http://20.111.54.16:8123', + 'http://157.254.53.50:80', + 'http://54.152.3.36:80', + 'http://13.36.113.81:3128' ] + # Function to ensure pytube is installed def ensure_pytube_installed(): try: From 93e90d66355e42d25956990e23969a072d7d3e7a Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 11:05:15 -0300 Subject: [PATCH 346/416] Update --- objects/youtube.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/objects/youtube.py b/objects/youtube.py index 80962c02a..995998166 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -14,12 +14,6 @@ # Define the proxy list once at the top PROXIES = [ - 'http://44.218.183.55:80', - 'http://44.195.247.145:80', - 'http://160.86.242.23:8080', - 'http://116.203.135.164:8090', - 'http://35.215.216.90:80', - 'http://47.252.29.28:11222', 'http://68.178.168.41:80', 'http://148.72.165.171:10501', 'http://47.242.47.64:8888', From ed5198bec765498a0330e74635f00ee59b9f7c55 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 11:06:43 -0300 Subject: [PATCH 347/416] Update --- objects/youtube.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/objects/youtube.py b/objects/youtube.py index 995998166..d9f13fb89 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -13,18 +13,7 @@ http.client.HTTPConnection.debuglevel = 0 # Set to 1 for verbose HTTP output # Define the proxy list once at the top -PROXIES = [ - 'http://68.178.168.41:80', - 'http://148.72.165.171:10501', - 'http://47.242.47.64:8888', - 'http://200.174.198.86:8888', - 'http://13.208.56.180:80', - 'http://5.252.22.45:80', - 'http://20.111.54.16:8123', - 'http://157.254.53.50:80', - 'http://54.152.3.36:80', - 'http://13.36.113.81:3128' -] +PROXIES = [] # Function to ensure pytube is installed From 6265f0e524cd82a180ec17ae7070fb66602a290d Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 29 Nov 2024 11:16:40 -0300 Subject: [PATCH 348/416] Update --- objects/youtube.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/objects/youtube.py b/objects/youtube.py index d9f13fb89..6df218fb6 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -82,6 +82,8 @@ def add_user_agent(): ("Accept-Language", "en-US,en;q=0.9"), ("Accept", "*/*"), ("Connection", "keep-alive"), + ("X-Forwarded-For", "203.0.113.1"), # Example valid IP + ("X-Real-IP", "203.0.113.1"), # Example valid IP ] opener = urllib.request.build_opener() opener.addheaders = headers From b3ce6cb18ec490abbd9144e3474ed93d0e60f1cc Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sun, 1 Dec 2024 12:21:01 -0300 Subject: [PATCH 349/416] Update --- objects/functions.php | 42 +++++++++++++++++++++------------ objects/youtube.py | 2 -- view/streamerResources/info.php | 4 ++++ 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/objects/functions.php b/objects/functions.php index 97092e49d..552bd0e70 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -188,24 +188,36 @@ function file_get_intbound_contents($url, $bindto_addr_family) return file_get_contents($url, false, $stream_context); } -// Returns a file size limit in bytes based on the PHP upload_max_filesize -// and post_max_size -function file_upload_max_size() -{ - static $max_size = -1; +function file_upload_max_size() { + // Retrieve the values from php.ini + $uploadMaxFileSize = ini_get('upload_max_filesize'); + $postMaxSize = ini_get('post_max_size'); - if ($max_size < 0) { - // Start with post_max_size. - $max_size = parse_size(ini_get('post_max_size')); + // Convert both values to bytes + $uploadMaxFileSizeBytes = convertToBytes($uploadMaxFileSize); + $postMaxSizeBytes = convertToBytes($postMaxSize); - // If upload_max_size is less, then reduce. Except if upload_max_size is - // zero, which indicates no limit. - $upload_max = parse_size(ini_get('upload_max_filesize')); - if ($upload_max > 0 && $upload_max < $max_size) { - $max_size = $upload_max; - } + // Return the smaller of the two values + return min($uploadMaxFileSizeBytes, $postMaxSizeBytes); +} + +function convertToBytes($value) { + $unit = strtoupper(substr($value, -1)); + $bytes = (int)$value; + + switch ($unit) { + case 'G': + $bytes *= 1024 ** 3; + break; + case 'M': + $bytes *= 1024 ** 2; + break; + case 'K': + $bytes *= 1024; + break; } - return $max_size; + + return $bytes; } function parse_size($size) diff --git a/objects/youtube.py b/objects/youtube.py index 6df218fb6..d9f13fb89 100644 --- a/objects/youtube.py +++ b/objects/youtube.py @@ -82,8 +82,6 @@ def add_user_agent(): ("Accept-Language", "en-US,en;q=0.9"), ("Accept", "*/*"), ("Connection", "keep-alive"), - ("X-Forwarded-For", "203.0.113.1"), # Example valid IP - ("X-Real-IP", "203.0.113.1"), # Example valid IP ] opener = urllib.request.build_opener() opener.addheaders = headers diff --git a/view/streamerResources/info.php b/view/streamerResources/info.php index d2f9222f0..2b73b9d94 100644 --- a/view/streamerResources/info.php +++ b/view/streamerResources/info.php @@ -14,5 +14,9 @@ :

    +

    + + : +

    \ No newline at end of file From 86cd42450466392a0176038bbb16fa7cd1c86955 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 13 Dec 2024 14:44:45 -0300 Subject: [PATCH 350/416] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e7eb955ac..a9bcb9c5a 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ Go get it here In order for you to be able to run AVideo, there are certain tools that need to be installed on your server. Don't worry, they are all FREE. To have a look at complete list of required tools, click the link below. - Linux (Kernel 2.6.32+) -- PHP 5.6+ +- PHP 8+ - MySQL 5.0+ - Apache web server 2.x (with mod_rewrite enabled) - FFMPEG From a0956919790ecb0b8193c9c476d4be5b92ffbf02 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 30 Dec 2024 17:15:11 -0300 Subject: [PATCH 351/416] Update --- install/install.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/install/install.php b/install/install.php index 8877b9152..0de97374c 100644 --- a/install/install.php +++ b/install/install.php @@ -25,11 +25,14 @@ $siteURL = trim(readline("")); } $siteURL = rtrim($siteURL, '/') . '/'; -$databaseName = ("AVideoEncoder_".preg_replace("/[^0-9a-z]/i", "", parse_url($siteURL, PHP_URL_HOST))); + +// Determine the folder name based on the current script directory +$folderName = basename(dirname(getcwd())); +$databaseName = "AVideoEncoder_" . preg_replace("/[^0-9a-z]/i", "", $folderName); $webSiteRootURL = $siteURL . "Encoder/"; -$databaseUser = empty($argv[2])?$databaseUser:$argv[2]; -$databasePass = empty($argv[3])?$databasePass:$argv[3]; +$databaseUser = empty($argv[2]) ? $databaseUser : $argv[2]; +$databasePass = empty($argv[3]) ? $databasePass : $argv[3]; $systemAdminPass = empty($argv[4]) ? "123" : $argv[4]; $databaseName = empty($argv[5]) ? $databaseName : $argv[5]; $webSiteRootURL = empty($argv[6]) ? $webSiteRootURL : $argv[6]; @@ -39,13 +42,13 @@ // install.php siteURL databaseUser databasePass systemAdminPass databaseName webSiteRootURLEncoder databaseHost databasePort $_POST['systemRootPath'] = str_replace("install", "", getcwd()); -if(!is_dir($_POST['systemRootPath'])) { +if (!is_dir($_POST['systemRootPath'])) { $_POST['systemRootPath'] = "/var/www/html/YouPHPTube/Encoder/"; - if(!is_dir($_POST['systemRootPath'])) { + if (!is_dir($_POST['systemRootPath'])) { $_POST['systemRootPath'] = "/var/www/html/AVideo/Encoder/"; } } -echo "Installing in {$_POST['systemRootPath']}".PHP_EOL; +echo "Installing in {$_POST['systemRootPath']}" . PHP_EOL; $_POST['databaseHost'] = $databaseHost; $_POST['databaseUser'] = $databaseUser; $_POST['databasePass'] = $databasePass; @@ -72,5 +75,5 @@ $global['mysqli']->query($sql); } else { - echo PHP_EOL."File not found {$streamerConfiguration}".PHP_EOL; + echo PHP_EOL . "File not found {$streamerConfiguration}" . PHP_EOL; } From 9e3500f6e1e2f3f3f9790632558b91a776a07a2c Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 30 Dec 2024 17:16:56 -0300 Subject: [PATCH 352/416] Update --- install/install.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install/install.php b/install/install.php index 0de97374c..42985b386 100644 --- a/install/install.php +++ b/install/install.php @@ -28,7 +28,9 @@ // Determine the folder name based on the current script directory $folderName = basename(dirname(getcwd())); -$databaseName = "AVideoEncoder_" . preg_replace("/[^0-9a-z]/i", "", $folderName); +// Extract the domain name from the URL +$domainName = preg_replace("/[^0-9a-z]/i", "", parse_url($siteURL, PHP_URL_HOST)); +$databaseName = "AVideoEncoder_" . $domainName . "_" . preg_replace("/[^0-9a-z]/i", "", $folderName); $webSiteRootURL = $siteURL . "Encoder/"; $databaseUser = empty($argv[2]) ? $databaseUser : $argv[2]; From 7aab22b6b9a0b2d308325cea5710c7454ad1ac0e Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 30 Dec 2024 17:28:03 -0300 Subject: [PATCH 353/416] Update --- install/makeAdmin.php | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/install/makeAdmin.php b/install/makeAdmin.php index 766c4ee08..c7502820c 100644 --- a/install/makeAdmin.php +++ b/install/makeAdmin.php @@ -3,24 +3,33 @@ require_once '../videos/configuration.php'; if (!isCommandLineInterface()) { - return die('Command Line only'); + die('Command Line only'); +} + +// Check if a username is passed as a command line argument +$userName = isset($argv[1]) ? trim($argv[1]) : ''; + +if (empty($userName)) { + echo "Enter the username or press enter to skip:"; + echo "\n"; + ob_flush(); + $userName = trim(readline("")); } -echo "Enter the username or press enter to skip:"; -echo "\n"; -ob_flush(); -$userName = trim(readline("")); if (!empty($userName)) { - $sql = "UPDATE {$global['tablesPrefix']}streamers SET isAdmin = 1 where user = '" . $userName . "'"; - echo $sql.PHP_EOL; + $sql = "UPDATE {$global['tablesPrefix']}streamers SET isAdmin = 1 WHERE user = '" . $userName . "'"; + echo $sql . PHP_EOL; + $insert_row = $global['mysqli']->query($sql); if ($insert_row) { - echo "User created".PHP_EOL; + echo "User updated to admin successfully." . PHP_EOL; } else { die($sql . ' Error : (' . $global['mysqli']->errno . ') ' . $global['mysqli']->error); } +} else { + echo "No username provided. Exiting." . PHP_EOL; } + echo "Bye"; -echo "\n"; -die(); +?> From b7da42002d341c41af4ef8cbbcb2f887771fccdd Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 8 Jan 2025 22:06:22 -0300 Subject: [PATCH 354/416] Update with logs --- objects/Format.php | 4 ++++ objects/HLSProcessor.php | 15 +++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/objects/Format.php b/objects/Format.php index 09d312bde..36b3d9037 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -889,12 +889,15 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod if (empty($global['disableHLSAudioMultitrack'])) { _error_log("AVideo-Encoder Format::exec use HLSProcessor"); $dynamic = HLSProcessor::createHLSWithAudioTracks($pathFileName, $destinationFile); + _error_log("AVideo-Encoder Format::exec use HLSProcessor Complete"); } else { _error_log("AVideo-Encoder Format::exec disableHLSAudioMultitrack"); $dynamic = self::preProcessDynamicHLS($pathFileName, $destinationFile); } $destinationFile = $dynamic[0]; $fc = $dynamic[1]; + + _error_log("AVideo-Encoder Format::exec destinationFile=$destinationFile fc=$fc "); } else { // use default 3 resolutions $destinationFile = self::preProcessHLS($destinationFile); } @@ -908,6 +911,7 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod $code = replaceFFMPEG($code); $code = removeUserAgentIfNotURL($code); if (empty($code)) { + _error_log("AVideo-Encoder Format::exec code is empty "); $obj->msg = "Code not found ($format_id, $pathFileName, $destinationFile, $encoder_queue_id)"; } else { $obj->code = $code; diff --git a/objects/HLSProcessor.php b/objects/HLSProcessor.php index c50416616..46b92580a 100644 --- a/objects/HLSProcessor.php +++ b/objects/HLSProcessor.php @@ -25,11 +25,11 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) if (file_exists($keyInfoFile)) { // Reuse existing keyinfo and key - _error_log("HLSProcessor: Reusing existing key and keyinfo"); + _error_log("HLSProcessor: createHLSWithAudioTracks Reusing existing key and keyinfo"); $keyFileName = basename(file($keyInfoFile)[0]); // Extract key filename from keyinfo } else { // Create encryption key - _error_log("HLSProcessor: Creating new encryption key and keyinfo"); + _error_log("HLSProcessor: createHLSWithAudioTracks Creating new encryption key and keyinfo"); $key = openssl_random_pseudo_bytes(16); $keyFileName = "enc_" . uniqid() . ".key"; file_put_contents($destinationFile . $keyFileName, $key); @@ -61,14 +61,15 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) "-hls_segment_filename \"{$audioTsPattern}\" {$audioFile}"; $audioCommand = removeUserAgentIfNotURL($audioCommand); - _error_log("Executing audio FFmpeg command: {$audioCommand}"); + _error_log("HLSProcessor: createHLSWithAudioTracks Executing audio FFmpeg command: {$audioCommand}"); exec($audioCommand, $output, $result_code); // Execute FFmpeg command if (!file_exists($audioFile)) { - _error_log("audioFile error: {$audioCommand} " . json_encode(array($output))); + _error_log("HLSProcessor: createHLSWithAudioTracks audioFile error: {$audioCommand} " . json_encode(array($output))); rmdir("{$destinationFile}audio_tracks/{$langDir}"); unset($audioTracks[$key]); } else { + _error_log("HLSProcessor: createHLSWithAudioTracks audioFile Success" ); // Add audio track entry to the master playlist $default = ($track->index == 0) ? "YES" : "NO"; // Set first audio track as default $masterPlaylist .= "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio_group\",NAME=\"{$track->title}\",LANGUAGE=\"{$language}\",DEFAULT={$default},AUTOSELECT=YES,URI=\"audio_tracks/{$langDir}/audio.m3u8\"".PHP_EOL; @@ -80,6 +81,7 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) // Generate HLS files for each resolution foreach ($resolutions as $key => $value) { if ($resolution >= $value) { + _error_log("HLSProcessor: createHLSWithAudioTracks Resolution found: {$value}"); $encodingSettings = Format::ENCODING_SETTINGS[$value]; $rate = $encodingSettings['maxrate']; // Use the maxrate from ENCODING_SETTINGS $framerate = isset($videoFramerate[$key]) && $videoFramerate[$key] > 0 ? $videoFramerate[$key] : 30; @@ -96,11 +98,12 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) $resolutionsFound++; } else { - _error_log("HLSProcessor: Skipped resolution {$value} for {$pathFileName} (video height is {$resolution})"); + _error_log("HLSProcessor: createHLSWithAudioTracks Skipped resolution {$value} for {$pathFileName} (video height is {$resolution})"); } } if (empty($resolutionsFound)) { + _error_log("HLSProcessor: createHLSWithAudioTracks Resolution found is empty"); // did not find any resolution, process the default one $encodingSettings = Format::ENCODING_SETTINGS[480]; $rate = $encodingSettings['maxrate']; // Use the maxrate from ENCODING_SETTINGS @@ -124,7 +127,7 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) // Write the master playlist to the destination file file_put_contents($destinationFile . "index.m3u8", $masterPlaylist); - _error_log("Master playlist written to: {$destinationFile}index.m3u8"); + _error_log("HLSProcessor: createHLSWithAudioTracks Master playlist written to: {$destinationFile}index.m3u8"); return array($destinationFile, $ffmpegCommand); } From cb20fa0882029f77ab819e69fc22dcc536f4d0cf Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 8 Jan 2025 22:11:37 -0300 Subject: [PATCH 355/416] Update --- objects/HLSProcessor.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/objects/HLSProcessor.php b/objects/HLSProcessor.php index 46b92580a..705a713bd 100644 --- a/objects/HLSProcessor.php +++ b/objects/HLSProcessor.php @@ -35,14 +35,14 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) file_put_contents($destinationFile . $keyFileName, $key); // Create keyinfo file for HLS encryption - $str = "../{$keyFileName}".PHP_EOL; + $str = "../{$keyFileName}" . PHP_EOL; $str .= "{$destinationFile}{$keyFileName}"; file_put_contents($keyInfoFile, $str); } // Initialize the master playlist content - $masterPlaylist = "#EXTM3U".PHP_EOL; - $masterPlaylist .= "#EXT-X-VERSION:3".PHP_EOL; + $masterPlaylist = "#EXTM3U" . PHP_EOL; + $masterPlaylist .= "#EXT-X-VERSION:3" . PHP_EOL; // Generate separate audio-only HLS streams for each audio track foreach ($audioTracks as $key => $track) { @@ -69,10 +69,10 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) rmdir("{$destinationFile}audio_tracks/{$langDir}"); unset($audioTracks[$key]); } else { - _error_log("HLSProcessor: createHLSWithAudioTracks audioFile Success" ); + _error_log("HLSProcessor: createHLSWithAudioTracks audioFile Success"); // Add audio track entry to the master playlist $default = ($track->index == 0) ? "YES" : "NO"; // Set first audio track as default - $masterPlaylist .= "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio_group\",NAME=\"{$track->title}\",LANGUAGE=\"{$language}\",DEFAULT={$default},AUTOSELECT=YES,URI=\"audio_tracks/{$langDir}/audio.m3u8\"".PHP_EOL; + $masterPlaylist .= "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio_group\",NAME=\"{$track->title}\",LANGUAGE=\"{$language}\",DEFAULT={$default},AUTOSELECT=YES,URI=\"audio_tracks/{$langDir}/audio.m3u8\"" . PHP_EOL; } } @@ -90,8 +90,8 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) $outputFile = "{$dir}index.m3u8"; // Add resolution playlist entry to the master playlist - $masterPlaylist .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($rate * 1000) . ",RESOLUTION=-2x{$value},AUDIO=\"audio_group\"".PHP_EOL; - $masterPlaylist .= "res{$value}/index.m3u8".PHP_EOL; + $masterPlaylist .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($rate * 1000) . ",RESOLUTION=-2x{$value},AUDIO=\"audio_group\"" . PHP_EOL; + $masterPlaylist .= "res{$value}/index.m3u8" . PHP_EOL; // Append FFmpeg command for this resolution $ffmpegCommand .= self::getFFmpegCommandForResolution($pathFileName, $value, $rate, $framerate, $audioTracks, $keyInfoFile, $outputFile); @@ -113,8 +113,8 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) $outputFile = "{$dir}index.m3u8"; // Add resolution playlist entry to the master playlist - $masterPlaylist .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($rate * 1000) . ",RESOLUTION=-2x{$resolution},AUDIO=\"audio_group\"".PHP_EOL; - $masterPlaylist .= "res{$resolution}/index.m3u8".PHP_EOL; + $masterPlaylist .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($rate * 1000) . ",RESOLUTION=-2x{$resolution},AUDIO=\"audio_group\"" . PHP_EOL; + $masterPlaylist .= "res{$resolution}/index.m3u8" . PHP_EOL; // Append FFmpeg command for this resolution $ffmpegCommand .= self::getFFmpegCommandForResolution($pathFileName, $resolution, $rate, $framerate, $audioTracks, $keyInfoFile, $outputFile); From 265699bdfb2363daf5c8589f220058679d7647bf Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 10 Jan 2025 10:26:04 -0300 Subject: [PATCH 356/416] Update --- install/test.php | 3 +++ objects/Format.php | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/install/test.php b/install/test.php index a2b4b055d..bb2e5f72d 100644 --- a/install/test.php +++ b/install/test.php @@ -50,7 +50,10 @@ //'https://4k.ypt.me/1080/Christmas_Tree_Pan.mp4',//(NO AUDIO) 'https://4k.ypt.me/4K/Hisense.mp4', 'https://4k.ypt.me/4K/Rocket_to_Space.mp4', + 'https://4k.ypt.me/4K/beach-uhd_3840_2160_30fps.mp4', 'https://4k.ypt.me/4K/Time_Scapes.mp4', + 'https://4k.ypt.me/1080/big_buck_bunny_720p_30mb.mp4', + 'https://4k.ypt.me/1080/rain-hd_1920_1080_30fps.mp4', ); foreach ($filesURL as $value) { diff --git a/objects/Format.php b/objects/Format.php index 36b3d9037..8e6891354 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -915,8 +915,8 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod $obj->msg = "Code not found ($format_id, $pathFileName, $destinationFile, $encoder_queue_id)"; } else { $obj->code = $code; - _error_log("AVideo-Encoder Format::exec Start Encoder [{$code}] "); $progressFile = "{$global['systemRootPath']}videos/{$encoder_queue_id}_tmpFile_progress.txt"; + _error_log("AVideo-Encoder Format::exec Start Encoder [{$code}] {$progressFile} "); $encoder->exec($code . " 1> \"{$progressFile}\" 2>&1", $output, $return_val); if (self::progressFileHasVideosWithErrors($progressFile)) { _error_log("AVideo-Encoder Format::exec ERROR ($return_val) progressFile={$progressFile}" . PHP_EOL . json_encode($output)); From 9c69552c192e67484d62a20aea277fa85fa31753 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 16 Jan 2025 13:11:33 -0300 Subject: [PATCH 357/416] Now the MP4 and MP3 files if is automatic, is processed In the encoder for HLS files only --- objects/Encoder.php | 2 +- objects/Format.php | 2 +- objects/HLSProcessor.php | 28 ++++++++++++++ objects/MP3Processor.php | 33 +++++++++++++++++ objects/MP4Processor.php | 79 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 142 insertions(+), 2 deletions(-) create mode 100644 objects/MP3Processor.php create mode 100644 objects/MP4Processor.php diff --git a/objects/Encoder.php b/objects/Encoder.php index 9d0b5e161..9116a2d53 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -1259,7 +1259,7 @@ static function canEncodeNow() public static function run($try = 0) { - global $global; + global $global, $advancedCustom; $maxTries = 4; $lockFile = sys_get_temp_dir() . '/encoder_run.lock'; diff --git a/objects/Format.php b/objects/Format.php index 8e6891354..bc2f1fd5c 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -113,7 +113,7 @@ protected static function getFromOrder($order) } return $row; } - + public function run($pathFileName, $encoder_queue_id) { _error_log("AVideo-Encoder Format::run($pathFileName, $encoder_queue_id) " . json_encode(debug_backtrace())); diff --git a/objects/HLSProcessor.php b/objects/HLSProcessor.php index 705a713bd..1cacf91da 100644 --- a/objects/HLSProcessor.php +++ b/objects/HLSProcessor.php @@ -2,6 +2,32 @@ class HLSProcessor { + + static function createMP3AndPM4IfNeed($pathFileName, $destinationFile){ + global $global; + + $advancedCustom = getAdvancedCustomizedObjectData(); + //_error_log('createMP3AndPM4IfNeed '.json_encode($advancedCustom)); + if($advancedCustom->autoConvertToMp4){ + require_once __DIR__.'/MP4Processor.php'; + try { + MP4Processor::createMP4($pathFileName, $destinationFile.'index.mp4'); + } catch (Exception $e) { + _error_log("Error creating MP4: " . $e->getMessage()); + } + + } + if($advancedCustom->autoConvertVideosToMP3){ + require_once __DIR__.'/MP3Processor.php'; + // Usage example + try { + MP3Processor::createMP3($pathFileName, $destinationFile.'index.mp3'); + } catch (Exception $e) { + _error_log("Error creating MP3: " . $e->getMessage()); + } + } + } + public static function createHLSWithAudioTracks($pathFileName, $destinationFile) { // Detect video resolution and audio tracks @@ -44,6 +70,8 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) $masterPlaylist = "#EXTM3U" . PHP_EOL; $masterPlaylist .= "#EXT-X-VERSION:3" . PHP_EOL; + self::createMP3AndPM4IfNeed($pathFileName, $destinationFile); + // Generate separate audio-only HLS streams for each audio track foreach ($audioTracks as $key => $track) { $language = isset($track->language) ? $track->language : "lang" . ($track->index + 1); // Assign language name, customize as needed diff --git a/objects/MP3Processor.php b/objects/MP3Processor.php new file mode 100644 index 000000000..7153d0e22 --- /dev/null +++ b/objects/MP3Processor.php @@ -0,0 +1,33 @@ += $resolution) { + return $resolution; + } + } + + // Return the lowest resolution if no match found + return $allowedResolutions[count($allowedResolutions) - 1] ?? null; + } + + private static function generateFFmpegCommand($inputFile, $outputFile, $resolution, $encodingSettings) + { + $ffmpeg = get_ffmpeg() . " -i $inputFile " . + "-vf scale=-2:$resolution " . + "-b:v {$encodingSettings['maxrate']}k " . + "-minrate {$encodingSettings['minrate']}k " . + "-maxrate {$encodingSettings['maxrate']}k " . + "-bufsize {$encodingSettings['bufsize']}k " . + "-c:v h264 -pix_fmt yuv420p " . + "-c:a aac -b:a {$encodingSettings['audioBitrate']}k " . + "-movflags +faststart " . + "$outputFile"; + + return removeUserAgentIfNotURL($ffmpeg); + } +} \ No newline at end of file From 071025d593dc794d4431c97024557f058370c3a4 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 16 Jan 2025 14:57:20 -0300 Subject: [PATCH 358/416] Update --- objects/Format.php | 7 ++++++- objects/MP3Processor.php | 1 + objects/MP4Processor.php | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/objects/Format.php b/objects/Format.php index bc2f1fd5c..14661510a 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -902,7 +902,12 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod $destinationFile = self::preProcessHLS($destinationFile); } } elseif ($format_id == 31) { // it is MP4 - $fc = self::getDynamicCommandFromMP4($pathFileName, $encoder_queue_id); + $advancedCustom = getAdvancedCustomizedObjectData(); + if(!empty($advancedCustom->singleResolution->value)){ + return MP4Processor::createMP4MaxResolutionFromQueueId($pathFileName, $encoder_queue_id, $advancedCustom->singleResolution->value); + }else{ + $fc = self::getDynamicCommandFromMP4($pathFileName, $encoder_queue_id); + } } elseif ($format_id == 32) { // it is WebM $fc = self::getDynamicCommandFromWebm($pathFileName, $encoder_queue_id); } diff --git a/objects/MP3Processor.php b/objects/MP3Processor.php index 7153d0e22..668a7c975 100644 --- a/objects/MP3Processor.php +++ b/objects/MP3Processor.php @@ -25,6 +25,7 @@ public static function createMP3($pathFileName, $destinationFile) private static function generateFFmpegCommand($inputFile, $outputFile, $audioBitrate) { $ffmpeg = get_ffmpeg() . " -i $inputFile " . + '-preset veryfast '. "-vn -c:a libmp3lame -b:a {$audioBitrate}k " . "-movflags +faststart " . "$outputFile"; diff --git a/objects/MP4Processor.php b/objects/MP4Processor.php index d8a11f06e..554e4c4c3 100644 --- a/objects/MP4Processor.php +++ b/objects/MP4Processor.php @@ -2,13 +2,35 @@ class MP4Processor { - public static function createMP4($pathFileName, $destinationFile) + + public static function createMP4MaxResolutionFromQueueId($pathFileName, $encoder_queue_id, $maxResolution = 1080){ + $inputResolution = self::getResolution($pathFileName); + if($inputResolution> $maxResolution){ + $inputResolution = $maxResolution; + } + $destinationFile = Encoder::getTmpFileName($encoder_queue_id, 'mp4', $inputResolution); + return self::createMP4($pathFileName, $destinationFile, $encoder_queue_id, $inputResolution); + } + + public static function createMP4MaxResolution($pathFileName, $destinationFile, $maxResolution = 1080){ + + $inputResolution = self::getResolution($pathFileName); + if($inputResolution> $maxResolution){ + $inputResolution = $maxResolution; + } + return self::createMP4($pathFileName, $destinationFile, 0, $inputResolution); + } + + public static function createMP4($pathFileName, $destinationFile, $encoder_queue_id = 0, $inputResolution = null) { + global $global; // Get allowed resolutions from Format::ENCODING_SETTINGS $allowedResolutions = array_keys(Format::ENCODING_SETTINGS); // Get the resolution of the input file - $inputResolution = self::getResolution($pathFileName); + if ($inputResolution === null) { + $inputResolution = self::getResolution($pathFileName); + } // Determine the target resolution $targetResolution = self::getClosestResolution($inputResolution, $allowedResolutions); @@ -28,6 +50,11 @@ public static function createMP4($pathFileName, $destinationFile) $encodingSettings ); + if(!empty($encoder_queue_id)){ + $progressFile = "{$global['systemRootPath']}videos/{$encoder_queue_id}_tmpFile_progress.txt"; + $command = "{$command} > 1 $progressFile 2>&1"; + } + // Execute the FFmpeg command _error_log("MP4Processor: Executing FFmpeg command: $command"); exec($command, $output, $resultCode); @@ -64,6 +91,7 @@ private static function getClosestResolution($inputResolution, $allowedResolutio private static function generateFFmpegCommand($inputFile, $outputFile, $resolution, $encodingSettings) { $ffmpeg = get_ffmpeg() . " -i $inputFile " . + '-preset veryfast '. "-vf scale=-2:$resolution " . "-b:v {$encodingSettings['maxrate']}k " . "-minrate {$encodingSettings['minrate']}k " . From 5833c2db2ca05ed0b1ec9149a1d9eb19485b5bcd Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 16 Jan 2025 16:07:41 -0300 Subject: [PATCH 359/416] https://github.com/WWBN/AVideo/issues/9813#issuecomment-2594381098 --- objects/Format.php | 15 +++++++++++---- objects/HLSProcessor.php | 2 -- objects/MP4Processor.php | 10 +++++++--- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/objects/Format.php b/objects/Format.php index 14661510a..0ce621c8a 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -1,6 +1,8 @@ singleResolution->value)){ + _error_log("AVideo-Encoder Format::exec line=" . __LINE__); + if (!empty($advancedCustom->singleResolution->value)) { + _error_log("AVideo-Encoder Format::exec MP4Processor::createMP4MaxResolutionFromQueueId($pathFileName, $encoder_queue_id, {$advancedCustom->singleResolution->value})"); return MP4Processor::createMP4MaxResolutionFromQueueId($pathFileName, $encoder_queue_id, $advancedCustom->singleResolution->value); - }else{ + } else { + _error_log("AVideo-Encoder Format::exec line=" . __LINE__); $fc = self::getDynamicCommandFromMP4($pathFileName, $encoder_queue_id); } } elseif ($format_id == 32) { // it is WebM diff --git a/objects/HLSProcessor.php b/objects/HLSProcessor.php index 1cacf91da..87e2ee6d5 100644 --- a/objects/HLSProcessor.php +++ b/objects/HLSProcessor.php @@ -9,7 +9,6 @@ static function createMP3AndPM4IfNeed($pathFileName, $destinationFile){ $advancedCustom = getAdvancedCustomizedObjectData(); //_error_log('createMP3AndPM4IfNeed '.json_encode($advancedCustom)); if($advancedCustom->autoConvertToMp4){ - require_once __DIR__.'/MP4Processor.php'; try { MP4Processor::createMP4($pathFileName, $destinationFile.'index.mp4'); } catch (Exception $e) { @@ -18,7 +17,6 @@ static function createMP3AndPM4IfNeed($pathFileName, $destinationFile){ } if($advancedCustom->autoConvertVideosToMP3){ - require_once __DIR__.'/MP3Processor.php'; // Usage example try { MP3Processor::createMP3($pathFileName, $destinationFile.'index.mp3'); diff --git a/objects/MP4Processor.php b/objects/MP4Processor.php index 554e4c4c3..38ecd43bb 100644 --- a/objects/MP4Processor.php +++ b/objects/MP4Processor.php @@ -4,6 +4,8 @@ class MP4Processor { public static function createMP4MaxResolutionFromQueueId($pathFileName, $encoder_queue_id, $maxResolution = 1080){ + _error_log("MP4Processor::createMP4MaxResolutionFromQueueId [$pathFileName, $encoder_queue_id, $maxResolution ] "); + $inputResolution = self::getResolution($pathFileName); if($inputResolution> $maxResolution){ $inputResolution = $maxResolution; @@ -23,6 +25,7 @@ public static function createMP4MaxResolution($pathFileName, $destinationFile, $ public static function createMP4($pathFileName, $destinationFile, $encoder_queue_id = 0, $inputResolution = null) { + _error_log("MP4Processor::createMP4 [$pathFileName, $destinationFile, $encoder_queue_id, $inputResolution ] "); global $global; // Get allowed resolutions from Format::ENCODING_SETTINGS $allowedResolutions = array_keys(Format::ENCODING_SETTINGS); @@ -52,7 +55,7 @@ public static function createMP4($pathFileName, $destinationFile, $encoder_queue if(!empty($encoder_queue_id)){ $progressFile = "{$global['systemRootPath']}videos/{$encoder_queue_id}_tmpFile_progress.txt"; - $command = "{$command} > 1 $progressFile 2>&1"; + $command = "{$command} 1> $progressFile 2>&1"; } // Execute the FFmpeg command @@ -60,8 +63,9 @@ public static function createMP4($pathFileName, $destinationFile, $encoder_queue exec($command, $output, $resultCode); if ($resultCode !== 0) { - _error_log("MP4Processor: FFmpeg failed with output: " . json_encode($output)); - throw new Exception("Failed to create MP4 file."); + _error_log("MP4Processor: FFmpeg failed with output: $resultCode $command" . json_encode($output)); + var_dump($resultCode, $output, $command); + throw new Exception("Failed to create MP4 file. $resultCode $command " . json_encode($output)); } _error_log("MP4Processor: MP4 file created successfully at $destinationFile"); From 0c3c22703460f30e9f2bce5c898c816205c6fb17 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 20 Jan 2025 14:12:52 -0300 Subject: [PATCH 360/416] https://github.com/WWBN/AVideo/issues/9817#issuecomment-2599133126 --- objects/MP4Processor.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/objects/MP4Processor.php b/objects/MP4Processor.php index 38ecd43bb..a115f3749 100644 --- a/objects/MP4Processor.php +++ b/objects/MP4Processor.php @@ -10,8 +10,14 @@ public static function createMP4MaxResolutionFromQueueId($pathFileName, $encoder if($inputResolution> $maxResolution){ $inputResolution = $maxResolution; } - $destinationFile = Encoder::getTmpFileName($encoder_queue_id, 'mp4', $inputResolution); - return self::createMP4($pathFileName, $destinationFile, $encoder_queue_id, $inputResolution); + // Get allowed resolutions from Format::ENCODING_SETTINGS + $allowedResolutions = array_keys(Format::ENCODING_SETTINGS); + // Determine the target resolution + $targetResolution = self::getClosestResolution($inputResolution, $allowedResolutions); + + $destinationFile = Encoder::getTmpFileName($encoder_queue_id, 'mp4', $targetResolution); + _error_log("MP4Processor::createMP4MaxResolutionFromQueueId [$pathFileName, $encoder_queue_id, $maxResolution ] [{$inputResolution}p] => [{$targetResolution}p] $destinationFile"); + return self::createMP4($pathFileName, $destinationFile, $encoder_queue_id, $targetResolution); } public static function createMP4MaxResolution($pathFileName, $destinationFile, $maxResolution = 1080){ From d03de2038fc3882bffa8f9ba98eb16e8c420509b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 28 Jan 2025 23:20:39 -0300 Subject: [PATCH 361/416] Update --- view/listFiles.json.php | 70 +++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/view/listFiles.json.php b/view/listFiles.json.php index a42258614..2ea718c68 100644 --- a/view/listFiles.json.php +++ b/view/listFiles.json.php @@ -3,7 +3,11 @@ require_once $global['systemRootPath'] . 'objects/Login.php'; header('Content-Type: application/json'); -if(empty($global['allowed'])){ +error_reporting(E_ALL); +ini_set('display_errors', 1); +ini_set('log_errors', 1); + +if (empty($global['allowed'])) { $global['allowed'] = array(); } @@ -12,40 +16,66 @@ $global['allowed'] = array_unique($global['allowed']); $files = array(); -if(Login::canBulkEncode()){ + +if (Login::canBulkEncode()) { if (!empty($_POST['path'])) { - $path = $_POST['path']; - if (substr($path, -1) !== DIRECTORY_SEPARATOR) { - $path .= DIRECTORY_SEPARATOR; + $path = rtrim($_POST['path'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; + + // Log the received path + error_log("Bulk Encode: Received path - " . $path); + + if (!file_exists($path)) { + error_log("Bulk Encode Error: Path does not exist - " . $path); + echo json_encode(["error" => "Path does not exist"]); + exit; } - + + if (!is_readable($path)) { + error_log("Bulk Encode Error: Path is not readable - " . $path); + echo json_encode(["error" => "Path is not readable"]); + exit; + } + $video_array = array(); - if (file_exists($path)) { - foreach ($global['allowed'] as $value) { - $video_array = array_merge($video_array, glob($path . "*." . $value)); + foreach ($global['allowed'] as $ext) { + $filesFound = glob($path . "*." . $ext); + if ($filesFound === false) { + error_log("Bulk Encode Error: glob() failed for extension .$ext in path $path"); + } else { + error_log("Bulk Encode: Found " . count($filesFound) . " files with extension .$ext"); } + $video_array = array_merge($video_array, $filesFound); } - - // Deduplication: Use an associative array to track already added files + + if (empty($video_array)) { + error_log("Bulk Encode Warning: No files found in the directory."); + } + $addedFiles = []; - $id = 0; - foreach ($video_array as $key => $value) { - // If file is already added, skip - if(isset($addedFiles[strtolower($value)])) { + foreach ($video_array as $value) { + if (isset($addedFiles[strtolower($value)])) { continue; } - - // Mark the file as added + $addedFiles[strtolower($value)] = true; - $path_parts = pathinfo($value); + $obj = new stdClass(); $obj->id = $id++; - $obj->path = _utf8_encode($value); - $obj->name = _utf8_encode($path_parts['basename']); + $obj->path = utf8_encode($value); + $obj->name = utf8_encode($path_parts['basename']); $files[] = $obj; } + } else { + error_log("Bulk Encode Error: No path provided."); + echo json_encode(["error" => "No path provided"]); + exit; } +} else { + error_log("Bulk Encode Error: User does not have permission to bulk encode."); + echo json_encode(["error" => "Permission denied"]); + exit; } + echo json_encode($files); From 7e9eb3e347fb81144093dd8c985223e525542872 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 28 Jan 2025 23:24:17 -0300 Subject: [PATCH 362/416] Update --- view/listFiles.json.php | 52 +++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/view/listFiles.json.php b/view/listFiles.json.php index 2ea718c68..4a152fc89 100644 --- a/view/listFiles.json.php +++ b/view/listFiles.json.php @@ -8,47 +8,50 @@ ini_set('log_errors', 1); if (empty($global['allowed'])) { - $global['allowed'] = array(); + $global['allowed'] = []; } -// Ensure extensions are in lowercase and unique $global['allowed'] = array_map('strtolower', $global['allowed']); $global['allowed'] = array_unique($global['allowed']); -$files = array(); +$files = []; if (Login::canBulkEncode()) { if (!empty($_POST['path'])) { - $path = rtrim($_POST['path'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; - - // Log the received path - error_log("Bulk Encode: Received path - " . $path); - - if (!file_exists($path)) { - error_log("Bulk Encode Error: Path does not exist - " . $path); - echo json_encode(["error" => "Path does not exist"]); + $path = realpath($_POST['path']); + if ($path === false) { + error_log("Bulk Encode Error: realpath() failed for " . $_POST['path']); + echo json_encode(["error" => "Invalid path"]); exit; } + $path .= DIRECTORY_SEPARATOR; + error_log("Bulk Encode: Resolved path - " . $path); - if (!is_readable($path)) { - error_log("Bulk Encode Error: Path is not readable - " . $path); - echo json_encode(["error" => "Path is not readable"]); + if (!file_exists($path) || !is_readable($path)) { + error_log("Bulk Encode Error: Path not accessible - " . $path); + echo json_encode(["error" => "Path not accessible"]); exit; } - $video_array = array(); - foreach ($global['allowed'] as $ext) { - $filesFound = glob($path . "*." . $ext); - if ($filesFound === false) { - error_log("Bulk Encode Error: glob() failed for extension .$ext in path $path"); - } else { - error_log("Bulk Encode: Found " . count($filesFound) . " files with extension .$ext"); + $video_array = []; + $dirContents = scandir($path); + + if ($dirContents !== false) { + foreach ($dirContents as $file) { + $filePath = $path . $file; + if (is_file($filePath)) { + $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); + if (in_array($ext, $global['allowed'])) { + $video_array[] = $filePath; + } + } } - $video_array = array_merge($video_array, $filesFound); + } else { + error_log("Bulk Encode Error: scandir() failed for " . $path); } if (empty($video_array)) { - error_log("Bulk Encode Warning: No files found in the directory."); + error_log("Bulk Encode Warning: No files found."); } $addedFiles = []; @@ -57,7 +60,6 @@ if (isset($addedFiles[strtolower($value)])) { continue; } - $addedFiles[strtolower($value)] = true; $path_parts = pathinfo($value); @@ -73,7 +75,7 @@ exit; } } else { - error_log("Bulk Encode Error: User does not have permission to bulk encode."); + error_log("Bulk Encode Error: User does not have permission."); echo json_encode(["error" => "Permission denied"]); exit; } From 8e3298171dcc528920494551f165f649159ab3cd Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 29 Jan 2025 20:49:38 -0300 Subject: [PATCH 363/416] Encoder now supports download from FTP URLs --- objects/Encoder.php | 55 +++++++++++++---------- objects/FTPDownloader.php | 84 +++++++++++++++++++++++++++++++++++ objects/functions.php | 6 ++- objects/security.php | 2 +- view/youtubeDl.json.php | 93 +++++++++++++++++++++++---------------- 5 files changed, 177 insertions(+), 63 deletions(-) create mode 100644 objects/FTPDownloader.php diff --git a/objects/Encoder.php b/objects/Encoder.php index 9116a2d53..e5d3d7b70 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -682,7 +682,7 @@ public static function downloadFile($queue_id) return $obj; } - if (file_exists($obj->pathFileName)) { + if (file_exists($obj->pathFileName) && filesize($obj->pathFileName) > 20) { if ($q->getStatus() == 'queue') { self::setDownloaded($queue_id, $obj->pathFileName); } @@ -708,25 +708,34 @@ public static function downloadFile($queue_id) if (!empty($q->getVideoDownloadedLink())) { $videoURL = $q->getVideoDownloadedLink(); - $downloadWithPytubeFilename = ''; - if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($videoURL)) { - $downloadWithPytubeFilename = 'video_download_' . $queue_id; - $response = self::downloadWithPytube($videoURL, $downloadWithPytubeFilename); - } - if(empty($downloadWithPytubeFilename) || $response->error){ - //begin youtube-dl downloading and symlink it to the video temp file - $response = static::getYoutubeDl($videoURL, $queue_id, $obj->pathFileName); - if (!empty($response)) { - _error_log("downloadFile:getYoutubeDl SUCCESS queue_id = {$queue_id}"); - $obj->pathFileName = $response; - $obj->error = false; - } else { - _error_log("downloadFile:getYoutubeDl ERROR queue_id = {$queue_id}"); - $obj->error = false; - } + + if(isFTPURL($videoURL)){ + require_once __DIR__ . '/FTPDownloader.php'; + FTPDownloader::copy($videoURL, $obj->pathFileName); + $obj->error = !file_exists($obj->pathFileName); }else{ - $obj->pathFileName = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/video.mp4"; + + $downloadWithPytubeFilename = ''; + if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($videoURL)) { + $downloadWithPytubeFilename = 'video_download_' . $queue_id; + $response = self::downloadWithPytube($videoURL, $downloadWithPytubeFilename); + } + if(empty($downloadWithPytubeFilename) || $response->error){ + //begin youtube-dl downloading and symlink it to the video temp file + $response = static::getYoutubeDl($videoURL, $queue_id, $obj->pathFileName); + if (!empty($response)) { + _error_log("downloadFile:getYoutubeDl SUCCESS queue_id = {$queue_id}"); + $obj->pathFileName = $response; + $obj->error = false; + } else { + _error_log("downloadFile:getYoutubeDl ERROR queue_id = {$queue_id}"); + $obj->error = false; + } + }else{ + $obj->pathFileName = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/video.mp4"; + } } + } else { _error_log("downloadFile: not using getYoutubeDl"); //symlink the downloaded file to the video temp file ($obj-pathFileName) @@ -980,9 +989,9 @@ public static function getQueue($status = array(), $streamers_id = 0) $sql .= " AND streamers_id = {$streamers_id} "; } - $sql .= " ORDER BY - CASE WHEN priority IS NULL THEN 1 ELSE 0 END ASC, - priority ASC, + $sql .= " ORDER BY + CASE WHEN priority IS NULL THEN 1 ELSE 0 END ASC, + priority ASC, e.id ASC "; //var_dump($sql); /** @@ -2794,7 +2803,7 @@ public static function getTitleFromLink($link, $streamers_id, $addOauthFromProvi if (!isWindows()) { $prepend = 'LC_ALL=en_US.UTF-8 '; } - + $link = str_replace("'", '', $link); $link = escapeshellarg($link); $response = array('error' => true, 'output' => ''); @@ -2896,7 +2905,7 @@ public static function getDescriptionFromLink($link, $streamers_id, $addOauthFro if (empty($link)) { return ''; } - + if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { $resp = self::getDescriptionFromLinkWithPytube($link); if(!empty($resp)){ diff --git a/objects/FTPDownloader.php b/objects/FTPDownloader.php new file mode 100644 index 000000000..8e8288578 --- /dev/null +++ b/objects/FTPDownloader.php @@ -0,0 +1,84 @@ +ftpUrl = addLastSlash($ftpUrl); + $this->parseFtpUrl($ftpUrl); + } + + private function parseFtpUrl($ftpUrl) + { + $parsedUrl = parse_url($ftpUrl); + if (!$parsedUrl || !isset($parsedUrl['scheme']) || $parsedUrl['scheme'] !== 'ftp') { + throw new Exception("Invalid FTP URL"); + } + + $this->ftpHost = $parsedUrl['host'] ?? ''; + $this->ftpUser = $parsedUrl['user'] ?? 'anonymous'; + $this->ftpPass = $parsedUrl['pass'] ?? ''; + $this->ftpPort = $parsedUrl['port'] ?? 21; + $this->remotePath = $parsedUrl['path'] ?? '/'; + } + + public function connect() + { + $this->ftpConn = ftp_connect($this->ftpHost, $this->ftpPort); + if (!$this->ftpConn) { + throw new Exception("Could not connect to FTP server"); + } + + if (!ftp_login($this->ftpConn, $this->ftpUser, $this->ftpPass)) { + throw new Exception("Could not log in to FTP server"); + } + + ftp_pasv($this->ftpConn, true); // Enable passive mode + } + + public function queueFiles() + { + $files = ftp_nlist($this->ftpConn, $this->remotePath); + if ($files === false) { + throw new Exception("Could not list files in directory"); + } + + foreach ($files as $file) { + if (preg_match('/\.(mp4|mp3)$/i', $file)) { + $basename = basename($file); + $link = "{$this->ftpUrl}{$basename}"; + addVideo($link, Login::getStreamerId(), $basename); + } + } + } + + static function copy($ftpUrl, $savePath) + { + _error_log("FTP copy($ftpUrl, $savePath)"); + + $savePath = str_replace('..', '', $savePath); + + $command = "wget -O \"$savePath\" \"$ftpUrl\" "; + + exec($command); + + return file_exists($savePath) && filesize($savePath) > 20; + } + + + public function close() + { + if ($this->ftpConn) { + ftp_close($this->ftpConn); + } + } +} diff --git a/objects/functions.php b/objects/functions.php index 552bd0e70..d22686667 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1432,6 +1432,10 @@ function _error_log($message) error_log($str); } +function isFTPURL($url){ + return preg_match('/^ftps?:/i', $url); +} + function addVideo($link, $streamers_id, $title = "") { $obj = new stdClass(); // remove list parameter from @@ -1599,7 +1603,7 @@ function addQueryStringParameter($url, $varname, $value) parse_str($parsedUrl['query'], $query); } $query[$varname] = $value; - + // Ensure 'current' is the last parameter $currentValue = null; if (isset($query['current'])) { diff --git a/objects/security.php b/objects/security.php index 5abe6a064..0b27c20f4 100644 --- a/objects/security.php +++ b/objects/security.php @@ -28,7 +28,7 @@ foreach ($filterURL as $key => $value) { if (!empty($scanThis[$value])) { - if (!filter_var($scanThis[$value], FILTER_VALIDATE_URL) || !preg_match("/^http.*/i", $scanThis[$value])) { + if (!filter_var($scanThis[$value], FILTER_VALIDATE_URL) || !preg_match("/^(http|ftp).*/i", $scanThis[$value])) { //_error_log($value.' attack ' . json_encode($_SERVER), AVideoLog::$SECURITY); unset($scanThis[$value]); } else { diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index b36bae9a7..c9b4484a8 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -10,51 +10,68 @@ session_write_close(); -if (!empty($_REQUEST['webSiteRootURL']) && !empty($_REQUEST['user']) && !empty($_REQUEST['pass']) && empty($_REQUEST['justLogin'])) { - error_log("youtubeDl.json: Login::run"); - Login::run($_REQUEST['user'], $_REQUEST['pass'], $_REQUEST['webSiteRootURL'], true); -} - -if (!Login::canUpload()) { - $obj->msg = "This user can not upload files"; +if (empty($_REQUEST['videoURL'])) { + $obj->msg = "videoURL is empty"; } else { - if (!($streamers_id = Login::getStreamerId())) { - $obj->msg = "There is no streamer site"; + if (!empty($_REQUEST['webSiteRootURL']) && !empty($_REQUEST['user']) && !empty($_REQUEST['pass']) && empty($_REQUEST['justLogin'])) { + error_log("youtubeDl.json: Login::run"); + Login::run($_REQUEST['user'], $_REQUEST['pass'], $_REQUEST['webSiteRootURL'], true); + } + + if (!Login::canUpload()) { + $obj->msg = "This user can not upload files"; } else { - // if it is a channel - $rexexp = "/^(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/(channel|user).+/"; - if (preg_match($rexexp, $_REQUEST['videoURL'])) { - if (!Login::canBulkEncode()) { - $obj->msg = "Channel Import is disabled"; - die(json_encode($obj)); - } - $start = 0; - $end = 100; - if (!empty($_REQUEST['startIndex'])) { - $start = $current = intval($_REQUEST['startIndex']); - } - if (!empty($_REQUEST['endIndex'])) { - $end = intval($_REQUEST['endIndex']); - } - error_log("Processing Channel {$start} to {$end}"); - $list = Encoder::getReverseVideosJsonListFromLink($_REQUEST['videoURL'], Login::getStreamerId()); - $i = $start; - for (; $i <= $end; $i++) { - if (is_object($list[$i]) && empty($list[$i]->id)) { - error_log(($i) . " Not Object " . print_r($list[$i], true)); - continue; + if (!($streamers_id = Login::getStreamerId())) { + $obj->msg = "There is no streamer site"; + } else { + // if it is a channel + $rexexp = "/^(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/(channel|user).+/"; + if (preg_match($rexexp, $_REQUEST['videoURL'])) { + if (!Login::canBulkEncode()) { + $obj->msg = "Channel Import is disabled"; + die(json_encode($obj)); + } + $start = 0; + $end = 100; + if (!empty($_REQUEST['startIndex'])) { + $start = $current = intval($_REQUEST['startIndex']); + } + if (!empty($_REQUEST['endIndex'])) { + $end = intval($_REQUEST['endIndex']); + } + error_log("Processing Channel {$start} to {$end}"); + $list = Encoder::getReverseVideosJsonListFromLink($_REQUEST['videoURL'], Login::getStreamerId()); + $i = $start; + for (; $i <= $end; $i++) { + if (is_object($list[$i]) && empty($list[$i]->id)) { + error_log(($i) . " Not Object " . print_r($list[$i], true)); + continue; + } + error_log(($i) . " Process Video {$list[$i]->id}"); + $url = "https://www.youtube.com/watch?v={$list[$i]->url}"; + $obj = addVideo($url, $streamers_id, $list[$i]->title); + } + error_log("Process Done Total {$i}"); + } else { + if (isFTPURL($_REQUEST['videoURL'])) { + require_once __DIR__ . '/../objects/FTPDownloader.php'; + try { + $downloader = new FTPDownloader($_REQUEST['videoURL']); + $downloader->connect(); + $downloader->queueFiles(); + $downloader->close(); + } catch (Exception $e) { + echo "Error: " . $e->getMessage() . "\n"; + } + } else { + $obj = addVideo($_REQUEST['videoURL'], $streamers_id, @$_REQUEST['videoTitle']); } - error_log(($i) . " Process Video {$list[$i]->id}"); - $url = "https://www.youtube.com/watch?v={$list[$i]->url}"; - $obj = addVideo($url, $streamers_id, $list[$i]->title); } - error_log("Process Done Total {$i}"); - } else { - $obj = addVideo($_REQUEST['videoURL'], $streamers_id, @$_REQUEST['videoTitle']); } } } -if(empty($doNotDie)){ + +if (empty($doNotDie)) { echo (json_encode($obj)); exit; } From 4d1f2ca4f52027ec2f3e1db589878c62c8dfe734 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 29 Jan 2025 22:49:50 -0300 Subject: [PATCH 364/416] Update --- view/queue.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/view/queue.php b/view/queue.php index b86d98d00..6da3472b6 100644 --- a/view/queue.php +++ b/view/queue.php @@ -52,7 +52,9 @@ $e->setTitle($path_parts['filename']); $e->setPriority($s->getPriority()); - if (!empty($_POST['audioOnly']) && $_POST['audioOnly'] !== 'false') { + if (strtolower(pathinfo($_POST['fileURI'], PATHINFO_EXTENSION)) === 'mp3') { + $e->setFormats_idFromOrder(89); //Audio to MP4 + }else if (!empty($_POST['audioOnly']) && $_POST['audioOnly'] !== 'false') { if (!empty($_POST['spectrum']) && $_POST['spectrum'] !== 'false') { $e->setFormats_idFromOrder(70); // video to spectrum [(6)MP4 to MP3] -> [(5)MP3 to spectrum] -> [(2)MP4 to webm] } else { @@ -86,7 +88,7 @@ } else { $e->setStatus(Encoder::STATUS_QUEUE); $id = $e->save(); - + $obj = Encoder::getVideosId($id); } // start queue now From 2d95834a7b687a6359222168eeb9ade8957654f0 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 4 Feb 2025 15:28:24 -0300 Subject: [PATCH 365/416] Update --- objects/Encoder.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/objects/Encoder.php b/objects/Encoder.php index e5d3d7b70..edee7d077 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -799,6 +799,19 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add { global $global; $videoURL = str_replace("'", '', $videoURL); + $videoURL = trim($videoURL); + if(strpos($videoURL, "/") === 0){ + if(!file_exists($videoURL)){ + $videoURL2 = str_replace(' ', '-', $videoURL); + if(file_exists($videoURL2)){ + $videoURL = $videoURL2; + }else{ + _error_log("getYoutubeDl: Local file does not exists $videoURL " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); + return false; + } + } + } + $videoURL = escapeshellarg($videoURL); $tmpfname = _get_temp_file('youtubeDl'); From fdef662d16f5e58215f289ab6adae37d4411eb7c Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 4 Feb 2025 15:34:21 -0300 Subject: [PATCH 366/416] Update --- objects/Encoder.php | 1 + 1 file changed, 1 insertion(+) diff --git a/objects/Encoder.php b/objects/Encoder.php index edee7d077..87ad7f28f 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -805,6 +805,7 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add $videoURL2 = str_replace(' ', '-', $videoURL); if(file_exists($videoURL2)){ $videoURL = $videoURL2; + return _rename($videoURL, $destinationFile) ? $destinationFile : $videoURL; }else{ _error_log("getYoutubeDl: Local file does not exists $videoURL " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); return false; From 7b724447e82ad539d165f9af04a93fcc17891315 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 5 Mar 2025 09:52:13 -0300 Subject: [PATCH 367/416] Make sure it submmit the post vars --- view/index.header.php | 49 +++++++++++++++++++++++++++++++++++- view/js/setTimezoneCookie.js | 18 ------------- 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/view/index.header.php b/view/index.header.php index f62affe16..9b30823ab 100644 --- a/view/index.header.php +++ b/view/index.header.php @@ -59,6 +59,53 @@ function changeLang() { document.getElementById('form_lang').submit(); } + + + + function setTimezoneCookie() { + var timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + var existingTimezone = getCookie('timezone'); + var url = new URL(window.location.href); + var urlTimezone = url.searchParams.get("timezone"); + + if (timezone !== existingTimezone) { + document.cookie = "timezone=" + timezone + ";path=/"; + + // Only reload if the timezone parameter is not in the URL or different + if (timezone !== urlTimezone) { + var getParams = ; // PHP GET parameters + var postParams = ; // PHP POST parameters + + // Convert objects to URL query string + Object.keys(getParams).forEach(key => url.searchParams.set(key, getParams[key])); + url.searchParams.set("timezone", timezone); // Add timezone parameter + + // Create a form to submit POST data + var form = document.createElement("form"); + form.method = "POST"; + form.action = url.toString(); + + for (var key in postParams) { + if (postParams.hasOwnProperty(key)) { + var hiddenField = document.createElement("input"); + hiddenField.type = "hidden"; + hiddenField.name = key; + hiddenField.value = postParams[key]; + form.appendChild(hiddenField); + } + } + + document.body.appendChild(form); + form.submit(); // Auto-submit form to preserve POST data + } + } + } \ No newline at end of file + diff --git a/view/js/setTimezoneCookie.js b/view/js/setTimezoneCookie.js index 87950ad68..64e95d113 100644 --- a/view/js/setTimezoneCookie.js +++ b/view/js/setTimezoneCookie.js @@ -1,21 +1,3 @@ -function setTimezoneCookie() { - var timezone = Intl.DateTimeFormat().resolvedOptions().timeZone; - var existingTimezone = getCookie('timezone'); - var url = new URL(window.location.href); - var urlTimezone = url.searchParams.get("timezone"); - - if (timezone !== existingTimezone) { - document.cookie = "timezone=" + timezone + ";path=/"; - - // Only reload if the timezone parameter is not in the URL or different - if (timezone !== urlTimezone) { - // Add timezone to URL parameters - url.searchParams.set("timezone", timezone); - window.location.href = url.toString(); - } - } -} - function getCookie(name) { var cookieArr = document.cookie.split(";"); for(var i = 0; i < cookieArr.length; i++) { From c621062da3fa605ed748225e131c04470d344c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lud=C4=9Bk?= Date: Wed, 12 Mar 2025 09:51:04 +0100 Subject: [PATCH 368/416] cs locale - incorrect characters and language corrections --- locale/cs.php | 106 +++++++++++++++++++++++++------------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/locale/cs.php b/locale/cs.php index cff079a2f..64d2d4f7e 100644 --- a/locale/cs.php +++ b/locale/cs.php @@ -2,23 +2,23 @@ global $t; $t['Active'] = 'Aktivní'; $t['Add files...'] = 'Přidat soubory...'; -$t['Add on Queue'] = 'Přidåní do fronty'; -$t['Added on queue'] = 'Přidåno do fronty'; +$t['Add on Queue'] = 'Přidat do fronty'; +$t['Added on queue'] = 'Přidáno do fronty'; $t['Admin'] = 'Admin'; $t['Advanced'] = 'Pokročilé'; -$t['All your videos channel will be process, this may take a while to be complete'] = 'Vťechna vaťe videa kanål bude zpracovåvat, to může chvíli trvat, než se dokončí'; -$t['All your videos were imported'] = 'Vťechna vaťe videa byla importovåna'; -$t['Allowed Streamers Sites (One per line. Leave blank for public)'] = 'Povolenå místa pro streamery (Jedno na řådek. Nechte pråzdné pro veřejnost) '; +$t['All your videos channel will be process, this may take a while to be complete'] = 'Všechny vaše kanály budou zpracovávány, to může chvíli trvat'; +$t['All your videos were imported'] = 'Všechna vaše videa byla importována'; +$t['Allowed Streamers Sites (One per line. Leave blank for public)'] = 'Povolená místa pro streamery (Jeden na řádek. Pro veřejné nechte prázdné) '; $t['Are you sure?'] = 'Jste si jistý?'; $t['Auto remove'] = 'Automatické odstranění '; -$t['Basic'] = 'Zåkladní'; -$t['Browse'] = 'Prochåzet'; -$t['Bulk Encode'] = 'Hromadný kód'; -$t['Bulk add your server local files on queue.'] = 'Hromadné přidåní místních souborů serveru do fronty.'; -$t['Cancel upload'] = 'Zruťit'; -$t['Cancel'] = 'Zruťit'; -$t['Category - Use site default'] = 'Kategorie - Použít výchozí strånku'; -$t['Channel Import is disabled'] = 'Import kanålů je zakåzån'; +$t['Basic'] = 'Základní'; +$t['Browse'] = 'Procházet'; +$t['Bulk Encode'] = 'Hromadné enkódování'; +$t['Bulk add your server local files on queue.'] = 'Hromadné přidání, místních souborů na serveru, do fronty.'; +$t['Cancel upload'] = 'Zrušit'; +$t['Cancel'] = 'Zrušit'; +$t['Category - Use site default'] = 'Kategorie - Použít výchozí stránku'; +$t['Channel Import is disabled'] = 'Import kanálů je zakázán'; $t['Code'] = 'Kód'; $t['Configurations'] = 'Konfigurace'; $t['Continue'] = 'Pokračovat'; @@ -33,7 +33,7 @@ $t['Description'] = 'Popis'; $t['Details'] = 'Podrobnosti'; $t['Downloaded'] = 'Staženo'; -$t['Downloading'] = 'Stahovåní'; +$t['Downloading'] = 'Stahování'; $t['Drop Here'] = 'Zde upusťte'; $t['Drop Your Files Here'] = 'Zde můžete vložit své soubory'; $t['Edit'] = 'Upravit'; @@ -41,86 +41,86 @@ $t['Extract Audio'] = 'Výpis zvuku'; $t['Extract WebM Video'] = 'Výpis videa WebM'; $t['For Chrome Browsers'] = 'Pro prohlížeče Chrome'; -$t['From File'] = 'Z dyťku'; +$t['From File'] = 'Ze souboru'; $t['HD'] = 'HD'; $t['Hour'] = 'Hodina'; $t['Hours'] = 'Hodiny'; $t['Import Video'] = 'Import videa'; $t['Inactive'] = 'Neaktivní'; $t['It may take a while to complete'] = 'Dokončení může chvíli trvat'; -$t['Leave Blank for Public'] = 'Ponechte pråzdné místo pro veřejnost'; +$t['Leave Blank for Public'] = 'Pro veřejné nechte prázdné'; $t['List Files'] = 'Soubory seznamu'; $t['Local Path of videos i.e. /media/videos'] = 'Místní cesta k videím, tj. /media/videa'; -$t['Logoff'] = 'Odhlåťení'; -$t['Low'] = 'Low'; -$t['Minutes'] = 'Zåpis'; +$t['Logoff'] = 'Odhlášení'; +$t['Low'] = 'Nízká'; +$t['Minutes'] = 'Minuty'; $t['Month'] = 'Měsíc'; $t['Months'] = 'Měsíce'; $t['Multi Bitrate HLS'] = 'HLS s více datovými toky'; $t['No'] = 'Ne'; $t['Now'] = 'Nyní'; -$t['Override status'] = 'Stav přepsåní'; +$t['Override status'] = 'Stav přepsání'; $t['Password'] = 'Heslo'; $t['Please sign in'] = 'Přihlaste se, prosím'; $t['Please upgrade to enable this feature'] = 'Chcete-li tuto funkci povolit, proveďte prosím aktualizaci'; $t['Priority'] = 'Priorita'; -$t['Processing...'] = 'Zpracovåní...'; +$t['Processing...'] = 'Zpracovávání...'; $t['Queue Log'] = 'Protokol fronty'; $t['Re-Queue'] = 'Opětovné vytvoření fronty'; -$t['Release Date'] = 'Datum vydåní'; -$t['Resolutions'] = 'Usnesení'; +$t['Release Date'] = 'Datum vydání'; +$t['Resolutions'] = 'Rozlišení'; $t['SD'] = 'SD'; $t['Save'] = 'Uložit'; -$t['Search for a video'] = 'Vyhledåní videa'; -$t['Select All'] = 'Vybrat vťe'; +$t['Search for a video'] = 'Vyhledání videa'; +$t['Select All'] = 'Vybrat vše'; $t['Select the update'] = 'Vyberte aktualizaci'; -$t['Send Notify'] = 'Odeslat oznåmení'; +$t['Send Notify'] = 'Odeslat oznámení'; $t['Share videos from YouTube and a few'] = 'Sdílet videa z YouTube a několik '; $t['Share'] = 'Sdílet'; $t['Sharing Queue'] = 'Fronta sdílení'; -$t['Sign in'] = 'Přihlåsit se'; -$t['Sorry!'] = 'Omlouvåme se'; -$t['Start upload'] = 'Start'; +$t['Sign in'] = 'Přihlásit se'; +$t['Sorry!'] = 'Omlouváme se'; +$t['Start upload'] = 'Zahájit nahrávání'; $t['Start'] = 'Start'; $t['Status'] = 'Stav'; -$t['Streamer Site'] = 'Strånky streameru'; +$t['Streamer Site'] = 'Strýnky streamerů'; $t['Streamer info'] = 'Informace o streameru'; $t['Streamers'] = 'Streamery'; -$t['The encode process will be slow'] = 'Proces kódovåní bude pomalý'; -$t['The video will be replaced with this new file, are you sure you want to proceed?'] = 'Video bude nahrazeno tímto novým souborem, jste si jisti, že chcete pokračovat?'; -$t['There is no file on queue'] = 'Ve frontě není žådný soubor'; -$t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'Toto je kanål, jste si jisti, že chcete ståhnout vťechna videa na tomto kanålu?'; -$t['Title'] = 'Titul'; +$t['The encode process will be slow'] = 'Proces kódování bude pomalý'; +$t['The video will be replaced with this new file, are you sure you want to proceed?'] = 'Video bude nahrazeno tímto novým souborem, jste si jisti že chcete pokračovat?'; +$t['There is no file on queue'] = 'Ve frontě není žádný soubor'; +$t['This is a Channel, are you sure you want to download all videos on this channel?'] = 'Toto je kanál, jste si jisti, že chcete stáhnout všechna videa na tomto kanálu?'; +$t['Title'] = 'Titulek'; $t['URL'] = 'Adresa URL'; -$t['Uncheck all to make it public'] = 'Odťkrtněte vťe, aby bylo zveřejněno'; -$t['Unlisted but Searchable'] = 'Nezařazené, ale prohledåvatelné'; +$t['Uncheck all to make it public'] = 'Pro zveřejnění odškrtněte vše'; +$t['Unlisted but Searchable'] = 'Nezařazené, ale vyhledatelné'; $t['Unlisted'] = 'Nezařazené'; $t['Update AVideo System'] = 'Aktualizace systému AVideo'; $t['Update Now'] = 'Aktualizovat nyní'; -$t['Update existing video'] = 'Aktualizace ståvajícího videa'; -$t['Update'] = 'Aktualizace'; +$t['Update existing video'] = 'Aktualizovat stávajícího video'; +$t['Update'] = 'Aktualizovat'; $t['Upload your file'] = 'Nahrajte svůj soubor'; -$t['Use site default'] = 'Použití výchozího webu'; +$t['Use site default'] = 'Použití výchozí'; $t['User Groups'] = 'Skupiny uživatelů'; $t['User'] = 'Uživatel'; $t['Video Id'] = 'Video Id'; -$t['We could not find your streamer site!!'] = 'Nemohli jsme najít vaťe streamovací strånky!!'; +$t['We could not find your streamer site!!'] = 'Nemohli jsme najít vaše streamovací stránky!!'; $t['We detected a total of %s pending updates, if you want to do it now click (Update Now) button'] = 'Zjistili jsme celkem %s čekajících aktualizací, pokud je chcete provést nyní, klikněte na tlačítko (Aktualizovat nyní).'; $t['Will remove queue and the files when the encoder process is done'] = 'Po dokončení procesu enkodéru odstraní frontu a soubory'; $t['Year'] = 'Rok'; $t['Years'] = 'Roky'; $t['Yes'] = 'Ano'; -$t['You are not admin'] = 'Nejste administråtor'; -$t['You are running AVideo Encoder version %s!'] = 'Používåte AVideo Encoder verze %s!'; -$t['You have about %s minutes left of video storage!'] = 'V úložiťti videa zbývå přibližně %s minut!'; -$t['You must be Admin to be able to delete somebody else queue'] = 'Musíte být språvce, abyste mohli odstranit frontu někoho jiného'; -$t['You will overwrite the video ID:'] = 'ID videa přepíťete:'; -$t['Your encode video resolution is set to %s !'] = 'Vaťe rozliťení kódovaného videa je nastaveno na %s !'; -$t['Your maximum file size is:'] = 'Maximålní velikost vaťeho souboru je:'; -$t['Your system is up to date'] = 'Våť systém je aktuålní'; -$t['Your update from file %s is done, click continue'] = 'Vaťe aktualizace ze souboru %s je dokončena, klikněte na tlačítko pokračovat'; -$t['Your user or password is wrong!'] = 'Våť uživatel nebo heslo je ťpatné!'; +$t['You are not admin'] = 'Nejste administrátor'; +$t['You are running AVideo Encoder version %s!'] = 'Používáte AVideo Encoder verze %s!'; +$t['You have about %s minutes left of video storage!'] = 'V úložišťi videa zbývá přibližně %s minut!'; +$t['You must be Admin to be able to delete somebody else queue'] = 'Musíte být správce, abyste mohli odstranit frontu někoho jiného'; +$t['You will overwrite the video ID:'] = 'Přepíšete ID videa:'; +$t['Your encode video resolution is set to %s !'] = 'Vaše rozliťení kódovaného videa je nastaveno na %s !'; +$t['Your maximum file size is:'] = 'Maximální velikost vašeho souboru je:'; +$t['Your system is up to date'] = 'Váť systém je aktuální'; +$t['Your update from file %s is done, click continue'] = 'Vaše aktualizace ze souboru %s je dokončena, klikněte na tlačítko pokračovat'; +$t['Your user or password is wrong!'] = 'Vaše jméno nebo heslo je chybné!'; $t['enter the URL'] = 'zadejte adresu URL'; -$t['formats not found'] = 'formåty nebyly nalezeny'; -$t['more sites'] = 'dalťí strånky'; +$t['formats not found'] = 'formáty nebyly nalezeny'; +$t['more sites'] = 'další stránky'; $t['we allow only'] = 'povolujeme pouze'; From b371f3ab62b8042148976e67b11110ea7a7b2136 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 21 Mar 2025 11:45:54 -0300 Subject: [PATCH 369/416] Add the correct resolution in the manifest better sync in the audio/video --- objects/HLSProcessor.php | 66 +++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/objects/HLSProcessor.php b/objects/HLSProcessor.php index 87e2ee6d5..9af77d5a2 100644 --- a/objects/HLSProcessor.php +++ b/objects/HLSProcessor.php @@ -3,23 +3,23 @@ class HLSProcessor { - static function createMP3AndPM4IfNeed($pathFileName, $destinationFile){ + static function createMP3AndPM4IfNeed($pathFileName, $destinationFile) + { global $global; - + $advancedCustom = getAdvancedCustomizedObjectData(); //_error_log('createMP3AndPM4IfNeed '.json_encode($advancedCustom)); - if($advancedCustom->autoConvertToMp4){ + if ($advancedCustom->autoConvertToMp4) { try { - MP4Processor::createMP4($pathFileName, $destinationFile.'index.mp4'); + MP4Processor::createMP4($pathFileName, $destinationFile . 'index.mp4'); } catch (Exception $e) { _error_log("Error creating MP4: " . $e->getMessage()); } - } - if($advancedCustom->autoConvertVideosToMP3){ + if ($advancedCustom->autoConvertVideosToMP3) { // Usage example try { - MP3Processor::createMP3($pathFileName, $destinationFile.'index.mp3'); + MP3Processor::createMP3($pathFileName, $destinationFile . 'index.mp3'); } catch (Exception $e) { _error_log("Error creating MP3: " . $e->getMessage()); } @@ -82,9 +82,15 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) $audioTsPattern = "{$destinationFile}audio_tracks/{$langDir}/audio_%03d.ts"; // Pattern for audio .ts segments // Correctly map the audio track and add VOD parameters - $audioCommand = get_ffmpeg() . " -i {$pathFileName} -map 0:a:{$track->index} -c:a aac -b:a 128k " . - "-movflags +faststart -f hls -hls_time 6 -hls_playlist_type vod " . - "-hls_segment_filename \"{$audioTsPattern}\" {$audioFile}"; + $audioCommand = get_ffmpeg() . " -i {$pathFileName} " + . " -map 0:a:{$track->index} -c:a aac -b:a 128k " + // Enforce identical segment time + . " -movflags +faststart -f hls -hls_time 6 " + . " -hls_flags independent_segments+split_by_time " + . " -hls_playlist_type vod " + . " -hls_segment_filename \"{$audioTsPattern}\" {$audioFile}"; + + $audioCommand = removeUserAgentIfNotURL($audioCommand); _error_log("HLSProcessor: createHLSWithAudioTracks Executing audio FFmpeg command: {$audioCommand}"); @@ -116,7 +122,9 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) $outputFile = "{$dir}index.m3u8"; // Add resolution playlist entry to the master playlist - $masterPlaylist .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($rate * 1000) . ",RESOLUTION=-2x{$value},AUDIO=\"audio_group\"" . PHP_EOL; + $width = self::getScaledWidth($pathFileName, $value); + $masterPlaylist .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($rate * 1000) . ",RESOLUTION={$width}x{$value},AUDIO=\"audio_group\"" . PHP_EOL; + $masterPlaylist .= "res{$value}/index.m3u8" . PHP_EOL; // Append FFmpeg command for this resolution @@ -139,7 +147,9 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) $outputFile = "{$dir}index.m3u8"; // Add resolution playlist entry to the master playlist - $masterPlaylist .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($rate * 1000) . ",RESOLUTION=-2x{$resolution},AUDIO=\"audio_group\"" . PHP_EOL; + $width = self::getScaledWidth($pathFileName, $resolution); + $masterPlaylist .= "#EXT-X-STREAM-INF:BANDWIDTH=" . ($rate * 1000) . ",RESOLUTION={$width}x{$resolution},AUDIO=\"audio_group\"" . PHP_EOL; + $masterPlaylist .= "res{$resolution}/index.m3u8" . PHP_EOL; // Append FFmpeg command for this resolution @@ -161,13 +171,26 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) // FFmpeg Command Generation for HLS with Audio Tracks for a Specific Resolution private static function getFFmpegCommandForResolution($inputFile, $resolution, $bitrate, $framerate, $audioTracks, $keyInfoFile, $outputFile) { - $command = " -vf scale=-2:{$resolution} -b:v {$bitrate}k -r {$framerate} " . - "-movflags +faststart -hls_time 6 -hls_key_info_file {$keyInfoFile} -hls_playlist_type vod " . - "-map 0:v -c:v h264 -profile:v main -pix_fmt yuv420p -f hls {$outputFile}"; + // Force a keyframe every 6 seconds to match segment boundaries + // Also set hls_flags=independent_segments+split_by_time + $forceKeyFrames = "expr:gte(t,n_forced*6)"; + + $command = " -force_key_frames \"{$forceKeyFrames}\" " + . " -vf scale=-2:{$resolution} -b:v {$bitrate}k -r {$framerate} " + . " -movflags +faststart " + . " -hls_time 6 " + . " -hls_flags independent_segments+split_by_time " + . " -hls_key_info_file {$keyInfoFile} " + . " -hls_playlist_type vod " + . " -map 0:v " + . " -c:v h264 -profile:v main -pix_fmt yuv420p " + . " -f hls {$outputFile}"; return $command; } + + // Function to get video resolution private static function getResolution($pathFileName) { @@ -200,4 +223,17 @@ private static function getAudioTracks($pathFileName) return $tracks; } + + private static function getScaledWidth($pathFileName, $targetHeight) + { + $command = get_ffprobe() . " -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0:s=x {$pathFileName}"; + $output = shell_exec($command); + list($originalWidth, $originalHeight) = explode('x', trim($output)); + + // Calculate proportional width based on the target height + $width = intval(($targetHeight / $originalHeight) * $originalWidth); + + // Round down to the nearest multiple of 2 (required by H.264 codec) + return $width - ($width % 2); + } } From 096a60bf98e55688fd4837838833e62f7fcf43eb Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 26 Mar 2025 14:34:12 -0300 Subject: [PATCH 370/416] fallback to default 16:9 width if FFprobe fails or returns invalid dimensions --- objects/HLSProcessor.php | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/objects/HLSProcessor.php b/objects/HLSProcessor.php index 9af77d5a2..01db958b3 100644 --- a/objects/HLSProcessor.php +++ b/objects/HLSProcessor.php @@ -227,13 +227,28 @@ private static function getAudioTracks($pathFileName) private static function getScaledWidth($pathFileName, $targetHeight) { $command = get_ffprobe() . " -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0:s=x {$pathFileName}"; - $output = shell_exec($command); - list($originalWidth, $originalHeight) = explode('x', trim($output)); + $output = trim(shell_exec($command)); - // Calculate proportional width based on the target height - $width = intval(($targetHeight / $originalHeight) * $originalWidth); + if (empty($output) || strpos($output, 'x') === false) { + _error_log("FFprobe failed to get dimensions: output=[$output], using default 16:9 fallback"); + return self::getDefaultWidth($targetHeight); + } + + list($originalWidth, $originalHeight) = explode('x', $output); + + if (empty($originalWidth) || empty($originalHeight) || $originalHeight == 0) { + _error_log("Invalid dimensions received: width=[$originalWidth], height=[$originalHeight], using default 16:9 fallback"); + return self::getDefaultWidth($targetHeight); + } - // Round down to the nearest multiple of 2 (required by H.264 codec) + $width = intval(($targetHeight / $originalHeight) * $originalWidth); return $width - ($width % 2); } + + private static function getDefaultWidth($targetHeight) + { + // 16:9 ratio → width = height * (16 / 9) + $width = intval($targetHeight * (16 / 9)); + return $width - ($width % 2); // ensure even number + } } From caad67842c3da572176a760e5a7f67f74c405fec Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 26 Mar 2025 14:36:15 -0300 Subject: [PATCH 371/416] Update --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 87ad7f28f..b266bddcb 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -1284,7 +1284,7 @@ public static function run($try = 0) { global $global, $advancedCustom; $maxTries = 4; - $lockFile = sys_get_temp_dir() . '/encoder_run.lock'; + $lockFile = sys_get_temp_dir() . '/encoder_run.'.md5($global['webSiteRootURL']).'.lock'; // Check if the lock file exists if (file_exists($lockFile)) { From 6dcb6d9e90b5940c80549b1aee5be485b7a5bbfa Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 26 Mar 2025 20:04:23 -0300 Subject: [PATCH 372/416] Update --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index b266bddcb..fda505127 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -1295,7 +1295,7 @@ public static function run($try = 0) if (time() - $lockFileTime > 3) { unlink($lockFile); } else { - _error_log("Encoder::run: Lock file exists, exiting to prevent duplicate run."); + _error_log("Encoder::run: Lock file exists, exiting to prevent duplicate run. $lockFile"); return false; } } From 14340c464a48c4ef95e8fd485c64aa32ceee17a5 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 26 Mar 2025 20:05:50 -0300 Subject: [PATCH 373/416] Update --- objects/Encoder.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index fda505127..65df80796 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -1292,10 +1292,11 @@ public static function run($try = 0) $lockFileTime = intval($lockFileContent); // If the lock file is older than 10 seconds, remove it - if (time() - $lockFileTime > 3) { + $timeOlder = time() - $lockFileTime; + if ($timeOlder > 3) { unlink($lockFile); } else { - _error_log("Encoder::run: Lock file exists, exiting to prevent duplicate run. $lockFile"); + _error_log("Encoder::run: Lock file exists, exiting to prevent duplicate run. [$timeOlder seconds Old] $lockFile"); return false; } } From e28e5e64d0e45482c27932b6b8df67ed0c2bb8a1 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 26 Mar 2025 20:34:43 -0300 Subject: [PATCH 374/416] Update --- objects/Encoder.php | 3 +++ view/run.php | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 65df80796..bbbc78774 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2247,6 +2247,9 @@ public static function sendToStreamer($target, $postFields, $return_vars = false if ($errno = curl_errno($curl)) { $error_message = curl_strerror($errno); $obj->msg = "sendToStreamer cURL error ({$errno}): {$error_message} => {$target} "; + if ($errno == 28) { // Timeout + $obj->doNotRetry = true; + } } else { if (is_object($obj->response)) { $obj->error = $obj->response->error; diff --git a/view/run.php b/view/run.php index 42eda0734..71f82ba8c 100644 --- a/view/run.php +++ b/view/run.php @@ -6,4 +6,8 @@ //error_log("Run Executed"); $e = Encoder::run(); $resp = json_encode($e); -echo $resp; \ No newline at end of file +echo $resp; +if (!empty($global['mysqli'])) { + $global['mysqli']->close(); + unset($global['mysqli']); // opcional, para limpar a variável +} From 7ef892cfee5d2ed2aa3c8301b7d05c0640e176ef Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 26 Mar 2025 20:39:35 -0300 Subject: [PATCH 375/416] Update --- objects/Encoder.php | 56 +++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index bbbc78774..263394603 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -549,11 +549,11 @@ public static function getTitleFromLinkWithPytube($video_url) $downloadWithPytubeFilename = 'video_download_' . md5($video_url); $metadataFile = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/metadata.json"; - if(!file_exists($metadataFile)){ + if (!file_exists($metadataFile)) { $response = self::downloadWithPytube($video_url, $downloadWithPytubeFilename, 'metadata'); } - if(file_exists($metadataFile)){ + if (file_exists($metadataFile)) { $content = file_get_contents($metadataFile); $json = json_decode($content); return $json->title; @@ -567,11 +567,11 @@ public static function getDescriptionFromLinkWithPytube($video_url) $downloadWithPytubeFilename = 'video_download_' . md5($video_url); $metadataFile = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/metadata.json"; - if(!file_exists($metadataFile)){ + if (!file_exists($metadataFile)) { $response = self::downloadWithPytube($video_url, $downloadWithPytubeFilename, 'metadata'); } - if(file_exists($metadataFile)){ + if (file_exists($metadataFile)) { $content = file_get_contents($metadataFile); $json = json_decode($content); return $json->description; @@ -585,11 +585,11 @@ public static function getDurationFromLinkWithPytube($video_url) $downloadWithPytubeFilename = 'video_download_' . md5($video_url); $metadataFile = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/metadata.json"; - if(!file_exists($metadataFile)){ + if (!file_exists($metadataFile)) { $response = self::downloadWithPytube($video_url, $downloadWithPytubeFilename, 'metadata'); } - if(file_exists($metadataFile)){ + if (file_exists($metadataFile)) { $content = file_get_contents($metadataFile); $json = json_decode($content); return $json->duration_seconds; @@ -603,11 +603,11 @@ public static function getThumbsFromLinkWithPytube($video_url, $returnFileName = $downloadWithPytubeFilename = 'video_download_' . md5($video_url); $File = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/thumbs.jpg"; - if(!file_exists($File)){ + if (!file_exists($File)) { $response = self::downloadWithPytube($video_url, $downloadWithPytubeFilename, 'thumbnail'); } - if(file_exists($File)){ + if (file_exists($File)) { if ($returnFileName) { return $File; } else { @@ -624,7 +624,7 @@ public static function downloadWithPytube($video_url, $filename, $action = 'vide global $global; $video_url = str_replace(array('\\', "'"), array('', ''), $video_url); $pythonScript = $global['systemRootPath'] . "objects/youtube.py"; - $command = escapeshellcmd("python3 $pythonScript " . escapeshellarg($video_url) . " " . escapeshellarg($filename)." {$action}"); + $command = escapeshellcmd("python3 $pythonScript " . escapeshellarg($video_url) . " " . escapeshellarg($filename) . " {$action}"); _error_log("downloadWithPytube($video_url, $filename) " . $command); exec($command, $output, $return_var); @@ -709,18 +709,18 @@ public static function downloadFile($queue_id) if (!empty($q->getVideoDownloadedLink())) { $videoURL = $q->getVideoDownloadedLink(); - if(isFTPURL($videoURL)){ + if (isFTPURL($videoURL)) { require_once __DIR__ . '/FTPDownloader.php'; FTPDownloader::copy($videoURL, $obj->pathFileName); $obj->error = !file_exists($obj->pathFileName); - }else{ + } else { $downloadWithPytubeFilename = ''; if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($videoURL)) { $downloadWithPytubeFilename = 'video_download_' . $queue_id; $response = self::downloadWithPytube($videoURL, $downloadWithPytubeFilename); } - if(empty($downloadWithPytubeFilename) || $response->error){ + if (empty($downloadWithPytubeFilename) || $response->error) { //begin youtube-dl downloading and symlink it to the video temp file $response = static::getYoutubeDl($videoURL, $queue_id, $obj->pathFileName); if (!empty($response)) { @@ -731,11 +731,10 @@ public static function downloadFile($queue_id) _error_log("downloadFile:getYoutubeDl ERROR queue_id = {$queue_id}"); $obj->error = false; } - }else{ + } else { $obj->pathFileName = "{$global['systemRootPath']}videos/pytube/{$downloadWithPytubeFilename}/video.mp4"; } } - } else { _error_log("downloadFile: not using getYoutubeDl"); //symlink the downloaded file to the video temp file ($obj-pathFileName) @@ -800,13 +799,13 @@ public static function getYoutubeDl($videoURL, $queue_id, $destinationFile, $add global $global; $videoURL = str_replace("'", '', $videoURL); $videoURL = trim($videoURL); - if(strpos($videoURL, "/") === 0){ - if(!file_exists($videoURL)){ + if (strpos($videoURL, "/") === 0) { + if (!file_exists($videoURL)) { $videoURL2 = str_replace(' ', '-', $videoURL); - if(file_exists($videoURL2)){ + if (file_exists($videoURL2)) { $videoURL = $videoURL2; return _rename($videoURL, $destinationFile) ? $destinationFile : $videoURL; - }else{ + } else { _error_log("getYoutubeDl: Local file does not exists $videoURL " . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); return false; } @@ -1284,7 +1283,7 @@ public static function run($try = 0) { global $global, $advancedCustom; $maxTries = 4; - $lockFile = sys_get_temp_dir() . '/encoder_run.'.md5($global['webSiteRootURL']).'.lock'; + $lockFile = sys_get_temp_dir() . '/encoder_run.' . md5($global['webSiteRootURL']) . '.lock'; // Check if the lock file exists if (file_exists($lockFile)) { @@ -1367,7 +1366,14 @@ public static function run($try = 0) $encoder->setStatus(Encoder::STATUS_ENCODING); $encoder->save(); self::run(0); - self::sendImages($objFile->pathFileName, $return_vars, $encoder); + $response = self::sendImages($objFile->pathFileName, $return_vars, $encoder); + if (!empty($response->doNotRetry)) { + $obj->msg = "sendToStreamer timeout. Not retrying"; + _error_log("Encoder::run: Encoder Run: " . json_encode($obj)); + self::setStatusError($encoder->getId(), $obj->msg); + unlink($lockFile); // Remove the lock file before returning + return false; + } $code = new Format($encoder->getFormats_id()); $resp = $code->run($objFile->pathFileName, $encoder->getId()); if (!empty($resp->error)) { @@ -2813,7 +2819,7 @@ public static function getTitleFromLink($link, $streamers_id, $addOauthFromProvi { if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { $resp = self::getTitleFromLinkWithPytube($link); - if(!empty($resp)){ + if (!empty($resp)) { return array('error' => false, 'output' => $resp); } } @@ -2846,7 +2852,7 @@ public static function getDurationFromLink($link, $streamers_id, $addOauthFromPr { if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { $resp = self::getDurationFromLinkWithPytube($link); - if(!empty($resp)){ + if (!empty($resp)) { return static::parseSecondsToDuration($resp); } } @@ -2873,7 +2879,7 @@ public static function getThumbsFromLink($link, $streamers_id, $returnFileName = { if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { $resp = self::getThumbsFromLinkWithPytube($link, $returnFileName); - if(!empty($resp)){ + if (!empty($resp)) { return $resp; } } @@ -2926,7 +2932,7 @@ public static function getDescriptionFromLink($link, $streamers_id, $addOauthFro if (self::isPythonAndPytubeInstalled() && isYouTubeUrl($link)) { $resp = self::getDescriptionFromLinkWithPytube($link); - if(!empty($resp)){ + if (!empty($resp)) { return $resp; } } @@ -2971,7 +2977,7 @@ public static function getYouTubeDLCommand($addOauthFromProvider = '', $streamer { global $global; $cacheDir = '/var/www/.cache/'; - if(!is_dir($cacheDir)){ + if (!is_dir($cacheDir)) { @mkdir($cacheDir); } From 209a4923ec46b9567dcb96d1676025e3f2a7967c Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 26 Mar 2025 20:51:56 -0300 Subject: [PATCH 376/416] Update --- objects/Encoder.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 263394603..ee141cef5 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -330,10 +330,10 @@ public function setFilename($filename) $this->filename = $filename; } - public function setStatus($status) + public function setStatus($status, $setStreamerLog = true) { _error_log("Encoder::setStatus($status) " . json_encode(debug_backtrace())); - if (!empty($this->id) && $status != $this->status) { + if ($setStreamerLog && !empty($this->id) && $status != $this->status) { self::setStreamerLog($this->id, "Status changed from {$this->status} to $status", Encoder::LOG_TYPE_StatusChanged); } $this->status = $status; @@ -3017,7 +3017,15 @@ public static function setStreamerLog($encoder_queue_id, $msg, $type) 'type' => $type, 'videos_id' => $return_vars->videos_id, ); - return self::sendToStreamer($target, $postFields, $return_vars, $encoder); + $response = self::sendToStreamer($target, $postFields, $return_vars, $encoder); + if (!empty($response->doNotRetry)) { + _error_log("sendToStreamer timeout. Not retrying."); + $q = new Encoder($encoder_queue_id); + $q->setStatus(Encoder::STATUS_ERROR); + $q->setStatus_obs("sendToStreamer timeout. Not retrying."); + $q->save(); + } + return $response; } public static function getVideosId($encoder_queue_id) From eabd3d6c6bcd331bc1a413abdad07fe988958cd9 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 3 Apr 2025 15:30:06 -0300 Subject: [PATCH 377/416] Update --- objects/Encoder.php | 3 +++ package-lock.json | 24 +----------------------- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index ee141cef5..1fab6be92 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2239,6 +2239,9 @@ public static function sendToStreamer($target, $postFields, $return_vars = false } curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30); + curl_setopt($curl, CURLOPT_TIMEOUT, 30); + if (empty($curl)) { $obj->msg = "sendToStreamer cURL is empty "; return $obj; diff --git a/package-lock.json b/package-lock.json index 0aacc6eba..aa96db12b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,28 +1,6 @@ { - "name": "encoder", - "lockfileVersion": 2, "requires": true, - "packages": { - "": { - "dependencies": { - "bootstrap": "^3.4.1", - "jquery": "^3.6.0" - } - }, - "node_modules/bootstrap": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" - } - }, + "lockfileVersion": 1, "dependencies": { "bootstrap": { "version": "3.4.1", From 00e55931f45a6db2196fab6327e8595ceb1341c6 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 3 Apr 2025 15:32:00 -0300 Subject: [PATCH 378/416] Update --- objects/Encoder.php | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 1fab6be92..7ca8f508e 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2239,8 +2239,8 @@ public static function sendToStreamer($target, $postFields, $return_vars = false } curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 30); - curl_setopt($curl, CURLOPT_TIMEOUT, 30); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($curl, CURLOPT_TIMEOUT, 5); if (empty($curl)) { $obj->msg = "sendToStreamer cURL is empty "; @@ -2695,40 +2695,61 @@ public static function getWebpImage($pathFileName, $seconds = 5, $howLong = 3) public function delete() { global $global; + + _error_log("delete() called for ID={$this->id}"); + if (empty($this->id)) { + _error_log("delete() aborted: empty ID"); return false; } - $files = glob("{$global['systemRootPath']}videos/{$this->id}_tmpFile*"); // get all file names - foreach ($files as $file) { // iterate files + + _error_log("delete() deleting tmp files 1..."); + $files = glob("{$global['systemRootPath']}videos/{$this->id}_tmpFile*"); + foreach ($files as $file) { if (is_file($file)) { + _error_log("delete() unlinking file: {$file}"); unlink($file); - } // delete file - else { + } else { + _error_log("delete() removing directory: {$file}"); rrmdir($file); } } - $files = glob("{$global['systemRootPath']}videos/avideoTmpFile_{$this->id}*"); // get all file names - foreach ($files as $file) { // iterate files + + _error_log("delete() deleting tmp files 2..."); + $files = glob("{$global['systemRootPath']}videos/avideoTmpFile_{$this->id}*"); + foreach ($files as $file) { if (is_file($file)) { + _error_log("delete() unlinking avideoTmpFile: {$file}"); @unlink($file); - } // delete file - else { + } else { + _error_log("delete() removing avideoTmpFile dir: {$file}"); @rrmdir($file); } } - $files = glob("{$global['systemRootPath']}videos/pytube/video_download_{$this->id}"); // get all file names - foreach ($files as $file) { // iterate files + + _error_log("delete() deleting pytube downloads..."); + $files = glob("{$global['systemRootPath']}videos/pytube/video_download_{$this->id}"); + foreach ($files as $file) { + _error_log("delete() removing pytube download dir: {$file}"); @rrmdir($file); } + + _error_log("delete() calling deleteOriginal()..."); $this->deleteOriginal(); if (!empty($global['progressiveUpload'])) { + _error_log("delete() progressiveUpload enabled, deleting file via Upload::deleteFile()"); Upload::deleteFile($this->id); } + + _error_log("delete() setting streamer log..."); self::setStreamerLog($this->id, 'Files Deleted', Encoder::LOG_TYPE_INFO); + + _error_log("delete() calling parent::delete()"); return parent::delete(); } + private function deleteOriginal() { global $global; From d534557a4dbc0242a957d86de02e8664a59695ff Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 3 Apr 2025 15:32:54 -0300 Subject: [PATCH 379/416] Update --- objects/functions.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/objects/functions.php b/objects/functions.php index d22686667..0f269a19d 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -1429,6 +1429,9 @@ function _error_log($message) // Append the log entry at the bottom of the file file_put_contents($global['systemRootPath'] . 'videos/aVideoEncoder.log', $str . PHP_EOL, FILE_APPEND); } + if(isCommandLineInterface()){ + echo $str.PHP_EOL; + } error_log($str); } From bd7ba6e34590b447bf3409198cbb9e0c626c9712 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 3 Apr 2025 15:36:19 -0300 Subject: [PATCH 380/416] Update --- objects/Encoder.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 7ca8f508e..a253c844f 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -3041,13 +3041,14 @@ public static function setStreamerLog($encoder_queue_id, $msg, $type) 'type' => $type, 'videos_id' => $return_vars->videos_id, ); - $response = self::sendToStreamer($target, $postFields, $return_vars, $encoder); if (!empty($response->doNotRetry)) { _error_log("sendToStreamer timeout. Not retrying."); $q = new Encoder($encoder_queue_id); $q->setStatus(Encoder::STATUS_ERROR); $q->setStatus_obs("sendToStreamer timeout. Not retrying."); $q->save(); + }else{ + $response = self::sendToStreamer($target, $postFields, $return_vars, $encoder); } return $response; } From 1d0d6542738907c6433b6bcfc1e1de13932b804a Mon Sep 17 00:00:00 2001 From: Aliaksandr Kazelka Date: Tue, 29 Apr 2025 22:49:16 +0200 Subject: [PATCH 381/416] Remove usages of deprecated function --- view/listFiles.json.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/listFiles.json.php b/view/listFiles.json.php index 4a152fc89..c37ac70b7 100644 --- a/view/listFiles.json.php +++ b/view/listFiles.json.php @@ -65,8 +65,8 @@ $obj = new stdClass(); $obj->id = $id++; - $obj->path = utf8_encode($value); - $obj->name = utf8_encode($path_parts['basename']); + $obj->path = mb_convert_encoding($value, 'UTF-8'); + $obj->name = mb_convert_encoding($path_parts['basename'], 'UTF-8'); $files[] = $obj; } } else { From d0f7f3f4ea14608d71922d9e33072992f5affdf2 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kazelka Date: Wed, 30 Apr 2025 22:52:08 +0200 Subject: [PATCH 382/416] Improve working with files containing special symbols --- objects/Encoder.php | 7 +++---- objects/Object.php | 8 ++++---- view/index.php | 7 ++++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index a253c844f..d12b4a87d 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -194,8 +194,7 @@ public function save() * @var object $global['mysqli'] */ $this->worker_pid = intval($this->worker_pid); - $this->setTitle($global['mysqli']->real_escape_string(str_replace('\\\\', '', stripslashes($this->getTitle())))); - $this->setStatus_obs($global['mysqli']->real_escape_string(str_replace('\\\\', '', stripslashes($this->getStatus_obs())))); + _error_log("Encoder::save id=(" . $this->getId() . ") title=(" . $this->getTitle() . ") streamers_id={$this->streamers_id} "); return parent::save(); } @@ -1092,7 +1091,7 @@ public static function getAllQueue() public static function getFromFilename($filename) { global $global; - $sql = "SELECT * FROM " . static::getTableName() . " WHERE filename = '$filename' LIMIT 1 "; + $sql = "SELECT * FROM " . static::getTableName() . " WHERE filename = '" . $global['mysqli']->real_escape_string($filename) . "' LIMIT 1 "; /** * @var array $global @@ -1110,7 +1109,7 @@ public static function getFromFilename($filename) public static function getFromFileURI($fileURI) { global $global; - $sql = "SELECT * FROM " . static::getTableName() . " WHERE fileURI = '$fileURI' LIMIT 1 "; + $sql = "SELECT * FROM " . static::getTableName() . " WHERE fileURI = '" . $global['mysqli']->real_escape_string($fileURI) . "' LIMIT 1 "; /** * @var array $global diff --git a/objects/Object.php b/objects/Object.php index 2b859903b..b80fbc4cd 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -149,8 +149,8 @@ public function save() { } elseif (strtolower($value) == 'modified') { $fields[] = " {$value} = now() "; } else { - $this->$value = str_replace("'", '', $this->$value); - $fields[] = " `{$value}` = '{$this->$value}' "; + $escapedValue = $global['mysqli']->real_escape_string($this->$value); + $fields[] = " `{$value}` = '{$escapedValue}' "; } } $sql .= implode(", ", $fields); @@ -175,8 +175,8 @@ public function save() { $fields[] = " {$id} "; } }else{ - $this->$value = str_replace(array("'", '\\'), array('', ''), $this->$value); - $fields[] = " '{$this->$value}' "; + $escapedValue = $global['mysqli']->real_escape_string($this->$value); + $fields[] = " '{$escapedValue}' "; } } } diff --git a/view/index.php b/view/index.php index a8614699b..52463a4c7 100644 --- a/view/index.php +++ b/view/index.php @@ -402,7 +402,12 @@ function checkFiles() { for (i = 0; i < response.length; i++) { if (!response[i]) continue; - $('#files').append('
  • ' + response[i].name + '
  • '); + + $('
  • ') + .appendTo('#files') + .attr('id', 'li' + i) + .attr('path', response[i].path) + .append(response[i].name); } } } From 65414b22049808044cd2cf9a5bfbea1ee2de7c34 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kazelka Date: Thu, 1 May 2025 17:43:43 +0200 Subject: [PATCH 383/416] Fix issue with bulk encoding of a large number of files --- view/queue.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/view/queue.php b/view/queue.php index 6da3472b6..6425d6315 100644 --- a/view/queue.php +++ b/view/queue.php @@ -4,6 +4,8 @@ require_once '../objects/Encoder.php'; require_once '../objects/Login.php'; +session_write_close(); + if (empty($_POST['fileURI'])) { die("File URI Not found"); } From 4fc2cca94d16153132186b4176b68aee3b20dd6e Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 6 May 2025 18:56:55 -0300 Subject: [PATCH 384/416] Ensure setTimezoneCookie is called only if the function is defined --- view/js/setTimezoneCookie.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/view/js/setTimezoneCookie.js b/view/js/setTimezoneCookie.js index 64e95d113..b0213d8e1 100644 --- a/view/js/setTimezoneCookie.js +++ b/view/js/setTimezoneCookie.js @@ -10,4 +10,6 @@ function getCookie(name) { } // Call this function on page load -setTimezoneCookie(); +if(typeof setTimezoneCookie == 'function'){ + setTimezoneCookie(); +} From 671919f60adee290fb8595562c96addcec8fabfe Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 6 May 2025 21:01:23 -0300 Subject: [PATCH 385/416] Add debug logging for file upload process and clean up whitespace --- view/jquery-file-upload/server/php/UploadHandler.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/view/jquery-file-upload/server/php/UploadHandler.php b/view/jquery-file-upload/server/php/UploadHandler.php index 3a6fd3a19..1314bb259 100644 --- a/view/jquery-file-upload/server/php/UploadHandler.php +++ b/view/jquery-file-upload/server/php/UploadHandler.php @@ -1149,9 +1149,11 @@ protected function handle_file_upload($uploaded_file, $name, $size, $type, $erro $file_path = $this->get_upload_path($file->name); $append_file = $content_range && is_file($file_path) && $file->size > $this->get_file_size($file_path); + error_log("DEBUG: Trying to move file to {$file_path}"); if ($uploaded_file && is_uploaded_file($uploaded_file)) { // multipart/formdata uploads (POST method uploads) if ($append_file) { + error_log("DEBUG: Appending to file"); file_put_contents( $file_path, fopen($uploaded_file, 'r'), @@ -1343,7 +1345,7 @@ public function generate_response($content, $print_response = true) { if(!empty($post)){ $redirect = stripslashes($post); } - + if ($redirect && preg_match($this->options['redirect_allow_target'], $redirect)) { return $this->header('Location: '.sprintf($redirect, rawurlencode($json))); } From eea4b6bbffac68c3bc52668abbdc61e55e805e5b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 6 May 2025 21:17:36 -0300 Subject: [PATCH 386/416] Remove debug logging for file movement and appending in UploadHandler --- view/jquery-file-upload/server/php/UploadHandler.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/view/jquery-file-upload/server/php/UploadHandler.php b/view/jquery-file-upload/server/php/UploadHandler.php index 1314bb259..dc1531e80 100644 --- a/view/jquery-file-upload/server/php/UploadHandler.php +++ b/view/jquery-file-upload/server/php/UploadHandler.php @@ -1149,11 +1149,9 @@ protected function handle_file_upload($uploaded_file, $name, $size, $type, $erro $file_path = $this->get_upload_path($file->name); $append_file = $content_range && is_file($file_path) && $file->size > $this->get_file_size($file_path); - error_log("DEBUG: Trying to move file to {$file_path}"); if ($uploaded_file && is_uploaded_file($uploaded_file)) { // multipart/formdata uploads (POST method uploads) if ($append_file) { - error_log("DEBUG: Appending to file"); file_put_contents( $file_path, fopen($uploaded_file, 'r'), From 9631d1d43fef648019bc3846f244bf1ba9ecedf0 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 9 May 2025 21:22:13 -0300 Subject: [PATCH 387/416] https://github.com/WWBN/AVideo/issues/10013#issuecomment-2864850618 --- view/jquery-file-upload/js/main.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/view/jquery-file-upload/js/main.js b/view/jquery-file-upload/js/main.js index 210ed9e8d..0f94f73f5 100644 --- a/view/jquery-file-upload/js/main.js +++ b/view/jquery-file-upload/js/main.js @@ -19,6 +19,8 @@ $(function () { //xhrFields: {withCredentials: true}, url: 'view/jquery-file-upload/server/php/?PHPSESSID=' + PHPSESSID, maxChunkSize: 5000000, // 5 MB + maxNumberOfFiles: 5, + acceptFileTypes: /(\.|\/)(mp4|m3u8|webm|ogg|ogv|mp3|wav|aac|flac)$/i, add: function (e, data) { selectedFileName = data.files[0].name; var videos_id = $('#update_video_id').val(); @@ -118,7 +120,7 @@ $(function () { }else{ $('#videos_id').val(0); } - + data.submit(); } else { data.formData = { @@ -238,4 +240,4 @@ function editVideos(videos_id) { url += '&pass=' + $('#pass').val(); url += '&playlists_id=' + playlists_id; avideoModalIframe(url); -} \ No newline at end of file +} From 2a11f9b7fc48d8434bd7053855a4818879aa26e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lud=C4=9Bk?= Date: Wed, 28 May 2025 09:51:11 +0200 Subject: [PATCH 388/416] Small cs localization corrections --- locale/cs.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/cs.php b/locale/cs.php index 64d2d4f7e..f1c51f821 100644 --- a/locale/cs.php +++ b/locale/cs.php @@ -8,9 +8,9 @@ $t['Advanced'] = 'Pokročilé'; $t['All your videos channel will be process, this may take a while to be complete'] = 'Všechny vaše kanály budou zpracovávány, to může chvíli trvat'; $t['All your videos were imported'] = 'Všechna vaše videa byla importována'; -$t['Allowed Streamers Sites (One per line. Leave blank for public)'] = 'Povolená místa pro streamery (Jeden na řádek. Pro veřejné nechte prázdné) '; +$t['Allowed Streamers Sites (One per line. Leave blank for public)'] = 'Povolené stránky streamerů (Jeden na řádek. Pro veřejné nechte prázdné) '; $t['Are you sure?'] = 'Jste si jistý?'; -$t['Auto remove'] = 'Automatické odstranění '; +$t['Auto remove'] = 'Automaticky odstranit'; $t['Basic'] = 'Základní'; $t['Browse'] = 'Procházet'; $t['Bulk Encode'] = 'Hromadné enkódování'; @@ -83,7 +83,7 @@ $t['Start upload'] = 'Zahájit nahrávání'; $t['Start'] = 'Start'; $t['Status'] = 'Stav'; -$t['Streamer Site'] = 'Strýnky streamerů'; +$t['Streamer Site'] = 'Stránka streameru'; $t['Streamer info'] = 'Informace o streameru'; $t['Streamers'] = 'Streamery'; $t['The encode process will be slow'] = 'Proces kódování bude pomalý'; From e13d70e94dd0e442f776e0555a5e5dec91fdc845 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Sat, 31 May 2025 15:07:06 -0300 Subject: [PATCH 389/416] Add imagemagick to Dockerfile dependencies --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index cff4ade86..5716c46f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -71,6 +71,7 @@ RUN apt-get install -y --no-install-recommends \ mysqli \ opcache \ pdo_mysql \ + imagemagick \ zip && \ rm -rf \ /tmp/* \ From 15f24124ece8deed8b2b4634bc6c40144a9054b6 Mon Sep 17 00:00:00 2001 From: Caleb Mazalevskis Date: Wed, 4 Jun 2025 16:55:19 +0800 Subject: [PATCH 390/416] Fix typos. --- objects/Encoder.php | 23 ++++++++++++----------- objects/Format.php | 2 +- objects/functions.php | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index d12b4a87d..c58b99ad0 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2608,29 +2608,29 @@ public static function getGifImage($pathFileName, $seconds = 5, $howLong = 3) /** * @var string $ffmpeg */ - $palleteFile = "{$pathFileName}palette.png"; + $paletteFile = "{$pathFileName}palette.png"; $pathFileNameE = escapeshellarg($pathFileName); - $palleteFileE = escapeshellarg($palleteFile); + $paletteFileE = escapeshellarg($paletteFile); $destinationFileE = escapeshellarg($destinationFile); - eval('$ffmpeg =get_ffmpeg(true)." -y -ss {$duration} -t {$howLong} -i {$pathFileNameE} -vf fps=10,scale=320:-1:flags=lanczos,palettegen {$palleteFileE}";'); + eval('$ffmpeg =get_ffmpeg(true)." -y -ss {$duration} -t {$howLong} -i {$pathFileNameE} -vf fps=10,scale=320:-1:flags=lanczos,palettegen {$paletteFileE}";'); $ffmpeg = removeUserAgentIfNotURL($ffmpeg); exec($ffmpeg . " 2>&1", $output, $return_val); $time_end = microtime(true); $execution_time = ($time_end - $time_start); _error_log("getGif: takes {$execution_time} sec to complete"); - if ($return_val !== 0 && !file_exists($palleteFile)) { - _error_log("Create Pallete Gif Image error: {$ffmpeg} " . json_encode($output)); + if ($return_val !== 0 && !file_exists($paletteFile)) { + _error_log("Create palette Gif image error: {$ffmpeg} " . json_encode($output)); return $global['systemRootPath'] . "view/img/notfound.gif"; } else { // I've discovered that if the ss parameter comes before the input flag, a tremendous time penalty is avoided. // Also I've developed this ffmpeg line to allow unusual aspect videos to be letter boxed - // so that they don't get rendered incorrectly on the avideo site. https://superuser.com/a/891478 + // so that they don't get rendered incorrectly on the AVideo site. https://superuser.com/a/891478 - eval('$ffmpeg =get_ffmpeg()." -ss {$duration} -t {$howLong} -i {$pathFileNameE} -i {$palleteFileE} -filter_complex \"fps=10,scale=(iw*sar)*min(320/(iw*sar)\,180/ih):ih*min(320/(iw*sar)\,180/ih):flags=lanczos[x];[x][1:v]paletteuse, pad=320:180:(320-iw*min(320/iw\,180/ih))/2:(180-ih*min(320/iw\,180/ih))/2\" {$destinationFileE}";'); + eval('$ffmpeg =get_ffmpeg()." -ss {$duration} -t {$howLong} -i {$pathFileNameE} -i {$paletteFileE} -filter_complex \"fps=10,scale=(iw*sar)*min(320/(iw*sar)\,180/ih):ih*min(320/(iw*sar)\,180/ih):flags=lanczos[x];[x][1:v]paletteuse, pad=320:180:(320-iw*min(320/iw\,180/ih))/2:(180-ih*min(320/iw\,180/ih))/2\" {$destinationFileE}";'); $ffmpeg = removeUserAgentIfNotURL($ffmpeg); exec($ffmpeg . " 2>&1", $output, $return_val); if ($return_val !== 0 && !file_exists($destinationFile)) { - _error_log("Create Gif Image error 1: {$ffmpeg} " . json_encode($output)); + _error_log("Create Gif image error 1: {$ffmpeg} " . json_encode($output)); eval('$ffmpeg =get_ffmpeg()." -ss {$duration} -t {$howLong} -i {$pathFileNameE} -i {$pathFileNameE}palette.png -filter_complex \"fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse\" {$destinationFileE}";'); $ffmpeg = removeUserAgentIfNotURL($ffmpeg); exec($ffmpeg . " 2>&1", $output, $return_val); @@ -2654,7 +2654,7 @@ public static function getWebpImage($pathFileName, $seconds = 5, $howLong = 3) return false; } if (!file_exists($pathFileName)) { - _error_log("getWebpImage: error file not exists " . $pathFileName); + _error_log("getWebpImage: error file does not exist " . $pathFileName); return false; } global $global; @@ -2758,8 +2758,9 @@ private function deleteOriginal() $files = glob("{$global['systemRootPath']}videos/original_" . $this->getFilename() . "*"); // get all file names foreach ($files as $file) { // iterate files if (is_file($file)) { + // delete file unlink($file); - } // delete file + } } return true; } @@ -2815,7 +2816,7 @@ public static function parseSecondsToDuration($int) /** * * @param string $link channel link - * @return Array {"url": "DeHSfLqwqxg", "_type": "url", "ie_key": "Youtube", "id": "DeHSfLqwqxg", "title": "COMMERCIALS IN REAL LIFE"} + * @return array {"url": "DeHSfLqwqxg", "_type": "url", "ie_key": "Youtube", "id": "DeHSfLqwqxg", "title": "COMMERCIALS IN REAL LIFE"} */ public static function getReverseVideosJsonListFromLink($link, $streamers_id, $addOauthFromProvider = '') { diff --git a/objects/Format.php b/objects/Format.php index 0ce621c8a..d994099de 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -729,7 +729,7 @@ private static function preProcessDynamicHLS($pathFileName, $destinationFile) _error_log("Encoder:Format:: preProcessDynamicHLS($pathFileName, $destinationFile) [resolutions=" . json_encode($resolutions) . "] [height={$height}] [$destinationFile=$destinationFile]"); // create a directory mkdir($destinationFile); - // create a encryption key + // create an encryption key $key = openssl_random_pseudo_bytes(16); $keyFileName = "enc_" . uniqid() . ".key"; file_put_contents($destinationFile . $keyFileName, $key); diff --git a/objects/functions.php b/objects/functions.php index 0f269a19d..c8a051311 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -675,7 +675,7 @@ function ip_is_private($ip) '10.0.0.0|10.255.255.255', // single class A network '172.16.0.0|172.31.255.255', // 16 contiguous class B network '192.168.0.0|192.168.255.255', // 256 contiguous class C network - '169.254.0.0|169.254.255.255', // Link-local address also refered to as Automatic Private IP Addressing + '169.254.0.0|169.254.255.255', // Link-local address also referred to as Automatic Private IP Addressing '127.0.0.0|127.255.255.255' // localhost ); From 41024bc0b9edf057789123148dd75d2ab8ea96fe Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Tue, 10 Jun 2025 09:00:50 -0300 Subject: [PATCH 391/416] https://github.com/WWBN/AVideo/issues/10049#issuecomment-2958709803 --- node_modules/.package-lock.json | 2 +- objects/Encoder.php | 22 ++++++++++++++++++++-- objects/functions.php | 1 + package-lock.json | 20 +++++++++++++++----- 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 8f6e05a4d..2e98ab77d 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -1,6 +1,6 @@ { "name": "encoder", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "node_modules/bootstrap": { diff --git a/objects/Encoder.php b/objects/Encoder.php index c58b99ad0..9f70556d5 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2180,7 +2180,25 @@ public static function sendToStreamer($target, $postFields, $return_vars = false { //var_dump("sendToStreamer($target, $postFields, $return_vars = false, $encoder = null)" . json_encode(debug_backtrace()));exit; $time_start = microtime(true); - _error_log("sendToStreamer to {$target} "); + if (!empty($encoder)) { + // if is the spectrum (mp3 to hls) only send the mp4 if it is set to convert to mp4 + if ($encoder->getFormats_id() == 33 && isset($postFields['format']) && $postFields['format'] == 'mp4') { + $advancedCustom = getAdvancedCustomizedObjectData(); + if (!$advancedCustom->autoConvertToMp4) { + _error_log("sendToStreamer it is the spectrum (mp3 to hls) and autoConvertToMp4 is false, returning empty object"); + _error_log(json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); + $obj = new stdClass(); + $obj->error = false; + return $obj; + }else{ + _error_log("sendToStreamer it is the spectrum (mp3 to hls) mp4 file will be sent"); + } + } + $f = new Format($encoder->getFormats_id()); + _error_log("sendToStreamer Format selected for encoding: " . $f->getName() . " (ID: " . $encoder->getFormats_id() . ") FormatToSend=" . (isset($postFields['format']) ? $postFields['format'] : 'not set')); + } else { + _error_log("sendToStreamer to {$target} FormatToSend=" . (isset($postFields['format']) ? $postFields['format'] : 'not set')); + } $removeAfterSend = array('spectrumimage', 'rawVideo', 'image', 'gifimage', 'webpimage', 'video'); if (!empty($encoder)) { if (empty($return_vars)) { @@ -3047,7 +3065,7 @@ public static function setStreamerLog($encoder_queue_id, $msg, $type) $q->setStatus(Encoder::STATUS_ERROR); $q->setStatus_obs("sendToStreamer timeout. Not retrying."); $q->save(); - }else{ + } else { $response = self::sendToStreamer($target, $postFields, $return_vars, $encoder); } return $response; diff --git a/objects/functions.php b/objects/functions.php index c8a051311..79ffb9da3 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -45,6 +45,7 @@ function getFFmpegScaleToForceOriginalAspectRatio($width, $height) function replaceFFMPEG($cmd) { $cmd = removeUserAgentIfNotURL($cmd); + $cmd = str_replace("\\'", "'", $cmd); if (preg_match('/-user_agent/', $cmd)) { return $cmd; } diff --git a/package-lock.json b/package-lock.json index aa96db12b..9600d2f40 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,23 @@ { + "name": "encoder", + "lockfileVersion": 3, "requires": true, - "lockfileVersion": 1, - "dependencies": { - "bootstrap": { + "packages": { + "": { + "dependencies": { + "bootstrap": "^3.4.1", + "jquery": "^3.6.0" + } + }, + "node_modules/bootstrap": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "engines": { + "node": ">=6" + } }, - "jquery": { + "node_modules/jquery": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" From ad48f208e3bab2380016a59eb545347641a60334 Mon Sep 17 00:00:00 2001 From: Caleb Mazalevskis Date: Wed, 11 Jun 2025 11:59:23 +0800 Subject: [PATCH 392/416] Workflows patch. --- .github/workflows/docker-image.yml | 6 +++--- .github/workflows/validate.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index db6eae446..45de27445 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -18,20 +18,20 @@ jobs: steps: - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v3.6.2 + uses: docker/metadata-action@v5 with: images: ${{ secrets.DOCKERHUB_IMAGE }} - name: Build and push id: docker_build - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index a4d91e149..4dacc19b6 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -16,7 +16,7 @@ jobs: name: PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }} steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up PHP uses: shivammathur/setup-php@v2 From 9c6223478215eba209940a23af47d676d18bfcbf Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 11 Jun 2025 17:48:55 -0300 Subject: [PATCH 393/416] Add URL to error message in Encoder class for better debugging --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 9f70556d5..66afbd359 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2265,7 +2265,7 @@ public static function sendToStreamer($target, $postFields, $return_vars = false } $obj->response_raw = curl_exec($curl); } catch (\Throwable $th) { - $obj->msg = $th->getMessage(); + $obj->msg = $th->getMessage().' URL='.$url; return $obj; } $obj->response = json_decode($obj->response_raw); From cb3c94dd7a7a54c4e5d6b0fa07c77f8b80aca715 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 11 Jun 2025 17:51:26 -0300 Subject: [PATCH 394/416] Add URL to cURL error message in Encoder class for better debugging --- objects/Encoder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 66afbd359..ca447532c 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2272,7 +2272,7 @@ public static function sendToStreamer($target, $postFields, $return_vars = false if ($errno = curl_errno($curl)) { $error_message = curl_strerror($errno); - $obj->msg = "sendToStreamer cURL error ({$errno}): {$error_message} => {$target} "; + $obj->msg = "sendToStreamer cURL error ({$errno}): {$error_message} => {$target} URL=>{$url}"; if ($errno == 28) { // Timeout $obj->doNotRetry = true; } From f762239a646ff52eea5d6c6e65499a5b546e1861 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 11 Jun 2025 18:11:02 -0300 Subject: [PATCH 395/416] Increase cURL timeout settings for improved reliability in Encoder class --- objects/Encoder.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index ca447532c..006609496 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -2254,10 +2254,11 @@ public static function sendToStreamer($target, $postFields, $return_vars = false } catch (\Throwable $th) { _error_log("sendToStreamer($target, " . json_encode($postFields)); } + $timeout = 10; curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); - curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); - curl_setopt($curl, CURLOPT_TIMEOUT, 5); + curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout); + curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); if (empty($curl)) { $obj->msg = "sendToStreamer cURL is empty "; From c8eadf78349ce30b89b370050734a1c4702cfc62 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 16 Jun 2025 14:58:38 -0300 Subject: [PATCH 396/416] Enhance logging and status observation in Encoder class; update status message format in index view --- objects/Encoder.php | 18 +++++++++++++----- view/index.php | 42 ++++++++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 006609496..0f2b2120f 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -195,7 +195,7 @@ public function save() */ $this->worker_pid = intval($this->worker_pid); - _error_log("Encoder::save id=(" . $this->getId() . ") title=(" . $this->getTitle() . ") streamers_id={$this->streamers_id} "); + _error_log("Encoder::save id=(" . $this->getId() . ") title=(" . $this->getTitle() . ") streamers_id={$this->streamers_id} status_obs={$this->status_obs} "); return parent::save(); } @@ -357,12 +357,13 @@ public function setStatus($status, $setStreamerLog = true) public function setStatus_obs($status_obs) { - if (empty($status_ob)) { + if (empty($status_obs)) { return false; } _error_log("Encoder::setStatus_obs " . json_encode(debug_backtrace())); $old_status_obs = $this->status_obs; $this->status_obs = substr($status_obs, 0, 200); + if (!empty($this->id) && $old_status_obs !== $this->status_obs) { self::setStreamerLog($this->id, $this->status_obs, Encoder::LOG_TYPE_StatusObs); } @@ -1330,7 +1331,7 @@ public static function run($try = 0) $encoder = new Encoder($encoder->getId()); $return_vars = json_decode($encoder->getReturn_vars()); } - $encoder->setStatus_obs("Start in " . date("Y-m-d H:i:s")); + $encoder->setStatus_obs("Started at " . date("Y-m-d H:i:s")); $encoder->save(); $objFile = static::downloadFile($encoder->getId()); if ($objFile->error && !self::canEncodeNow() && !self::canDownloadNow()) { @@ -1853,14 +1854,21 @@ public static function sendFile($file, $return_vars, $format, Encoder $encoder = self::setStreamerLog($encoder->getId(), __FUNCTION__, Encoder::LOG_TYPE_INFO); $obj = self::sendToStreamer($target, $postFields, $return_vars, $encoder); $obj->videoFileSize = humanFileSize(filesize($file)); - //_error_log("AVideo-Streamer sendFile sendToStreamer done: " . json_encode($obj) ); + _error_log("AVideo-Streamer sendFile sendToStreamer done: " . json_encode($obj) ); $obj->file = $file; if (isset($u) && $u !== false && $obj->error == false) { $u->setStatus(Encoder::STATUS_DONE); $u->save(); } elseif ($obj->error) { - _error_log("AVideo-Streamer sendFile error: " . json_encode($postFields) . ' <=>' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); + if(!empty($obj->response) && !empty($obj->response->msg) && !empty($encoder)){ + $encoder->setStatus(Encoder::STATUS_ERROR); + $encoder->setStatus_obs($obj->response->msg); + $savedId = $encoder->save(); + _error_log("AVideo-Streamer sendFile error: ". ' '. json_encode($obj->response->msg) . ' savedId=' . $savedId); + }else{ + _error_log("AVideo-Streamer sendFile error error: " . json_encode($postFields) . ' <=>' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)). ' '. json_encode($obj) ); + } } return $obj; } diff --git a/view/index.php b/view/index.php index 52463a4c7..f4f025283 100644 --- a/view/index.php +++ b/view/index.php @@ -43,7 +43,7 @@ @@ -785,26 +785,36 @@ function removeQueueItem(id) { return "Created: " + row.created + "
    Modified: " + row.modified; }, "status": function(column, row) { - var btn = ' '; - var label = "warning"; - if (row.status == "error") { - label = "danger"; - } else - if (row.status == "done") { - label = "success"; - } else - if (row.status == "queue") { - label = "primary"; + let content = ''; + + // Define label class for status + let labelClass = 'label-warning'; + if (row.status === "error") { + labelClass = 'label-danger'; + } else if (row.status === "done") { + labelClass = 'label-success'; + } else if (row.status === "queue") { + labelClass = 'label-primary'; + } else if (row.status === "encoding") { + labelClass = 'label-info'; + } + + // Main status + content += ` ${row.status}
    `; + + // ETA + if (row.encoding_status && row.encoding_status.remainTimeHuman) { + content += ` ETA: ${row.encoding_status.remainTimeHuman}
    `; } - var status = '' + row.status + ''; - var remainTimeHuman = ''; - if (row.encoding_status.remainTimeHuman) { - remainTimeHuman = 'ETA ' + row.encoding_status.remainTimeHuman + ''; + // Status observation or error message + if (row.status_obs) { + content += ` ${row.status_obs}`; } - return btn + status + "
    " + row.status_obs + "
    " + remainTimeHuman; + return content; }, + "title": function(column, row) { var l = getLocation(row.streamer); videos_id = 0; From 9f16dfa98ddb49feea0360963c361f73c29f71af Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 18 Jun 2025 12:54:21 -0300 Subject: [PATCH 397/416] Refactor Encoder class for improved status handling and logging; enhance UI updates in index view for better user experience --- objects/Encoder.php | 37 +++++++-- objects/Format.php | 5 +- objects/Object.php | 51 +++++++----- objects/functions.php | 2 + view/css/style.css | 51 +++++++++++- view/encodeProgressTemplate.html | 22 +++-- view/index.php | 138 +++++++++++++++++++++++++++---- 7 files changed, 254 insertions(+), 52 deletions(-) diff --git a/objects/Encoder.php b/objects/Encoder.php index 0f2b2120f..fe8aa22a8 100644 --- a/objects/Encoder.php +++ b/objects/Encoder.php @@ -196,7 +196,10 @@ public function save() $this->worker_pid = intval($this->worker_pid); _error_log("Encoder::save id=(" . $this->getId() . ") title=(" . $this->getTitle() . ") streamers_id={$this->streamers_id} status_obs={$this->status_obs} "); - return parent::save(); + $id = parent::save(); + $this->id = $id; + _error_log("Encoder::save id=(" . $this->getId() . ")". ' <=>' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); + return $id; } public static function getAll($onlyMine = false, $errorOnly = false) @@ -1158,8 +1161,12 @@ public function isWorkerRunning() private static function setStatusError($queue_id, $msg, $notifyIsDone = false) { global $global; - _error_log("setStatusError($queue_id, $msg, $notifyIsDone) " . json_encode(debug_backtrace())); $q = new Encoder($queue_id); + _error_log("setStatusError($queue_id, $msg, $notifyIsDone) isUploadLimitMsg status_obs=" . $q->getStatus_obs() . ' <=>' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); + if (self::isUploadLimitMsg($q->getStatus_obs())) { + return false; + } + $q->setStatus(Encoder::STATUS_ERROR); $q->setStatus_obs($msg); $saved = $q->save(); @@ -1302,13 +1309,16 @@ public static function run($try = 0) // Create the lock file with the current time file_put_contents($lockFile, time()); + _error_log("Encoder::run: Lock file created $lockFile"); if ($try > $maxTries) { + _error_log("Encoder::run: Lock file deleted maxTries $lockFile"); unlink($lockFile); // Remove the lock file before returning return false; } if (self::areDownloading(array(Encoder::STATUS_DOWNLOADING))) { + _error_log("Encoder::run: Lock file deleted areDownloading $lockFile"); //_error_log("You have a video downloading now, please wait "); unlink($lockFile); // Remove the lock file before returning return false; @@ -1419,7 +1429,9 @@ public static function run($try = 0) } else { $msg = "Encoder::run: Send message error = " . $response->msg; _error_log($msg); - self::setStatusError($encoder->getId(), $msg, 1); + if (!self::isUploadLimitMsg($encoder->getStatus_obs())) { + self::setStatusError($encoder->getId(), $msg, 1); + } unlink($lockFile); // Remove the lock file before returning return false; } @@ -1438,6 +1450,7 @@ public static function run($try = 0) if (empty($obj->videos_id)) { $errorMsg[] = 'We could not get videos_id check the streamer logs'; self::setStatusError($encoder->getId(), "We could not get videos_id check the streamer logs", 1); + _error_log("Encoder::run: Lock file deleted getVideosId $lockFile"); unlink($lockFile); // Remove the lock file before returning return false; } @@ -1460,6 +1473,7 @@ public static function run($try = 0) if ($setError) { self::setStatusError($encoder->getId(), "try [{$try}] ", 1); } + _error_log("Encoder::run: Lock file deleted setError $lockFile"); unlink($lockFile); // Remove the lock file before returning return false; } @@ -1486,7 +1500,7 @@ public static function run($try = 0) $msg .= (count($rows) == 1) ? " is encoding" : " are encoding"; $obj->msg = $msg; } - + _error_log("Encoder::run: Lock file deleted $lockFile"); // Remove the lock file before returning unlink($lockFile); return $obj; @@ -1865,7 +1879,7 @@ public static function sendFile($file, $return_vars, $format, Encoder $encoder = $encoder->setStatus(Encoder::STATUS_ERROR); $encoder->setStatus_obs($obj->response->msg); $savedId = $encoder->save(); - _error_log("AVideo-Streamer sendFile error: ". ' '. json_encode($obj->response->msg) . ' savedId=' . $savedId); + _error_log("AVideo-Streamer sendFile error: ". json_encode($obj->response->msg) . ' savedId=' . $savedId . ' <=>' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); }else{ _error_log("AVideo-Streamer sendFile error error: " . json_encode($postFields) . ' <=>' . json_encode(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)). ' '. json_encode($obj) ); } @@ -1873,6 +1887,11 @@ public static function sendFile($file, $return_vars, $format, Encoder $encoder = return $obj; } + private static function isUploadLimitMsg($text) + { + return stripos($text, 'upload limit reached') !== false; + } + public static function sendFileChunk($file, $return_vars, $format, $encoder = null, $resolution = "", $try = 0) { @@ -2200,6 +2219,7 @@ public static function sendToStreamer($target, $postFields, $return_vars = false return $obj; }else{ _error_log("sendToStreamer it is the spectrum (mp3 to hls) mp4 file will be sent"); + $postFields['forceIndex'] = 1; } } $f = new Format($encoder->getFormats_id()); @@ -2287,7 +2307,12 @@ public static function sendToStreamer($target, $postFields, $return_vars = false } } else { if (is_object($obj->response)) { - $obj->error = $obj->response->error; + if (isset($obj->response->error)) { + $obj->error = $obj->response->error; + } + if (isset($obj->response->code)) { + $obj->code = $obj->response->code; + } if (!empty($obj->response->msg)) { $obj->msg = $obj->response->msg; } diff --git a/objects/Format.php b/objects/Format.php index d994099de..bf41aa8b2 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -126,9 +126,9 @@ public function run($pathFileName, $encoder_queue_id) $path_parts = pathinfo($pathFileName); if (!file_exists($pathFileName)) { _error_log("AVideo-Encoder Format::run($pathFileName, $encoder_queue_id) ERROR File not found"); - $obj->msg = 'file not found'; + $obj->msg = "file not found $pathFileName"; $obj->addInQueueAgain = true; - + $obj->code = 404; return $obj; } /** @@ -920,6 +920,7 @@ private static function exec($format_id, $pathFileName, $destinationFile, $encod } $code = ''; eval('$code ="' . addcslashes($fc, '"') . '";'); + $code = replaceFFMPEG($code); $code = removeUserAgentIfNotURL($code); if (empty($code)) { diff --git a/objects/Object.php b/objects/Object.php index b80fbc4cd..2a9d2e940 100644 --- a/objects/Object.php +++ b/objects/Object.php @@ -1,17 +1,21 @@ load($id); } } - protected static function getFromDb($id) { + protected static function getFromDb($id) + { global $global; $id = intval($id); - $sql = "SELECT * FROM " . static::getTableName() . " WHERE id = $id LIMIT 1"; + $sql = "SELECT SQL_NO_CACHE * FROM " . static::getTableName() . " WHERE id = $id LIMIT 1"; $global['lastQuery'] = $sql; /** * @var array $global @@ -41,7 +47,9 @@ protected static function getFromDb($id) { return $res ? $res->fetch_assoc() : false; } - public static function getAll() { + + public static function getAll() + { global $global; $sql = "SELECT * FROM " . static::getTableName() . " WHERE 1=1 "; @@ -63,7 +71,8 @@ public static function getAll() { return $rows; } - public static function getTotal() { + public static function getTotal() + { //will receive //current=1&rowCount=10&sort[sender]=asc&searchPhrase= global $global; @@ -80,7 +89,8 @@ public static function getTotal() { return $res->num_rows; } - public static function getSqlFromPost() { + public static function getSqlFromPost() + { global $global; $sql = self::getSqlSearchFromPost(); @@ -113,7 +123,8 @@ public static function getSqlFromPost() { return $sql; } - public static function getSqlSearchFromPost() { + public static function getSqlSearchFromPost() + { $sql = ""; if (!empty($_POST['searchPhrase'])) { $_GET['q'] = $_POST['searchPhrase']; @@ -137,7 +148,8 @@ public static function getSqlSearchFromPost() { return $sql; } - public function save() { + public function save() + { global $global; $fieldsName = $this->getAllFields(); if (!empty($this->id)) { @@ -167,14 +179,14 @@ public function save() { } elseif (!isset($this->$value)) { $fields[] = " NULL "; } else { - if(preg_match('/_id$/', $value)){ + if (preg_match('/_id$/', $value)) { $id = intval($this->$value); - if(empty($id)){ + if (empty($id)) { $fields[] = " NULL "; - }else{ + } else { $fields[] = " {$id} "; } - }else{ + } else { $escapedValue = $global['mysqli']->real_escape_string($this->$value); $fields[] = " '{$escapedValue}' "; } @@ -187,7 +199,7 @@ public function save() { /** * @var array $global */ - + //error_log($sql); $insert_row = $global['mysqli']->query($sql); @@ -204,7 +216,8 @@ public function save() { } } - private function getAllFields() { + private function getAllFields() + { global $global, $mysqlHost, $mysqlUser, $mysqlPass, $mysqlDatabase; $sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{$mysqlDatabase}' AND TABLE_NAME = '" . static::getTableName() . "'"; $global['lastQuery'] = $sql; @@ -237,7 +250,8 @@ private function getAllFields() { } } - public function delete() { + public function delete() + { global $global; if (!empty($this->id)) { $sql = "DELETE FROM " . static::getTableName() . " "; @@ -252,5 +266,4 @@ public function delete() { error_log("Id for table " . static::getTableName() . " not defined for deletion"); return false; } - } diff --git a/objects/functions.php b/objects/functions.php index 79ffb9da3..399f9a7f4 100644 --- a/objects/functions.php +++ b/objects/functions.php @@ -45,6 +45,8 @@ function getFFmpegScaleToForceOriginalAspectRatio($width, $height) function replaceFFMPEG($cmd) { $cmd = removeUserAgentIfNotURL($cmd); + // has to be twice because of the double slashes + $cmd = str_replace("\\'", "'", $cmd); $cmd = str_replace("\\'", "'", $cmd); if (preg_match('/-user_agent/', $cmd)) { return $cmd; diff --git a/view/css/style.css b/view/css/style.css index 42793fc76..d1e03f6ed 100644 --- a/view/css/style.css +++ b/view/css/style.css @@ -19,7 +19,7 @@ } .progress>.progress-type { - color: #FFF; + color: #FFF; text-shadow: 0px 0px 5px #000; padding: 3px 10px 2px !important; white-space: nowrap; /* Prevents the text from wrapping */ @@ -33,7 +33,7 @@ font-weight: 800; padding: 3px 10px 2px !important; text-align: right; - color: #000; + color: #000; text-shadow: 0px 0px 5px #FFF; } @@ -118,6 +118,7 @@ .downloadProgress { border-top-left-radius: 0; border-top-right-radius: 0; + margin-bottom: 2px; } #config .checkboxes label { @@ -162,3 +163,49 @@ body { overflow: hidden; /* Hide overflow text */ text-overflow: ellipsis; /* Show ellipsis for overflow text */ } + +.label-priority { + background-color: #777; + color: white; + margin-left: 10px; +} + +.label-status { + margin-left: 10px; +} + +.label-status-error { + background-color: #d9534f; +} + +.label-status-done { + background-color: #5cb85c; +} + +.label-status-queue { + background-color: #337ab7; +} + +.label-status-encoding { + background-color: #5bc0de; +} + +.label-status-downloading { + background-color: #f0ad4e; +} + +.label-status-downloaded { + background-color: #f7b731; +} + +.label-status-transferring { + background-color: #8e44ad; +} + +.label-status-packing { + background-color: #e67e22; +} + +.label-status-fixing { + background-color: #16a085; +} diff --git a/view/encodeProgressTemplate.html b/view/encodeProgressTemplate.html index d119c084c..4b338bee9 100644 --- a/view/encodeProgressTemplate.html +++ b/view/encodeProgressTemplate.html @@ -1,17 +1,21 @@ -
    - {site} +
    +
    + {site} + Priority {priority} + {statusText} +
    -
    +
    0% Complete
    - Priority {priority} {title} + {title} - {name} + {name}
    -
    +
    -
    \ No newline at end of file +
    diff --git a/view/index.php b/view/index.php index f4f025283..3143a92e7 100644 --- a/view/index.php +++ b/view/index.php @@ -449,6 +449,73 @@ function setDownloadProgress(id, progress, setText) { }); } + function updateQueueItemVisual(queueItem) { + const id = queueItem.id; + const selector = '#encodeProgress' + id; + + if (!$(selector).length) { + // Item ainda não existe, será criado por createQueueItem + return; + } + + const status = queueItem.status.toLowerCase(); + const statusText = status.toUpperCase(); + + const statusClasses = { + encoding: 'label-status-encoding', + downloading: 'label-status-downloading', + downloaded: 'label-status-downloaded', + queue: 'label-status-queue', + error: 'label-status-error', + done: 'label-status-done', + transferring: 'label-status-transferring', + packing: 'label-status-packing', + fixing: 'label-status-fixing' + }; + + const obsClass = { + error: 'text-danger', + encoding: 'text-info', + downloading: 'text-warning', + downloaded: 'text-success', + done: 'text-success', + queue: 'text-muted', + transferring: 'text-primary', + packing: 'text-primary', + fixing: 'text-primary' + }; + + // Atualiza status label + const statusLabel = $(selector).find('.label-status'); + statusLabel.removeClass().addClass('label label-status ' + (statusClasses[status] || 'label-default')).text(statusText); + + // Atualiza título e nome, se quiser: + $(selector).find('.progress-type').html(`${queueItem.title}`); + $(selector).find('.progress-completed').html(queueItem.name); + + // Atualiza status_obs + const status_obs = queueItem.status_obs?.trim(); + const obsSelector = $(selector).find('.status-obs-container'); + if (status_obs) { + if (!obsSelector.length) { + $(selector).append( + `
    + + ${status_obs} + +
    ` + ); + } else { + obsSelector.html(` + ${status_obs} + `); + } + } else { + obsSelector.remove(); // Remove se não tiver mais texto + } + } + + function setEncodingProgress(id, progress, text) { var selector = "#encodingProgress" + id; if (!isNaN(progress)) { @@ -488,9 +555,13 @@ function checkProgress() { success: function(response) { if (response.queue_list.length) { for (i = 0; i < response.queue_list.length; i++) { - createQueueItem(response.queue_list[i], response.queue_list[i - 1]); + const item = response.queue_list[i]; + if ($('#encodeProgress' + item.id).length) { + updateQueueItemVisual(item); + } else { + createQueueItem(item, response.queue_list[i - 1]); + } } - } if (response.downloaded.length > 0) { for (i = 0; i < response.downloaded.length; i++) { @@ -569,24 +640,63 @@ function createQueueItem(queueItem, queueItemAfter) { if ($('#encodeProgress' + queueItem.id).length) { return false; } - console.log(queueItemAfter); - var itemsArray = {}; - itemsArray.id = queueItem.id; - itemsArray.site = queueItem.streamer_site; - itemsArray.priority = queueItem.streamer_priority; - itemsArray.title = queueItem.title; - itemsArray.name = queueItem.name; - - var item = arrayToTemplate(itemsArray, createQueueTemplate); - - if (typeof queueItemAfter === 'undefined' || !$("#" + queueItemAfter.id).length) { + const status = queueItem.status.toLowerCase(); + + const statusClasses = { + encoding: 'label-status-encoding', + downloading: 'label-status-downloading', + downloaded: 'label-status-downloaded', + queue: 'label-status-queue', + error: 'label-status-error', + done: 'label-status-done', + transferring: 'label-status-transferring', + packing: 'label-status-packing', + fixing: 'label-status-fixing' + }; + + const obsClass = { + error: 'text-danger', + encoding: 'text-info', + downloading: 'text-warning', + downloaded: 'text-success', + done: 'text-success', + queue: 'text-muted', + transferring: 'text-primary', + packing: 'text-primary', + fixing: 'text-primary' + }; + + const status_obs = queueItem.status_obs?.trim(); + const status_obs_block = status_obs ? + `
    + + ${status_obs} + +
    ` : ''; + + const itemsArray = { + id: queueItem.id, + site: queueItem.streamer_site, + priority: queueItem.streamer_priority, + title: queueItem.title, + name: queueItem.name, + statusText: status.toUpperCase(), + statusLabelClass: 'label label-status ' + (statusClasses[status] || 'label-default'), + status_obs_block: status_obs_block + }; + + const item = arrayToTemplate(itemsArray, createQueueTemplate); + + if (typeof queueItemAfter === 'undefined' || !$("#encodeProgress" + queueItemAfter.id).length) { $("#encoding").append(item); } else { - $(item).insertAfter("#" + queueItemAfter.id); + $(item).insertAfter("#encodeProgress" + queueItemAfter.id); } + updateQueueItemVisual(queueItem); } + function removeQueueItem(id) { checkProgressRemoveTimeout[id] = setTimeout(function() { $("#encodeProgress" + id).fadeOut("slow", function() { From 9978c961196e1b5ad0a1afd298be81a73e479ed3 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 18 Jun 2025 14:15:18 -0300 Subject: [PATCH 398/416] Update allowed file types in checkConfiguration.php to include 'mts' and 'm2ts' for enhanced media support --- install/checkConfiguration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/checkConfiguration.php b/install/checkConfiguration.php index 83acb23ac..b9c1cb806 100644 --- a/install/checkConfiguration.php +++ b/install/checkConfiguration.php @@ -128,7 +128,7 @@ \$mysqlPass = '{$_POST['databasePass']}'; \$mysqlDatabase = '{$_POST['databaseName']}'; -\$global['allowed'] = array('mp4', 'avi', 'mov', 'flv', 'mp3', 'wav', 'm4v', 'webm', 'wmv', 'mpg', 'mpeg', 'f4v', 'm4v', 'm4a', 'm2p', 'rm', 'vob', 'mkv', '3gp'); +\$global['allowed'] = array('mp4', 'avi', 'mov', 'flv', 'mp3', 'wav', 'm4v', 'webm', 'wmv', 'mpg', 'mpeg', 'f4v', 'm4v', 'm4a', 'm2p', 'rm', 'vob', 'mkv', '3gp', 'mts', 'm2ts'); /** * Do NOT change from here */ From 86407b41bcb23b1b7bb68e96d8f35f6cd4e7c582 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Fri, 4 Jul 2025 12:22:52 -0300 Subject: [PATCH 399/416] Add dynamic file type acceptance in jQuery File Upload for improved flexibility --- view/index.header.php | 1 + view/jquery-file-upload/js/main.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/view/index.header.php b/view/index.header.php index 9b30823ab..127a634b5 100644 --- a/view/index.header.php +++ b/view/index.header.php @@ -49,6 +49,7 @@ var webSiteRootPath = ''; var webSiteRootURL = ''; var PHPSESSID = ''; + var acceptFileTypes = /(\.|\/)()$/i; diff --git a/view/jquery-file-upload/js/main.js b/view/jquery-file-upload/js/main.js index 0f94f73f5..dc2963438 100644 --- a/view/jquery-file-upload/js/main.js +++ b/view/jquery-file-upload/js/main.js @@ -20,7 +20,7 @@ $(function () { url: 'view/jquery-file-upload/server/php/?PHPSESSID=' + PHPSESSID, maxChunkSize: 5000000, // 5 MB maxNumberOfFiles: 5, - acceptFileTypes: /(\.|\/)(mp4|m3u8|webm|ogg|ogv|mp3|wav|aac|flac)$/i, + acceptFileTypes: acceptFileTypes, add: function (e, data) { selectedFileName = data.files[0].name; var videos_id = $('#update_video_id').val(); From fbea38e231ad61554fd31ccf555d60ce5c57d767 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Mon, 14 Jul 2025 12:36:36 -0300 Subject: [PATCH 400/416] Refactor progress bar transition duration for improved visual feedback --- view/css/style.css | 6 ------ 1 file changed, 6 deletions(-) diff --git a/view/css/style.css b/view/css/style.css index d1e03f6ed..82e33dc04 100644 --- a/view/css/style.css +++ b/view/css/style.css @@ -38,12 +38,6 @@ } .progress-bar { - -webkit-transition: width 1.5s ease; - -o-transition: width 1.5s ease; - transition: width 1.5s ease; -} - -.progress-bar.active { -webkit-transition: width 6s ease; -o-transition: width 6s ease; transition: width 6s ease; From 293b079fd8812b2cc629e98e940fdffab09ba1b0 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Aug 2025 22:16:58 -0300 Subject: [PATCH 401/416] Enhance logging in youtubeDl.json for better debugging and error tracking --- view/youtubeDl.json.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index c9b4484a8..239601bf4 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -11,22 +11,27 @@ session_write_close(); if (empty($_REQUEST['videoURL'])) { + error_log("youtubeDl.json: videoURL is empty"); $obj->msg = "videoURL is empty"; } else { if (!empty($_REQUEST['webSiteRootURL']) && !empty($_REQUEST['user']) && !empty($_REQUEST['pass']) && empty($_REQUEST['justLogin'])) { - error_log("youtubeDl.json: Login::run"); + error_log("youtubeDl.json: Attempting login with provided credentials"); Login::run($_REQUEST['user'], $_REQUEST['pass'], $_REQUEST['webSiteRootURL'], true); } if (!Login::canUpload()) { + error_log("youtubeDl.json: User does not have upload permissions"); $obj->msg = "This user can not upload files"; } else { if (!($streamers_id = Login::getStreamerId())) { + error_log("youtubeDl.json: No streamer site found"); $obj->msg = "There is no streamer site"; } else { + error_log("youtubeDl.json: Streamer ID found: {$streamers_id}"); // if it is a channel $rexexp = "/^(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/(channel|user).+/"; if (preg_match($rexexp, $_REQUEST['videoURL'])) { + error_log("youtubeDl.json: Processing YouTube channel URL"); if (!Login::canBulkEncode()) { $obj->msg = "Channel Import is disabled"; die(json_encode($obj)); @@ -54,6 +59,7 @@ error_log("Process Done Total {$i}"); } else { if (isFTPURL($_REQUEST['videoURL'])) { + error_log("youtubeDl.json: Detected FTP URL"); require_once __DIR__ . '/../objects/FTPDownloader.php'; try { $downloader = new FTPDownloader($_REQUEST['videoURL']); @@ -64,6 +70,7 @@ echo "Error: " . $e->getMessage() . "\n"; } } else { + error_log("youtubeDl.json: Adding video with URL: {$_REQUEST['videoURL']}"); $obj = addVideo($_REQUEST['videoURL'], $streamers_id, @$_REQUEST['videoTitle']); } } @@ -72,6 +79,7 @@ } if (empty($doNotDie)) { + error_log("youtubeDl.json: Sending response"); echo (json_encode($obj)); exit; } From 0c818ef44bd21d30b85dc5df02560af0111c7a8d Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Aug 2025 22:19:45 -0300 Subject: [PATCH 402/416] Improve JSON response handling and error logging in youtubeDl.json --- view/youtubeDl.json.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index 239601bf4..10b88b823 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -79,7 +79,14 @@ } if (empty($doNotDie)) { - error_log("youtubeDl.json: Sending response"); - echo (json_encode($obj)); + $resp = json_encode($obj); + if ($resp === false) { + $jsonError = json_last_error_msg(); + error_log("youtubeDl.json: JSON encoding error - {$jsonError}"); + $resp = json_encode(["error" => "JSON encoding failed", "details" => $jsonError]); + } else { + error_log("youtubeDl.json: Sending response {$resp}"); + } + echo $resp; exit; } From f46d4087eb036bc66c01ce1f74160709c0fcdfd5 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Aug 2025 22:24:36 -0300 Subject: [PATCH 403/416] Refactor cleanFilename function and improve error logging in youtubeDl.json --- view/youtubeDl.json.php | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index 10b88b823..4df846c0b 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -10,6 +10,11 @@ session_write_close(); +function cleanFilename($filename) { + // Remove BOM (Byte Order Mark) and other unwanted characters + return preg_replace('/[^\w\d\-_\. ]/', '', preg_replace('/^\xEF\xBB\xBF/', '', $filename)); +} + if (empty($_REQUEST['videoURL'])) { error_log("youtubeDl.json: videoURL is empty"); $obj->msg = "videoURL is empty"; @@ -29,7 +34,7 @@ } else { error_log("youtubeDl.json: Streamer ID found: {$streamers_id}"); // if it is a channel - $rexexp = "/^(http(s)?:\/\/)?((w){3}.)?youtu(be|.be)?(\.com)?\/(channel|user).+/"; + $rexexp = "/^(http(s)?:\\/\\/)?((w){3}.)?youtu(be|.be)?(\\.com)?\\/(channel|user).+/"; if (preg_match($rexexp, $_REQUEST['videoURL'])) { error_log("youtubeDl.json: Processing YouTube channel URL"); if (!Login::canBulkEncode()) { @@ -67,7 +72,8 @@ $downloader->queueFiles(); $downloader->close(); } catch (Exception $e) { - echo "Error: " . $e->getMessage() . "\n"; + error_log("youtubeDl.json: FTPDownloader exception - " . $e->getMessage()); + $obj->msg = "FTP download failed: " . $e->getMessage(); } } else { error_log("youtubeDl.json: Adding video with URL: {$_REQUEST['videoURL']}"); @@ -78,6 +84,17 @@ } } +if (isset($_REQUEST['videoTitle'])) { + $_REQUEST['videoTitle'] = cleanFilename($_REQUEST['videoTitle']); + error_log("youtubeDl.json: Cleaned video title: {$_REQUEST['videoTitle']}"); +} + +// Ensure $obj is populated before sending the response +if (empty((array)$obj)) { + error_log("youtubeDl.json: $obj is empty, adding default error message"); + $obj->msg = "An unknown error occurred"; +} + if (empty($doNotDie)) { $resp = json_encode($obj); if ($resp === false) { From 6e6681011c404b5896a20953e7510871c8fc101b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Aug 2025 22:26:26 -0300 Subject: [PATCH 404/416] Improve error logging for empty object and JSON encoding failures in youtubeDl.json --- view/youtubeDl.json.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index 4df846c0b..446ff52ab 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -91,10 +91,18 @@ function cleanFilename($filename) { // Ensure $obj is populated before sending the response if (empty((array)$obj)) { - error_log("youtubeDl.json: $obj is empty, adding default error message"); + error_log("youtubeDl.json: Object is empty, adding default error message"); $obj->msg = "An unknown error occurred"; } +// Convert $obj to JSON for logging +$objAsJson = json_encode($obj); +if ($objAsJson === false) { + $jsonError = json_last_error_msg(); + error_log("youtubeDl.json: Failed to encode object for logging - {$jsonError}"); + $objAsJson = "{\"error\":\"Failed to encode object\"}"; +} + if (empty($doNotDie)) { $resp = json_encode($obj); if ($resp === false) { From 5bb7cde739dfd89ede88797e57ebae3e04d3db23 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Aug 2025 22:28:42 -0300 Subject: [PATCH 405/416] Enhance logging for video title and downloaded link processing in youtubeDl.json --- view/youtubeDl.json.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index 446ff52ab..f6c631559 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -89,9 +89,18 @@ function cleanFilename($filename) { error_log("youtubeDl.json: Cleaned video title: {$_REQUEST['videoTitle']}"); } +if (isset($_REQUEST['videoDownloadedLink'])) { + $_REQUEST['videoDownloadedLink'] = cleanFilename($_REQUEST['videoDownloadedLink']); + error_log("youtubeDl.json: Cleaned video downloaded link: {$_REQUEST['videoDownloadedLink']}"); +} + +// Add logging before calling queueFiles +error_log("youtubeDl.json: Calling queueFiles with videoDownloadedLink: {$_REQUEST['videoDownloadedLink']} and videoTitle: {$_REQUEST['videoTitle']}"); + // Ensure $obj is populated before sending the response if (empty((array)$obj)) { - error_log("youtubeDl.json: Object is empty, adding default error message"); + error_log("youtubeDl.json: Object is empty after queueFiles. Debugging..."); + error_log("youtubeDl.json: videoDownloadedLink: {$_REQUEST['videoDownloadedLink']}, videoTitle: {$_REQUEST['videoTitle']}"); $obj->msg = "An unknown error occurred"; } From f1cdaffcf187cafc2d4c39dde987ecf2ec61237a Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Aug 2025 22:29:51 -0300 Subject: [PATCH 406/416] Improve handling and logging for videoDownloadedLink in youtubeDl.json --- view/youtubeDl.json.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index f6c631559..ea182faed 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -89,11 +89,16 @@ function cleanFilename($filename) { error_log("youtubeDl.json: Cleaned video title: {$_REQUEST['videoTitle']}"); } -if (isset($_REQUEST['videoDownloadedLink'])) { - $_REQUEST['videoDownloadedLink'] = cleanFilename($_REQUEST['videoDownloadedLink']); - error_log("youtubeDl.json: Cleaned video downloaded link: {$_REQUEST['videoDownloadedLink']}"); +// Check if videoDownloadedLink is set +if (!isset($_REQUEST['videoDownloadedLink']) || empty($_REQUEST['videoDownloadedLink'])) { + error_log("youtubeDl.json: videoDownloadedLink is missing or empty in \\$_REQUEST"); + $_REQUEST['videoDownloadedLink'] = ""; // Set a default empty value or handle appropriately } +// Clean videoDownloadedLink +$_REQUEST['videoDownloadedLink'] = cleanFilename($_REQUEST['videoDownloadedLink']); +error_log("youtubeDl.json: Cleaned video downloaded link: {$_REQUEST['videoDownloadedLink']}"); + // Add logging before calling queueFiles error_log("youtubeDl.json: Calling queueFiles with videoDownloadedLink: {$_REQUEST['videoDownloadedLink']} and videoTitle: {$_REQUEST['videoTitle']}"); From 575a49ebb75589eac6422e2f74d8297e7757859b Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Aug 2025 22:35:28 -0300 Subject: [PATCH 407/416] Enhance error handling and logging for video processing in youtubeDl.json --- view/youtubeDl.json.php | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index ea182faed..fd1aae7b4 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -71,12 +71,13 @@ function cleanFilename($filename) { $downloader->connect(); $downloader->queueFiles(); $downloader->close(); + $obj = (object)['error' => false, 'msg' => 'Files queued']; } catch (Exception $e) { error_log("youtubeDl.json: FTPDownloader exception - " . $e->getMessage()); - $obj->msg = "FTP download failed: " . $e->getMessage(); + $obj = (object)['error' => true, 'msg' => "FTP download failed: " . $e->getMessage()]; } } else { - error_log("youtubeDl.json: Adding video with URL: {$_REQUEST['videoURL']}"); + error_log("youtubeDl.json: Adding video with URL: " . $_REQUEST['videoURL']); $obj = addVideo($_REQUEST['videoURL'], $streamers_id, @$_REQUEST['videoTitle']); } } @@ -86,27 +87,21 @@ function cleanFilename($filename) { if (isset($_REQUEST['videoTitle'])) { $_REQUEST['videoTitle'] = cleanFilename($_REQUEST['videoTitle']); - error_log("youtubeDl.json: Cleaned video title: {$_REQUEST['videoTitle']}"); + error_log("youtubeDl.json: Cleaned video title: " . $_REQUEST['videoTitle']); } -// Check if videoDownloadedLink is set +// Avoid sanitizing URLs if (!isset($_REQUEST['videoDownloadedLink']) || empty($_REQUEST['videoDownloadedLink'])) { error_log("youtubeDl.json: videoDownloadedLink is missing or empty in \\$_REQUEST"); - $_REQUEST['videoDownloadedLink'] = ""; // Set a default empty value or handle appropriately +} else { + error_log("youtubeDl.json: videoDownloadedLink provided: " . $_REQUEST['videoDownloadedLink']); } -// Clean videoDownloadedLink -$_REQUEST['videoDownloadedLink'] = cleanFilename($_REQUEST['videoDownloadedLink']); -error_log("youtubeDl.json: Cleaned video downloaded link: {$_REQUEST['videoDownloadedLink']}"); - -// Add logging before calling queueFiles -error_log("youtubeDl.json: Calling queueFiles with videoDownloadedLink: {$_REQUEST['videoDownloadedLink']} and videoTitle: {$_REQUEST['videoTitle']}"); - // Ensure $obj is populated before sending the response if (empty((array)$obj)) { - error_log("youtubeDl.json: Object is empty after queueFiles. Debugging..."); - error_log("youtubeDl.json: videoDownloadedLink: {$_REQUEST['videoDownloadedLink']}, videoTitle: {$_REQUEST['videoTitle']}"); - $obj->msg = "An unknown error occurred"; + error_log("youtubeDl.json: Object is empty after processing. Debugging..."); + error_log("youtubeDl.json: videoURL: " . $_REQUEST['videoURL'] . ", videoTitle: " . $_REQUEST['videoTitle']); + $obj = (object)['error' => true, 'msg' => "An unknown error occurred"]; } // Convert $obj to JSON for logging @@ -114,7 +109,7 @@ function cleanFilename($filename) { if ($objAsJson === false) { $jsonError = json_last_error_msg(); error_log("youtubeDl.json: Failed to encode object for logging - {$jsonError}"); - $objAsJson = "{\"error\":\"Failed to encode object\"}"; + $objAsJson = json_encode(["error" => true, "msg" => "Failed to encode object", "details" => $jsonError]); } if (empty($doNotDie)) { @@ -122,9 +117,9 @@ function cleanFilename($filename) { if ($resp === false) { $jsonError = json_last_error_msg(); error_log("youtubeDl.json: JSON encoding error - {$jsonError}"); - $resp = json_encode(["error" => "JSON encoding failed", "details" => $jsonError]); + $resp = json_encode(["error" => true, "msg" => "JSON encoding failed", "details" => $jsonError]); } else { - error_log("youtubeDl.json: Sending response {$resp}"); + error_log("youtubeDl.json: Sending response " . $resp); } echo $resp; exit; From 38ba5460609876a82ff192a763e35de96efe4644 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 27 Aug 2025 22:40:25 -0300 Subject: [PATCH 408/416] Fix logging message for missing videoDownloadedLink in youtubeDl.json --- view/youtubeDl.json.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/view/youtubeDl.json.php b/view/youtubeDl.json.php index fd1aae7b4..01f9b5653 100644 --- a/view/youtubeDl.json.php +++ b/view/youtubeDl.json.php @@ -92,7 +92,7 @@ function cleanFilename($filename) { // Avoid sanitizing URLs if (!isset($_REQUEST['videoDownloadedLink']) || empty($_REQUEST['videoDownloadedLink'])) { - error_log("youtubeDl.json: videoDownloadedLink is missing or empty in \\$_REQUEST"); + error_log("youtubeDl.json: videoDownloadedLink is missing or empty in \$_REQUEST"); } else { error_log("youtubeDl.json: videoDownloadedLink provided: " . $_REQUEST['videoDownloadedLink']); } From 9929cb07b0b10dec50b0ed8ae0599f6b79c4accc Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Wed, 17 Sep 2025 14:05:24 -0300 Subject: [PATCH 409/416] Enhance audio command for HLS processing with improved parameters and segment type https://github.com/WWBN/AVideo/issues/10195 --- objects/HLSProcessor.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/objects/HLSProcessor.php b/objects/HLSProcessor.php index 01db958b3..3ee8c797c 100644 --- a/objects/HLSProcessor.php +++ b/objects/HLSProcessor.php @@ -82,12 +82,11 @@ public static function createHLSWithAudioTracks($pathFileName, $destinationFile) $audioTsPattern = "{$destinationFile}audio_tracks/{$langDir}/audio_%03d.ts"; // Pattern for audio .ts segments // Correctly map the audio track and add VOD parameters - $audioCommand = get_ffmpeg() . " -i {$pathFileName} " - . " -map 0:a:{$track->index} -c:a aac -b:a 128k " - // Enforce identical segment time - . " -movflags +faststart -f hls -hls_time 6 " - . " -hls_flags independent_segments+split_by_time " - . " -hls_playlist_type vod " + $audioCommand = get_ffmpeg() . " -y -i {$pathFileName} " + . " -vn -map 0:a:{$track->index} " + . " -c:a aac -profile:a aac_low -ac 2 -ar 48000 -b:a 128k " + . " -f hls -hls_time 6 -hls_flags independent_segments+split_by_time " + . " -hls_playlist_type vod -hls_segment_type mpegts " . " -hls_segment_filename \"{$audioTsPattern}\" {$audioFile}"; From 26928a8d270c0fc1c2905f8384e67144d5a0df2f Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 30 Oct 2025 12:07:20 -0300 Subject: [PATCH 410/416] Update service link in README.md from youphptube.com to streamphp.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9bcb9c5a..2eed1e61a 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Ok, check this out! https://tutorials.avideo.com/video/streamer-and-encoder ### Are you having a hard time to configure or install AVideo or any of its resources? fell free to ask us for help: -https://www.youphptube.com/services +https://www.streamphp.com/services From 68b59cf0b2f3914c5b3b9a5e9869dc4b8587a188 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 30 Oct 2025 12:07:43 -0300 Subject: [PATCH 411/416] Update service link in README.md to remove 'www' from streamphp.com --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2eed1e61a..99165ebf6 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Ok, check this out! https://tutorials.avideo.com/video/streamer-and-encoder ### Are you having a hard time to configure or install AVideo or any of its resources? fell free to ask us for help: -https://www.streamphp.com/services +https://streamphp.com/services From 5f0d67e51f95420fd6215713290bd3339181c768 Mon Sep 17 00:00:00 2001 From: Daniel Neto Date: Thu, 30 Oct 2025 13:43:35 -0300 Subject: [PATCH 412/416] Add user-specific resolution handling and logging for encoding --- objects/Format.php | 121 ++++++++++++++++++++++++++++++++++++- objects/Login.php | 23 ++++++- view/index_shareVideos.php | 19 +++--- 3 files changed, 152 insertions(+), 11 deletions(-) diff --git a/objects/Format.php b/objects/Format.php index bf41aa8b2..cfd523c30 100644 --- a/objects/Format.php +++ b/objects/Format.php @@ -557,6 +557,65 @@ public static function getAvailableResolutionsInfo() return $resolutions; } + /** + * Get available resolutions info with user group restrictions applied + * Shows only the resolutions that will actually be encoded for the current user + * @return array Array of resolution info considering user restrictions + */ + public static function getAvailableResolutionsInfoForUser() + { + $resolutions = []; + $availableResolutions = Format::getAvailableResolutions(); + + // Get the final resolutions that will be used for encoding (with user restrictions) + $finalResolutions = self::getSelectedResolutionsWithUserRestrictions(); + + foreach ($availableResolutions as $key => $resolution) { + // Check if this resolution will actually be encoded for the current user + $resolutionWillBeEncoded = (array_search($resolution, $finalResolutions, true) !== false); + + if (!$resolutionWillBeEncoded) { + continue; // Skip resolutions that won't be encoded + } + + $label = " 'checked', // All returned resolutions will be encoded + 'label' => $label, + 'resolution' => $resolution, + ); + } + + _error_log("Format::getAvailableResolutionsInfoForUser - Final resolutions for display: " . json_encode(array_column($resolutions, 'resolution'))); + + return $resolutions; + } + public static function sanitizeResolutions($resolutions) { if (is_array($resolutions)) { @@ -609,6 +668,58 @@ private static function getSelectedResolutions() return $result; } + /** + * Get final resolutions to encode based on user restrictions and encoder settings + * @param array|null $userAllowedResolutions Resolutions from login response + * @param array $encoderEnabledResolutions Resolutions enabled in encoder + * @return array Final resolutions to use + */ + private static function getFinalResolutions($userAllowedResolutions, $encoderEnabledResolutions) { + // Se não há restrições do usuário, usar as do encoder + if (empty($userAllowedResolutions) || !is_array($userAllowedResolutions)) { + _error_log("Format::getFinalResolutions - No user restrictions, using encoder resolutions: " . json_encode($encoderEnabledResolutions)); + return $encoderEnabledResolutions; + } + + // Calcular intersecção (apenas as que estão em ambos) + $finalResolutions = array_intersect($userAllowedResolutions, $encoderEnabledResolutions); + + // Se não há nenhuma resolução em comum, usar as do encoder (fallback) + if (empty($finalResolutions)) { + _error_log("Format::getFinalResolutions - No intersection, fallback to encoder resolutions. User: " . json_encode($userAllowedResolutions) . " Encoder: " . json_encode($encoderEnabledResolutions)); + return $encoderEnabledResolutions; + } + + // Remover duplicatas e ordenar + $finalResolutions = array_unique($finalResolutions); + sort($finalResolutions); + + _error_log("Format::getFinalResolutions - Final resolutions after filtering. User: " . json_encode($userAllowedResolutions) . " Encoder: " . json_encode($encoderEnabledResolutions) . " Final: " . json_encode($finalResolutions)); + + return $finalResolutions; + } + + /** + * Get selected resolutions with user group restrictions applied + * @return array Final resolutions to use for encoding + */ + private static function getSelectedResolutionsWithUserRestrictions() + { + // Get encoder configured resolutions + $encoderResolutions = self::getSelectedResolutions(); + + // Get user allowed resolutions from login session + require_once __DIR__ . '/Login.php'; + $userAllowedResolutions = Login::getAllowedResolutions(); + + // Apply user restrictions + $finalResolutions = self::getFinalResolutions($userAllowedResolutions, $encoderResolutions); + + _error_log("Format::getSelectedResolutionsWithUserRestrictions - User allowed: " . json_encode($userAllowedResolutions) . " Encoder enabled: " . json_encode($encoderResolutions) . " Final: " . json_encode($finalResolutions)); + + return $finalResolutions; + } + static function loadEncoderConfiguration() { $availableConfiguration = self::getAvailableConfigurations(); @@ -618,7 +729,8 @@ static function loadEncoderConfiguration() $audioBitrate = []; $videoFramerate = []; - $selectedResolutions = self::getSelectedResolutions(); + // Use the new method that applies user group restrictions + $selectedResolutions = self::getSelectedResolutionsWithUserRestrictions(); sort($selectedResolutions); @@ -631,6 +743,13 @@ static function loadEncoderConfiguration() array_push($videoFramerate, $availableConfiguration["videoFramerate"][$key]); } + _error_log("Format::loadEncoderConfiguration - Final encoder config: " . json_encode(array( + "resolutions" => $resolutions, + "bandwidth" => $bandwidth, + "audioBitrate" => $audioBitrate, + "videoFramerate" => $videoFramerate + ))); + return array( "resolutions" => $resolutions, "bandwidth" => $bandwidth, diff --git a/objects/Login.php b/objects/Login.php index 924cd0033..fa8d84a5d 100644 --- a/objects/Login.php +++ b/objects/Login.php @@ -13,10 +13,10 @@ private static function modifyUrl($url) { if (strpos($url, '/live?p=') !== false) { $parsedUrl = parse_url($url); $path = isset($parsedUrl['path']) ? $parsedUrl['path'] : ''; - + // Remove everything after the last '/' before '/live?p=' $path = substr($path, 0, strrpos($path, '/live?p=')); - + return $parsedUrl['scheme'] . '://' . $parsedUrl['host'] . $path . '/'; } return $url; @@ -246,6 +246,23 @@ static function getStreamerId() { return intval($_SESSION['login']->streamers_id); } + /** + * Get allowed resolutions for the logged user from login session + * @return array|null Array of allowed resolutions or null if not set + */ + static function getAllowedResolutions() { + if (!static::isLogged()) { + return null; + } + + // Check if allowedResolutions exists in session + if (!empty($_SESSION['login']->allowedResolutions) && is_array($_SESSION['login']->allowedResolutions)) { + return $_SESSION['login']->allowedResolutions; + } + + return null; + } + } -} \ No newline at end of file +} diff --git a/view/index_shareVideos.php b/view/index_shareVideos.php index a46616d72..a47e6f4f6 100644 --- a/view/index_shareVideos.php +++ b/view/index_shareVideos.php @@ -62,7 +62,7 @@ ?>
    -
    @@ -113,7 +113,7 @@ ?>
    -
    @@ -131,13 +131,18 @@