From 017abc6cb2828bf25706e60231a72ede94e783f8 Mon Sep 17 00:00:00 2001 From: boffart <> Date: Wed, 26 Jun 2024 12:27:43 +0300 Subject: [PATCH 01/13] =?UTF-8?q?#736=20=D0=92=D0=B5=D1=80=D0=BD=D1=83?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D0=BE.=20mbr=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=82=D0=BA=D1=83.=20=D0=A2?= =?UTF-8?q?=D0=B8=D0=BF=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=B5=D0=BD=20=D0=B1=D1=8B=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BE=D0=B4=D0=B8=D0=BD=20=D0=BD=D0=B0=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D1=85=20=D0=B4=D0=B8=D1=81=D0=BA=D0=B0=D1=85,=20=D0=B8?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=BF=D0=BE=D1=8F=D0=B2=D0=BB=D1=8F=D1=8E=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=20=D1=81=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/System/Storage.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/System/Storage.php b/src/Core/System/Storage.php index 61c3b663e..1d61439da 100644 --- a/src/Core/System/Storage.php +++ b/src/Core/System/Storage.php @@ -383,7 +383,7 @@ public function formatEntireDisk(string $device, bool $bg = false): bool // First, remove existing partitions and then create a new msdos partition table and ext4 partition // This command deletes all existing partitions and creates a new primary partition using the full disk - $command = "$parted --script --align optimal '$device' 'mklabel gpt'"; + $command = "$parted --script --align optimal '$device' 'mklabel msdos'"; Processes::mwExec($command); // Apply the command to clear the partition table // Now create a new partition that spans the entire disk @@ -519,7 +519,7 @@ public static function selectAndConfigureStorageDisk(bool $automatic=false, bool // Check if the disk selection should be automatic if ($automatic) { $target_disk_storage = $selected_disk['id']; - SystemMessages::echoToTeletype(PHP_EOL.' |- '."Automatically selected storage disk is $target_disk_storage"); + SystemMessages::echoToTeletype(PHP_EOL.' - '."Automatically selected storage disk is $target_disk_storage"); } else { echo PHP_EOL." " . Util::translate('Select the drive to store the data.'); echo PHP_EOL." " . Util::translate('Selected disk:') . "\033[33;1m [{$selected_disk['id']}] \033[0m ".PHP_EOL.PHP_EOL; From b1c3347a718ff7ee6810982f268ba24b49fb313d Mon Sep 17 00:00:00 2001 From: boffart <> Date: Thu, 27 Jun 2024 14:58:23 +0300 Subject: [PATCH 02/13] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B8=20=D1=80=D0=B5=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Lib/CdrDB/GetActiveChannelsAction.php | 76 ++++++++----------- 1 file changed, 33 insertions(+), 43 deletions(-) diff --git a/src/PBXCoreREST/Lib/CdrDB/GetActiveChannelsAction.php b/src/PBXCoreREST/Lib/CdrDB/GetActiveChannelsAction.php index 7878681c5..dea8ec183 100644 --- a/src/PBXCoreREST/Lib/CdrDB/GetActiveChannelsAction.php +++ b/src/PBXCoreREST/Lib/CdrDB/GetActiveChannelsAction.php @@ -19,17 +19,18 @@ namespace MikoPBX\PBXCoreREST\Lib\CdrDB; -use MikoPBX\Core\System\BeanstalkClient; +use MikoPBX\Common\Providers\CDRDatabaseProvider; use MikoPBX\Core\System\Util; -use MikoPBX\Core\Workers\WorkerCdr; use MikoPBX\PBXCoreREST\Lib\PBXApiResult; +use Phalcon\Exception; +use Phalcon\Di\Injectable; /** * Get active channels. These are the unfinished calls (endtime IS NULL). * * @package MikoPBX\PBXCoreREST\Lib\CdrDB */ -class GetActiveChannelsAction extends \Phalcon\Di\Injectable +class GetActiveChannelsAction extends Injectable { /** * Get active channels. These are the unfinished calls (endtime IS NULL). @@ -40,52 +41,41 @@ public static function main(): PBXApiResult { $res = new PBXApiResult(); $res->processor = __METHOD__; + $res->success = true; try { - $res->success = true; + $activeChannels = Util::getAstManager('off')->GetChannels(); + }catch (Exception $e){ + $res->success = false; + $res->messages[] = $e->getMessage(); + return $res; + } - $filter = [ - 'endtime=""', - 'order' => 'id', - 'columns' => 'start,answer,src_chan,dst_chan,src_num,dst_num,did,linkedid', - 'miko_tmp_db' => true, - 'miko_result_in_file' => true, - ]; - $client = new BeanstalkClient(WorkerCdr::SELECT_CDR_TUBE); - list($result, $message) = $client->sendRequest(json_encode($filter), 2); - if ($result === false) { - $res->data = []; - } else { - $am = Util::getAstManager('off'); - $active_chans = $am->GetChannels(true); - $result_data = []; + $filter = [ + 'endtime=""', + 'order' => 'id', + 'columns' => 'start,answer,src_chan,dst_chan,src_num,dst_num,did,linkedid', + 'miko_tmp_db' => true, + ]; + $cdrData = CDRDatabaseProvider::getCdr($filter); - $result = json_decode($message); - if (file_exists($result)) { - $data = json_decode(file_get_contents($result), true); - unlink($result); - foreach ($data as $row) { - if (!isset($active_chans[$row['linkedid']])) { - // The call no longer exists. - continue; - } - if (empty($row['dst_chan']) && empty($row['src_chan'])) { - // This is an erroneous situation. Ignore such a call. - continue; - } - $channels = $active_chans[$row['linkedid']]; - if ((empty($row['src_chan']) || in_array($row['src_chan'], $channels)) - && (empty($row['dst_chan']) || in_array($row['dst_chan'], $channels))) { - $result_data[] = $row; - } - } - } - $res->data = $result_data; + $result_data = []; + foreach ($cdrData as $row) { + if (!isset($activeChannels[$row['linkedid']])) { + // The call no longer exists. + continue; + } + if (empty($row['dst_chan']) && empty($row['src_chan'])) { + // This is an erroneous situation. Ignore such a call. + continue; + } + $channels = $activeChannels[$row['linkedid']]; + if ((empty($row['src_chan']) || in_array($row['src_chan'], $channels, true)) + && (empty($row['dst_chan']) || in_array($row['dst_chan'], $channels, true))) { + $result_data[] = $row; } - } catch (\Throwable $e) { - $res->success = false; - $res->messages[] = $e->getMessage(); } + $res->data = $result_data; return $res; } } \ No newline at end of file From 5bd26803dc5a37b1263e76e32f4056166e3c54d2 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 5 Jul 2024 00:21:13 +0300 Subject: [PATCH 03/13] Translated using Weblate (Portuguese) Currently translated at 100.0% (1241 of 1241 strings) Co-authored-by: David Coimbra de Oliveira Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/pt/ Translation: MIKOPBX/Core --- src/Common/Messages/pt.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Common/Messages/pt.php b/src/Common/Messages/pt.php index ecfcebd86..20c7269d5 100644 --- a/src/Common/Messages/pt.php +++ b/src/Common/Messages/pt.php @@ -830,7 +830,7 @@ 'ex_Number' => 'Número do ramal', 'ex_Language' => 'Interface e linguagem de alerta', 'ex_ThisEmailAlreadyRegisteredForOtherUser' => 'O endereço digitado já está registrado para', - 'ex_EmailAddress' => 'Endereço de email', + 'ex_EmailAddress' => 'Endereço de e-mail', 'ex_Username' => 'Nome completo do usuário', 'ex_RoutingSettings' => 'Configurações de roteamento', 'ex_GeneralSettings' => 'Parâmetros-chave', @@ -876,13 +876,13 @@ 'November' => 'Novembro', 'October' => 'Outubro', 'September' => 'Setembro', - 'August' => 'Agosto', + 'August' => 'agosto', 'July' => 'Julho', 'June' => 'Junho', 'May' => 'Maio', 'April' => 'Abril', 'March' => 'Março', - 'February' => 'Fevereiro', + 'February' => 'fevereiro', 'gs_WebAdminLanguage' => 'Linguagem da interface da Web', 'lang_HelpWithTranslateIt' => 'Ajuda com a tradução do MikoPBX', 'topMenu_Support' => 'Suporte', @@ -1109,7 +1109,7 @@ 'mo_SystemExten_hangup' => 'Terminar chamada', 'mo_SystemExten_busy' => 'Reproduzir sinal de ocupado', 'mo_SystemExten_did2user' => 'Direto ao funcionário (correspondência por DID)', - 'pr_FromUser_v2' => 'do utilizador', + 'pr_FromUser_v2' => 'Usuário', 'pr_FromDomain_v2' => 'domínio', 'mo_SystemExten_voicemail' => 'Correio de voz', 'f2b_Jail_asterisk_v2' => 'Erros de autorização SIP', From 332526e8791b97677a0e28da13472e50fb712257 Mon Sep 17 00:00:00 2001 From: boffart <> Date: Wed, 10 Jul 2024 17:08:50 +0300 Subject: [PATCH 04/13] =?UTF-8?q?#767=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=B2=20=D1=81=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D0=B0=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=20=D1=81=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../general-settings-modify.js | 48 ++++++++++++++++++- .../general-settings-modify.js | 35 ++++++++++++++ src/Common/Messages/ru.php | 2 + 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/sites/admin-cabinet/assets/js/pbx/GeneralSettings/general-settings-modify.js b/sites/admin-cabinet/assets/js/pbx/GeneralSettings/general-settings-modify.js index ee35cce5d..fbb8aa32d 100644 --- a/sites/admin-cabinet/assets/js/pbx/GeneralSettings/general-settings-modify.js +++ b/sites/admin-cabinet/assets/js/pbx/GeneralSettings/general-settings-modify.js @@ -356,8 +356,11 @@ var generalSettingsModify = { * @param {Object} response - The response from the server after the form is sent */ cbAfterSendForm: function cbAfterSendForm(response) { + $("#error-messages").remove(); + if (!response.success) { Form.$submitButton.removeClass('disabled'); + generalSettingsModify.generateErrorMessageHtml(response); } else { $('.password-validate').remove(); } @@ -365,6 +368,49 @@ var generalSettingsModify = { generalSettingsModify.checkDeleteAllConditions(); }, + /** + * The function collects an information message about a data saving error + * @param response + * @returns {string} + */ + generateErrorMessageHtml: function generateErrorMessageHtml(response) { + if (response.messages && response.messages.error) { + var $div = $('
', { + "class": 'ui negative message', + id: 'error-messages' + }); + var $header = $('
', { + "class": 'header' + }).text(globalTranslate.gs_ErrorSaveSettings); + $div.append($header); + var $ul = $('
    ', { + "class": 'list' + }); + var messagesSet = new Set(); + response.messages.error.forEach(function (errorArray) { + errorArray.forEach(function (error) { + var textContent = ''; + + if (globalTranslate[error.message] === undefined) { + textContent = error.message; + } else { + textContent = globalTranslate[error.message]; + } + + if (messagesSet.has(textContent)) { + return; + } + + messagesSet.add(error.message); + $ul.append($('
  • ').text(textContent)); + }); + }); + $div.append($ul); + $('#submitbutton').before($div); + return $div; + } + }, + /** * Initialize the validation rules of the form */ @@ -406,4 +452,4 @@ var generalSettingsModify = { $(document).ready(function () { generalSettingsModify.initialize(); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9HZW5lcmFsU2V0dGluZ3MvZ2VuZXJhbC1zZXR0aW5ncy1tb2RpZnkuanMiXSwibmFtZXMiOlsiZ2VuZXJhbFNldHRpbmdzTW9kaWZ5IiwiJGZvcm1PYmoiLCIkIiwiJHdlYkFkbWluUGFzc3dvcmQiLCIkc3NoUGFzc3dvcmQiLCIkZGlzYWJsZVNTSFBhc3N3b3JkIiwicGFyZW50IiwiJHNzaFBhc3N3b3JkU2VnbWVudCIsImhpZGRlblBhc3N3b3JkIiwiJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyIiwic2F2ZVJlY29yZHNQZXJpb2QiLCJ2YWxpZGF0ZVJ1bGVzIiwicGJ4bmFtZSIsImlkZW50aWZpZXIiLCJydWxlcyIsInR5cGUiLCJwcm9tcHQiLCJnbG9iYWxUcmFuc2xhdGUiLCJnc19WYWxpZGF0ZUVtcHR5UEJYTmFtZSIsIldlYkFkbWluUGFzc3dvcmQiLCJXZWJBZG1pblBhc3N3b3JkUmVwZWF0IiwiZ3NfVmFsaWRhdGVXZWJQYXNzd29yZHNGaWVsZERpZmZlcmVudCIsIlNTSFBhc3N3b3JkIiwiU1NIUGFzc3dvcmRSZXBlYXQiLCJnc19WYWxpZGF0ZVNTSFBhc3N3b3Jkc0ZpZWxkRGlmZmVyZW50IiwiV0VCUG9ydCIsImdzX1ZhbGlkYXRlV0VCUG9ydE91dE9mUmFuZ2UiLCJnc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9XRUJQb3J0IiwiZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0IiwiZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1UTFNQb3J0IiwiV0VCSFRUUFNQb3J0IiwiZ3NfVmFsaWRhdGVXRUJIVFRQU1BvcnRPdXRPZlJhbmdlIiwiZ3NfVmFsaWRhdGVXRUJIVFRQU1BvcnROb3RFcXVhbFRvQWphbVBvcnQiLCJnc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9BamFtVExTUG9ydCIsIkFKQU1Qb3J0IiwiZ3NfVmFsaWRhdGVBSkFNUG9ydE91dE9mUmFuZ2UiLCJ3ZWJBZG1pblBhc3N3b3JkUnVsZXMiLCJnc19WYWxpZGF0ZUVtcHR5V2ViUGFzc3dvcmQiLCJnc19WYWxpZGF0ZVdlYWtXZWJQYXNzd29yZCIsInZhbHVlIiwiZ3NfUGFzc3dvcmRzIiwiZ3NfUGFzc3dvcmROb0xvd1NpbXZvbCIsImdzX1Bhc3N3b3JkTm9OdW1iZXJzIiwiZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sIiwiYWRkaXRpb25hbFNzaFZhbGlkUnVsZXNQYXNzIiwiZ3NfVmFsaWRhdGVFbXB0eVNTSFBhc3N3b3JkIiwiZ3NfVmFsaWRhdGVXZWFrU1NIUGFzc3dvcmQiLCJnc19TU0hQYXNzd29yZCIsImFkZGl0aW9uYWxTc2hWYWxpZFJ1bGVzTm9QYXNzIiwiaW5pdGlhbGl6ZSIsIm9uIiwidmFsIiwiaW5pdFJ1bGVzIiwiUGFzc3dvcmRTY29yZSIsImNoZWNrUGFzc1N0cmVuZ3RoIiwicGFzcyIsImJhciIsInNlY3Rpb24iLCJmaW5kIiwidGFiIiwiaGlzdG9yeSIsImhpc3RvcnlUeXBlIiwiZHJvcGRvd24iLCJjaGVja2JveCIsInRhYmxlRG5EIiwib25Ecm9wIiwiRm9ybSIsImRhdGFDaGFuZ2VkIiwib25EcmFnQ2xhc3MiLCJkcmFnSGFuZGxlIiwiU291bmRGaWxlc1NlbGVjdG9yIiwiZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhFbXB0eSIsInNsaWRlciIsIm1pbiIsIm1heCIsInN0ZXAiLCJzbW9vdGgiLCJpbnRlcnByZXRMYWJlbCIsImxhYmVscyIsImdzX1N0b3JlMU1vbnRoT2ZSZWNvcmRzIiwiZ3NfU3RvcmUzTW9udGhzT2ZSZWNvcmRzIiwiZ3NfU3RvcmU2TW9udGhzT2ZSZWNvcmRzIiwiZ3NfU3RvcmUxWWVhck9mUmVjb3JkcyIsImdzX1N0b3JlM1llYXJzT2ZSZWNvcmRzIiwiZ3NfU3RvcmVBbGxQb3NzaWJsZVJlY29yZHMiLCJvbkNoYW5nZSIsImNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyIiwiaW5pdGlhbGl6ZUZvcm0iLCJzaG93SGlkZVNTSFBhc3N3b3JkIiwicmVjb3JkU2F2ZVBlcmlvZCIsImZvcm0iLCJpbmRleE9mIiwid2luZG93IiwiZXZlbnQiLCJuYW1lVGFiIiwiaGlkZSIsInNob3ciLCJjaGVja0RlbGV0ZUFsbENvbmRpdGlvbnMiLCJkZWxldGVBbGxJbnB1dCIsImdzX0VudGVyRGVsZXRlQWxsUGhyYXNlIiwiUGJ4QXBpIiwiU3lzdGVtUmVzdG9yZURlZmF1bHRTZXR0aW5ncyIsImNiQWZ0ZXJSZXN0b3JlRGVmYXVsdFNldHRpbmdzIiwicmVzcG9uc2UiLCJVc2VyTWVzc2FnZSIsInNob3dJbmZvcm1hdGlvbiIsImdzX0FsbFNldHRpbmdzRGVsZXRlZCIsInNob3dNdWx0aVN0cmluZyIsInNhdmVQZXJpb2QiLCJjYkJlZm9yZVNlbmRGb3JtIiwic2V0dGluZ3MiLCJyZXN1bHQiLCJkYXRhIiwiYXJyQ29kZWNzIiwiZWFjaCIsImluZGV4Iiwib2JqIiwiYXR0ciIsInB1c2giLCJjb2RlY0lkIiwiZGlzYWJsZWQiLCJwcmlvcml0eSIsImNvZGVjcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYkFmdGVyU2VuZEZvcm0iLCJzdWNjZXNzIiwiJHN1Ym1pdEJ1dHRvbiIsInJlbW92ZUNsYXNzIiwicmVtb3ZlIiwidXJsIiwiZ2xvYmFsUm9vdFVybCIsImRvY3VtZW50IiwicmVhZHkiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQSxxQkFBcUIsR0FBRztBQUMxQjtBQUNKO0FBQ0E7QUFDQTtBQUNJQyxFQUFBQSxRQUFRLEVBQUVDLENBQUMsQ0FBQyx3QkFBRCxDQUxlOztBQU8xQjtBQUNKO0FBQ0E7QUFDQTtBQUNJQyxFQUFBQSxpQkFBaUIsRUFBRUQsQ0FBQyxDQUFDLG1CQUFELENBWE07O0FBYTFCO0FBQ0o7QUFDQTtBQUNBO0FBQ0lFLEVBQUFBLFlBQVksRUFBRUYsQ0FBQyxD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RkQsTUFFTztBQUNIb0QsTUFBQUEsSUFBSSxDQUFDdkQsYUFBTCxDQUFtQlEsZ0JBQW5CLENBQW9DTCxLQUFwQyxHQUE0Q2QscUJBQXFCLENBQUNvQyxxQkFBbEU7QUFDSDtBQUNKLEdBdmF5Qjs7QUF5YTFCO0FBQ0o7QUFDQTtBQUNJbUQsRUFBQUEsY0E1YTBCLDRCQTRhVDtBQUNickIsSUFBQUEsSUFBSSxDQUFDakUsUUFBTCxHQUFnQkQscUJBQXFCLENBQUNDLFFBQXRDO0FBQ0FpRSxJQUFBQSxJQUFJLENBQUNnRSxHQUFMLGFBQWNDLGFBQWQsMkJBRmEsQ0FFdUM7O0FBQ3BEakUsSUFBQUEsSUFBSSxDQUFDdkQsYUFBTCxHQUFxQlgscUJBQXFCLENBQUNXLGFBQTNDLENBSGEsQ0FHNkM7O0FBQzFEdUQsSUFBQUEsSUFBSSxDQUFDMkMsZ0JBQUwsR0FBd0I3RyxxQkFBcUIsQ0FBQzZHLGdCQUE5QyxDQUphLENBSW1EOztBQUNoRTNDLElBQUFBLElBQUksQ0FBQzJELGVBQUwsR0FBdUI3SCxxQkFBcUIsQ0FBQzZILGVBQTdDLENBTGEsQ0FLaUQ7O0FBQzlEM0QsSUFBQUEsSUFBSSxDQUFDakIsVUFBTDtBQUNIO0FBbmJ5QixDQUE5QixDLENBc2JBOztBQUNBL0MsQ0FBQyxDQUFDa0ksUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBTTtBQUNwQnJJLEVBQUFBLHFCQUFxQixDQUFDaUQsVUFBdEI7QUFDSCxDQUZEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pa29QQlggLSBmcmVlIHBob25lIHN5c3RlbSBmb3Igc21hbGwgYnVzaW5lc3NcbiAqIENvcHlyaWdodCDCqSAyMDE3LTIwMjMgQWxleGV5IFBvcnRub3YgYW5kIE5pa29sYXkgQmVrZXRvdlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS5cbiAqIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuXG4vKiBnbG9iYWwgZ2xvYmFsUm9vdFVybCxnbG9iYWxUcmFuc2xhdGUsIEZvcm0sIFBhc3N3b3JkU2NvcmUsIFBieEFwaSwgVXNlck1lc3NhZ2UsIFNvdW5kRmlsZXNTZWxlY3RvciwgJCAqL1xuXG4vKipcbiAqIEEgbW9kdWxlIHRvIGhhbmRsZSBtb2RpZmljYXRpb24gb2YgZ2VuZXJhbCBzZXR0aW5ncy5cbiAqL1xuY29uc3QgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5ID0ge1xuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBmb3JtLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJGZvcm1PYmo6ICQoJyNnZW5lcmFsLXNldHRpbmdzLWZvcm0nKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSB3ZWIgYWRtaW4gcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkd2ViQWRtaW5QYXNzd29yZDogJCgnI1dlYkFkbWluUGFzc3dvcmQnKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBzc2ggcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc3NoUGFzc3dvcmQ6ICQoJyNTU0hQYXNzd29yZCcpLFxuXG4gICAgLyoqXG4gICAgICogalF1ZXJ5IG9iamVjdCBmb3IgdGhlIHdlYiBzc2ggcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkZGlzYWJsZVNTSFBhc3N3b3JkOiAkKCcjU1NIRGlzYWJsZVBhc3N3b3JkTG9naW5zJykucGFyZW50KCcuY2hlY2tib3gnKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBTU0ggcGFzc3dvcmQgZmllbGRzXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc3NoUGFzc3dvcmRTZWdtZW50OiAkKCcjb25seS1pZi1wYXNzd29yZC1lbmFibGVkJyksXG5cbiAgICAvKipcbiAgICAgKiBJZiBwYXNzd29yZCBzZXQsIGl0IHdpbGwgYmUgaGlkZWQgZnJvbSB3ZWIgdWkuXG4gICAgICovXG4gICAgaGlkZGVuUGFzc3dvcmQ6ICd4eHh4eHh4JyxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSByZWNvcmRzIHJldGVudGlvbiBwZXJpb2Qgc2xpZGVyLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyOiAkKCcjUEJYUmVjb3JkU2F2ZVBlcmlvZFNsaWRlcicpLFxuXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgcGVyaW9kIHZhbHVlcyBmb3IgdGhlIHJlY29yZHMgcmV0ZW50aW9uLlxuICAgICAqL1xuICAgIHNhdmVSZWNvcmRzUGVyaW9kOiBbJzMwJywgJzkwJywgJzE4MCcsICczNjAnLCAnMTA4MCcsICcnXSxcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmb3JtIGZpZWxkcyBiZWZvcmUgc3VibWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdmFsaWRhdGVSdWxlczogeyAvLyBnZW5lcmFsU2V0dGluZ3NNb2RpZnkudmFsaWRhdGVSdWxlcy5TU0hQYXNzd29yZC5ydWxlc1xuICAgICAgICBwYnhuYW1lOiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnUEJYTmFtZScsXG4gICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVFbXB0eVBCWE5hbWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFdlYkFkbWluUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdXZWJBZG1pblBhc3N3b3JkJyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgV2ViQWRtaW5QYXNzd29yZFJlcGVhdDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1dlYkFkbWluUGFzc3dvcmRSZXBlYXQnLFxuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYXRjaFtXZWJBZG1pblBhc3N3b3JkXScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV2ViUGFzc3dvcmRzRmllbGREaWZmZXJlbnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFNTSFBhc3N3b3JkOiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnU1NIUGFzc3dvcmQnLFxuICAgICAgICAgICAgcnVsZXM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICBTU0hQYXNzd29yZFJlcGVhdDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1NTSFBhc3N3b3JkUmVwZWF0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWF0Y2hbU1NIUGFzc3dvcmRdJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVTU0hQYXNzd29yZHNGaWVsZERpZmZlcmVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgV0VCUG9ydDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1dFQlBvcnQnLFxuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyWzEuLjY1NTM1XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCUG9ydE91dE9mUmFuZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbV0VCSFRUUFNQb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb1dFQlBvcnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbQUpBTVBvcnRUTFNdJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCUG9ydE5vdEVxdWFsVG9BamFtVExTUG9ydCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgV0VCSFRUUFNQb3J0OiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnV0VCSFRUUFNQb3J0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZWdlclsxLi42NTUzNV0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE91dE9mUmFuZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbV0VCUG9ydF0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9XRUJQb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0VExTXScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb0FqYW1UTFNQb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBBSkFNUG9ydDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ0FKQU1Qb3J0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZWdlclsxLi42NTUzNV0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZUFKQU1Qb3J0T3V0T2ZSYW5nZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RpZmZlcmVudFtBSkFNUG9ydFRMU10nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZUFKQU1Qb3J0T3V0T2ZSYW5nZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gUnVsZXMgZm9yIHRoZSB3ZWIgYWRtaW4gcGFzc3dvcmQgZmllbGQgd2hlbiBpdCBub3QgZXF1YWwgdG8gaGlkZGVuUGFzc3dvcmRcbiAgICB3ZWJBZG1pblBhc3N3b3JkUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlRW1wdHlXZWJQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ21pbkxlbmd0aFs1XScsXG4gICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdlYWtXZWJQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1thLXpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb0xvd1NpbXZvbFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbm90UmVnRXhwJyxcbiAgICAgICAgICAgIHZhbHVlOiAvXFxkLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb051bWJlcnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1tBLVpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sXG4gICAgICAgIH1cbiAgICBdLFxuICAgIC8vIFJ1bGVzIGZvciB0aGUgU1NIIHBhc3N3b3JkIGZpZWxkIHdoZW4gU1NIIGxvZ2luIHRocm91Z2ggdGhlIHBhc3N3b3JkIGVuYWJsZWQsIGFuZCBpdCBub3QgZXF1YWwgdG8gaGlkZGVuUGFzc3dvcmRcbiAgICBhZGRpdGlvbmFsU3NoVmFsaWRSdWxlc1Bhc3M6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlRW1wdHlTU0hQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ21pbkxlbmd0aFs1XScsXG4gICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdlYWtTU0hQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1thLXpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfU1NIUGFzc3dvcmQgKyAnPC9iPjogJyArIGdsb2JhbFRyYW5zbGF0ZS5nc19QYXNzd29yZE5vTG93U2ltdm9sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RSZWdFeHAnLFxuICAgICAgICAgICAgdmFsdWU6IC9cXGQvLFxuICAgICAgICAgICAgcHJvbXB0OiAnPGI+JyArIGdsb2JhbFRyYW5zbGF0ZS5nc19TU0hQYXNzd29yZCArICc8L2I+OiAnICsgZ2xvYmFsVHJhbnNsYXRlLmdzX1Bhc3N3b3JkTm9OdW1iZXJzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RSZWdFeHAnLFxuICAgICAgICAgICAgdmFsdWU6IC9bQS1aXS8sXG4gICAgICAgICAgICBwcm9tcHQ6ICc8Yj4nICsgZ2xvYmFsVHJhbnNsYXRlLmdzX1NTSFBhc3N3b3JkICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sXG4gICAgICAgIH1cbiAgICBdLFxuXG4gICAgLy8gUnVsZXMgZm9yIHRoZSBTU0ggcGFzc3dvcmQgZmllbGQgd2hlbiBTU0ggbG9naW4gdGhyb3VnaCB0aGUgcGFzc3dvcmQgZGlzYWJsZWRcbiAgICBhZGRpdGlvbmFsU3NoVmFsaWRSdWxlc05vUGFzczogW1xuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnZW1wdHknLFxuICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVFbXB0eVNTSFBhc3N3b3JkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbWluTGVuZ3RoWzVdJyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV2Vha1NTSFBhc3N3b3JkLFxuICAgICAgICB9XG4gICAgXSxcblxuICAgIC8qKlxuICAgICAqICBJbml0aWFsaXplIG1vZHVsZSB3aXRoIGV2ZW50IGJpbmRpbmdzIGFuZCBjb21wb25lbnQgaW5pdGlhbGl6YXRpb25zLlxuICAgICAqL1xuICAgIGluaXRpYWxpemUoKSB7XG5cbiAgICAgICAgLy8gV2hlbiBXZWJBZG1pblBhc3N3b3JkIGlucHV0IGlzIGNoYW5nZWQsIHJlY2FsY3VsYXRlIHRoZSBwYXNzd29yZCBzdHJlbmd0aFxuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHdlYkFkbWluUGFzc3dvcmQub24oJ2tleXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kd2ViQWRtaW5QYXNzd29yZC52YWwoKSAhPT0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmhpZGRlblBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuICAgICAgICAgICAgICAgIFBhc3N3b3JkU2NvcmUuY2hlY2tQYXNzU3RyZW5ndGgoe1xuICAgICAgICAgICAgICAgICAgICBwYXNzOiBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHdlYkFkbWluUGFzc3dvcmQudmFsKCksXG4gICAgICAgICAgICAgICAgICAgIGJhcjogJCgnLnBhc3N3b3JkLXNjb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246ICQoJy5wYXNzd29yZC1zY29yZS1zZWN0aW9uJyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdoZW4gU1NIUGFzc3dvcmQgaW5wdXQgaXMgY2hhbmdlZCwgcmVjYWxjdWxhdGUgdGhlIHBhc3N3b3JkIHN0cmVuZ3RoXG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQub24oJ2tleXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQudmFsKCkgIT09IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5oaWRkZW5QYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5pbml0UnVsZXMoKTtcbiAgICAgICAgICAgICAgICBQYXNzd29yZFNjb3JlLmNoZWNrUGFzc1N0cmVuZ3RoKHtcbiAgICAgICAgICAgICAgICAgICAgcGFzczogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRzc2hQYXNzd29yZC52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgYmFyOiAkKCcuc3NoLXBhc3N3b3JkLXNjb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246ICQoJy5zc2gtcGFzc3dvcmQtc2NvcmUtc2VjdGlvbicpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGUgdGFiIG5hdmlnYXRpb24gd2l0aCBoaXN0b3J5IHN1cHBvcnRcbiAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtbWVudScpLmZpbmQoJy5pdGVtJykudGFiKHtcbiAgICAgICAgICAgIGhpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICBoaXN0b3J5VHlwZTogJ2hhc2gnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGUgZHJvcGRvd25zIG9uIHRoZSBmb3JtXG4gICAgICAgICQoJyNnZW5lcmFsLXNldHRpbmdzLWZvcm0gLmRyb3Bkb3duJykuZHJvcGRvd24oKTtcblxuICAgICAgICAvLyBFbmFibGUgY2hlY2tib3hlcyBvbiB0aGUgZm9ybVxuICAgICAgICAkKCcjZ2VuZXJhbC1zZXR0aW5ncy1mb3JtIC5jaGVja2JveCcpLmNoZWNrYm94KCk7XG5cbiAgICAgICAgLy8gRW5hYmxlIHRhYmxlIGRyYWctbi1kcm9wIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgJCgnI2F1ZGlvLWNvZGVjcy10YWJsZSwgI3ZpZGVvLWNvZGVjcy10YWJsZScpLnRhYmxlRG5EKHtcbiAgICAgICAgICAgIG9uRHJvcCgpIHtcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBldmVudCB0byBhY2tub3dsZWRnZSB0aGUgbW9kaWZpY2F0aW9uXG4gICAgICAgICAgICAgICAgRm9ybS5kYXRhQ2hhbmdlZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRHJhZ0NsYXNzOiAnaG92ZXJpbmdSb3cnLFxuICAgICAgICAgICAgZHJhZ0hhbmRsZTogJy5kcmFnSGFuZGxlJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5hYmxlIGRyb3Bkb3duIHdpdGggc291bmQgZmlsZSBzZWxlY3Rpb25cbiAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtZm9ybSAuYXVkaW8tbWVzc2FnZS1zZWxlY3QnKS5kcm9wZG93bihTb3VuZEZpbGVzU2VsZWN0b3IuZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhFbXB0eSgpKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHJlY29yZHMgc2F2ZSBwZXJpb2Qgc2xpZGVyXG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kcmVjb3Jkc1NhdmVQZXJpb2RTbGlkZXJcbiAgICAgICAgICAgIC5zbGlkZXIoe1xuICAgICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgICBtYXg6IDUsXG4gICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICBzbW9vdGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaW50ZXJwcmV0TGFiZWw6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVHJhbnNsYXRlLmdzX1N0b3JlMU1vbnRoT2ZSZWNvcmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVHJhbnNsYXRlLmdzX1N0b3JlM01vbnRoc09mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZTZNb250aHNPZlJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUcmFuc2xhdGUuZ3NfU3RvcmUxWWVhck9mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZTNZZWFyc09mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZUFsbFBvc3NpYmxlUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsc1t2YWx1ZV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZvcm1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRpYWxpemVGb3JtKCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gcnVsZXNcbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuXG4gICAgICAgIC8vIFNob3csIGhpZGUgc3NoIHBhc3N3b3JkIHNlZ21lbnRcbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRkaXNhYmxlU1NIUGFzc3dvcmQuY2hlY2tib3goe1xuICAgICAgICAgICAgJ29uQ2hhbmdlJzogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LnNob3dIaWRlU1NIUGFzc3dvcmRcbiAgICAgICAgfSk7XG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5zaG93SGlkZVNTSFBhc3N3b3JkKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgcmVjb3JkcyBzYXZlIHBlcmlvZCBzbGlkZXJcbiAgICAgICAgY29uc3QgcmVjb3JkU2F2ZVBlcmlvZCA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWUnLCAnUEJYUmVjb3JkU2F2ZVBlcmlvZCcpO1xuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyXG4gICAgICAgICAgICAuc2xpZGVyKCdzZXQgdmFsdWUnLCBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuc2F2ZVJlY29yZHNQZXJpb2QuaW5kZXhPZihyZWNvcmRTYXZlUGVyaW9kKSwgZmFsc2UpO1xuXG4gICAgICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lciB0byBoYW5kbGUgdGFiIGFjdGl2YXRpb25cbiAgICAgICAgJCh3aW5kb3cpLm9uKCdHUy1BY3RpdmF0ZVRhYicsIChldmVudCwgbmFtZVRhYikgPT4ge1xuICAgICAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtbWVudScpLmZpbmQoJy5pdGVtJykudGFiKCdjaGFuZ2UgdGFiJywgbmFtZVRhYik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTaG93LCBoaWRlIHNzaCBwYXNzd29yZCBzZWdtZW50IGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgdXNlIFNTSCBwYXNzd29yZCBjaGVja2JveC5cbiAgICAgKi9cbiAgICBzaG93SGlkZVNTSFBhc3N3b3JkKCl7XG4gICAgICAgIGlmIChnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJGRpc2FibGVTU0hQYXNzd29yZC5jaGVja2JveCgnaXMgY2hlY2tlZCcpKSB7XG4gICAgICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkU2VnbWVudC5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkU2VnbWVudC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGNvbmRpdGlvbnMgZm9yIGRlbGV0aW5nIGFsbCByZWNvcmRzLlxuICAgICAqIENvbXBhcmVzIHRoZSB2YWx1ZSBvZiB0aGUgJ2RlbGV0ZUFsbElucHV0JyBmaWVsZCB3aXRoIGEgcGhyYXNlLlxuICAgICAqIElmIHRoZXkgbWF0Y2gsIGl0IHRyaWdnZXJzIGEgc3lzdGVtIHJlc3RvcmUgdG8gZGVmYXVsdCBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjaGVja0RlbGV0ZUFsbENvbmRpdGlvbnMoKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiAnZGVsZXRlQWxsSW5wdXQnIGZpZWxkLlxuICAgICAgICBjb25zdCBkZWxldGVBbGxJbnB1dCA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWUnLCAnZGVsZXRlQWxsSW5wdXQnKTtcblxuICAgICAgICAvLyBJZiB0aGUgZW50ZXJlZCBwaHJhc2UgbWF0Y2hlcyB0aGUgcGhyYXNlIGluICdnbG9iYWxUcmFuc2xhdGUuZ3NfRW50ZXJEZWxldGVBbGxQaHJhc2UnLFxuICAgICAgICAvLyBjYWxsICdQYnhBcGkuU3lzdGVtUmVzdG9yZURlZmF1bHRTZXR0aW5ncycgdG8gcmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzLlxuICAgICAgICBpZiAoZGVsZXRlQWxsSW5wdXQgPT09IGdsb2JhbFRyYW5zbGF0ZS5nc19FbnRlckRlbGV0ZUFsbFBocmFzZSkge1xuICAgICAgICAgICAgUGJ4QXBpLlN5c3RlbVJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJSZXN0b3JlRGVmYXVsdFNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcmVzcG9uc2UgYWZ0ZXIgcmVzdG9yaW5nIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcmVzcG9uc2UgLSBSZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYWZ0ZXIgcmVzdG9yaW5nIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICovXG4gICAgY2JBZnRlclJlc3RvcmVEZWZhdWx0U2V0dGluZ3MocmVzcG9uc2UpIHtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2UgaXMgdHJ1ZSwgZGlzcGxheSBhIHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgICAvLyBvdGhlcndpc2UsIGRpc3BsYXkgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd0luZm9ybWF0aW9uKGdsb2JhbFRyYW5zbGF0ZS5nc19BbGxTZXR0aW5nc0RlbGV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd011bHRpU3RyaW5nKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZXZlbnQgYWZ0ZXIgdGhlIHNlbGVjdCBzYXZlIHBlcmlvZCBzbGlkZXIgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgc2VsZWN0ZWQgdmFsdWUgZnJvbSB0aGUgc2xpZGVyLlxuICAgICAqL1xuICAgIGNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyKHZhbHVlKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzYXZlIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzbGlkZXIgdmFsdWUuXG4gICAgICAgIGNvbnN0IHNhdmVQZXJpb2QgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuc2F2ZVJlY29yZHNQZXJpb2RbdmFsdWVdO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZm9ybSB2YWx1ZSBmb3IgJ1BCWFJlY29yZFNhdmVQZXJpb2QnIHRvIHRoZSBzZWxlY3RlZCBzYXZlIHBlcmlvZC5cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqLmZvcm0oJ3NldCB2YWx1ZScsICdQQlhSZWNvcmRTYXZlUGVyaW9kJywgc2F2ZVBlcmlvZCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZXZlbnQgdG8gYWNrbm93bGVkZ2UgdGhlIG1vZGlmaWNhdGlvblxuICAgICAgICBGb3JtLmRhdGFDaGFuZ2VkKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZvcm0gaXMgc2VudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzZXR0aW5ncyAtIFRoZSBjdXJyZW50IHNldHRpbmdzIG9mIHRoZSBmb3JtXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBUaGUgdXBkYXRlZCBzZXR0aW5ncyBvZiB0aGUgZm9ybVxuICAgICAqL1xuICAgIGNiQmVmb3JlU2VuZEZvcm0oc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2V0dGluZ3M7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqLmZvcm0oJ2dldCB2YWx1ZXMnKTtcbiAgICAgICAgY29uc3QgYXJyQ29kZWNzID0gW107XG4gICAgICAgICQoJyNhdWRpby1jb2RlY3MtdGFibGUgLmNvZGVjLXJvdywgI3ZpZGVvLWNvZGVjcy10YWJsZSAuY29kZWMtcm93JykuZWFjaCgoaW5kZXgsIG9iaikgPT4ge1xuICAgICAgICAgICAgaWYgKCQob2JqKS5hdHRyKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgYXJyQ29kZWNzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2RlY0lkOiAkKG9iaikuYXR0cignaWQnKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICQob2JqKS5maW5kKCcuY2hlY2tib3gnKS5jaGVja2JveCgnaXMgdW5jaGVja2VkJyksXG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBpbmRleCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5kYXRhLmNvZGVjcyA9IEpTT04uc3RyaW5naWZ5KGFyckNvZGVjcyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBmb3JtIGhhcyBiZWVuIHNlbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIC0gVGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhZnRlciB0aGUgZm9ybSBpcyBzZW50XG4gICAgICovXG4gICAgY2JBZnRlclNlbmRGb3JtKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgRm9ybS4kc3VibWl0QnV0dG9uLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJCgnLnBhc3N3b3JkLXZhbGlkYXRlJykucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNoZWNrRGVsZXRlQWxsQ29uZGl0aW9ucygpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSB2YWxpZGF0aW9uIHJ1bGVzIG9mIHRoZSBmb3JtXG4gICAgICovXG4gICAgaW5pdFJ1bGVzKCkge1xuICAgICAgICAvLyBTU0hQYXNzd29yZFxuICAgICAgICBpZiAoZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRkaXNhYmxlU1NIUGFzc3dvcmQuY2hlY2tib3goJ2lzIGNoZWNrZWQnKSkge1xuICAgICAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzLlNTSFBhc3N3b3JkLnJ1bGVzID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmFkZGl0aW9uYWxTc2hWYWxpZFJ1bGVzTm9QYXNzO1xuICAgICAgICB9IGVsc2UgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQudmFsKCkgPT09IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5oaWRkZW5QYXNzd29yZCkge1xuICAgICAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzLlNTSFBhc3N3b3JkLnJ1bGVzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBGb3JtLnZhbGlkYXRlUnVsZXMuU1NIUGFzc3dvcmQucnVsZXMgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuYWRkaXRpb25hbFNzaFZhbGlkUnVsZXNQYXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2ViQWRtaW5QYXNzd29yZFxuICAgICAgICBpZiAoZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiR3ZWJBZG1pblBhc3N3b3JkLnZhbCgpID09PSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuaGlkZGVuUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIEZvcm0udmFsaWRhdGVSdWxlcy5XZWJBZG1pblBhc3N3b3JkLnJ1bGVzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBGb3JtLnZhbGlkYXRlUnVsZXMuV2ViQWRtaW5QYXNzd29yZC5ydWxlcyA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS53ZWJBZG1pblBhc3N3b3JkUnVsZXM7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgZm9ybSB3aXRoIGN1c3RvbSBzZXR0aW5nc1xuICAgICAqL1xuICAgIGluaXRpYWxpemVGb3JtKCkge1xuICAgICAgICBGb3JtLiRmb3JtT2JqID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqO1xuICAgICAgICBGb3JtLnVybCA9IGAke2dsb2JhbFJvb3RVcmx9Z2VuZXJhbC1zZXR0aW5ncy9zYXZlYDsgLy8gRm9ybSBzdWJtaXNzaW9uIFVSTFxuICAgICAgICBGb3JtLnZhbGlkYXRlUnVsZXMgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkudmFsaWRhdGVSdWxlczsgLy8gRm9ybSB2YWxpZGF0aW9uIHJ1bGVzXG4gICAgICAgIEZvcm0uY2JCZWZvcmVTZW5kRm9ybSA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5jYkJlZm9yZVNlbmRGb3JtOyAvLyBDYWxsYmFjayBiZWZvcmUgZm9ybSBpcyBzZW50XG4gICAgICAgIEZvcm0uY2JBZnRlclNlbmRGb3JtID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJTZW5kRm9ybTsgLy8gQ2FsbGJhY2sgYWZ0ZXIgZm9ybSBpcyBzZW50XG4gICAgICAgIEZvcm0uaW5pdGlhbGl6ZSgpO1xuICAgIH1cbn07XG5cbi8vIFdoZW4gdGhlIGRvY3VtZW50IGlzIHJlYWR5LCBpbml0aWFsaXplIHRoZSBnZW5lcmFsU2V0dGluZ3MgbWFuYWdlbWVudCBpbnRlcmZhY2UuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG4gICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRpYWxpemUoKTtcbn0pOyJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9HZW5lcmFsU2V0dGluZ3MvZ2VuZXJhbC1zZXR0aW5ncy1tb2RpZnkuanMiXSwibmFtZXMiOlsiZ2VuZXJhbFNldHRpbmdzTW9kaWZ5IiwiJGZvcm1PYmoiLCIkIiwiJHdlYkFkbWluUGFzc3dvcmQiLCIkc3NoUGFzc3dvcmQiLCIkZGlzYWJsZVNTSFBhc3N3b3JkIiwicGFyZW50IiwiJHNzaFBhc3N3b3JkU2VnbWVudCIsImhpZGRlblBhc3N3b3JkIiwiJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyIiwic2F2ZVJlY29yZHNQZXJpb2QiLCJ2YWxpZGF0ZVJ1bGVzIiwicGJ4bmFtZSIsImlkZW50aWZpZXIiLCJydWxlcyIsInR5cGUiLCJwcm9tcHQiLCJnbG9iYWxUcmFuc2xhdGUiLCJnc19WYWxpZGF0ZUVtcHR5UEJYTmFtZSIsIldlYkFkbWluUGFzc3dvcmQiLCJXZWJBZG1pblBhc3N3b3JkUmVwZWF0IiwiZ3NfVmFsaWRhdGVXZWJQYXNzd29yZHNGaWVsZERpZmZlcmVudCIsIlNTSFBhc3N3b3JkIiwiU1NIUGFzc3dvcmRSZXBlYXQiLCJnc19WYWxpZGF0ZVNTSFBhc3N3b3Jkc0ZpZWxkRGlmZmVyZW50IiwiV0VCUG9ydCIsImdzX1ZhbGlkYXRlV0VCUG9ydE91dE9mUmFuZ2UiLCJnc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9XRUJQb3J0IiwiZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0IiwiZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1UTFNQb3J0IiwiV0VCSFRUUFNQb3J0IiwiZ3NfVmFsaWRhdGVXRUJIVFRQU1BvcnRPdXRPZlJhbmdlIiwiZ3NfVmFsaWRhdGVXRUJIVFRQU1BvcnROb3RFcXVhbFRvQWphbVBvcnQiLCJnc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9BamFtVExTUG9ydCIsIkFKQU1Qb3J0IiwiZ3NfVmFsaWRhdGVBSkFNUG9ydE91dE9mUmFuZ2UiLCJ3ZWJBZG1pblBhc3N3b3JkUnVsZXMiLCJnc19WYWxpZGF0ZUVtcHR5V2ViUGFzc3dvcmQiLCJnc19WYWxpZGF0ZVdlYWtXZWJQYXNzd29yZCIsInZhbHVlIiwiZ3NfUGFzc3dvcmRzIiwiZ3NfUGFzc3dvcmROb0xvd1NpbXZvbCIsImdzX1Bhc3N3b3JkTm9OdW1iZXJzIiwiZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sIiwiYWRkaXRpb25hbFNzaFZhbGlkUnVsZXNQYXNzIiwiZ3NfVmFsaWRhdGVFbXB0eVNTSFBhc3N3b3JkIiwiZ3NfVmFsaWRhdGVXZWFrU1NIUGFzc3dvcmQiLCJnc19TU0hQYXNzd29yZCIsImFkZGl0aW9uYWxTc2hWYWxpZFJ1bGVzTm9QYXNzIiwiaW5pdGlhbGl6ZSIsIm9uIiwidmFsIiwiaW5pdFJ1bGVzIiwiUGFzc3dvcmRTY29yZSIsImNoZWNrUGFzc1N0cmVuZ3RoIiwicGFzcyIsImJhciIsInNlY3Rpb24iLCJmaW5kIiwidGFiIiwiaGlzdG9yeSIsImhpc3RvcnlUeXBlIiwiZHJvcGRvd24iLCJjaGVja2JveCIsInRhYmxlRG5EIiwib25Ecm9wIiwiRm9ybSIsImRhdGFDaGFuZ2VkIiwib25EcmFnQ2xhc3MiLCJkcmFnSGFuZGxlIiwiU291bmRGaWxlc1NlbGVjdG9yIiwiZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhFbXB0eSIsInNsaWRlciIsIm1pbiIsIm1heCIsInN0ZXAiLCJzbW9vdGgiLCJpbnRlcnByZXRMYWJlbCIsImxhYmVscyIsImdzX1N0b3JlMU1vbnRoT2ZSZWNvcmRzIiwiZ3NfU3RvcmUzTW9udGhzT2ZSZWNvcmRzIiwiZ3NfU3RvcmU2TW9udGhzT2ZSZWNvcmRzIiwiZ3NfU3RvcmUxWWVhck9mUmVjb3JkcyIsImdzX1N0b3JlM1llYXJzT2ZSZWNvcmRzIiwiZ3NfU3RvcmVBbGxQb3NzaWJsZVJlY29yZHMiLCJvbkNoYW5nZSIsImNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyIiwiaW5pdGlhbGl6ZUZvcm0iLCJzaG93SGlkZVNTSFBhc3N3b3JkIiwicmVjb3JkU2F2ZVBlcmlvZCIsImZvcm0iLCJpbmRleE9mIiwid2luZG93IiwiZXZlbnQiLCJuYW1lVGFiIiwiaGlkZSIsInNob3ciLCJjaGVja0RlbGV0ZUFsbENvbmRpdGlvbnMiLCJkZWxldGVBbGxJbnB1dCIsImdzX0VudGVyRGVsZXRlQWxsUGhyYXNlIiwiUGJ4QXBpIiwiU3lzdGVtUmVzdG9yZURlZmF1bHRTZXR0aW5ncyIsImNiQWZ0ZXJSZXN0b3JlRGVmYXVsdFNldHRpbmdzIiwicmVzcG9uc2UiLCJVc2VyTWVzc2FnZSIsInNob3dJbmZvcm1hdGlvbiIsImdzX0FsbFNldHRpbmdzRGVsZXRlZCIsInNob3dNdWx0aVN0cmluZyIsInNhdmVQZXJpb2QiLCJjYkJlZm9yZVNlbmRGb3JtIiwic2V0dGluZ3MiLCJyZXN1bHQiLCJkYXRhIiwiYXJyQ29kZWNzIiwiZWFjaCIsImluZGV4Iiwib2JqIiwiYXR0ciIsInB1c2giLCJjb2RlY0lkIiwiZGlzYWJsZWQiLCJwcmlvcml0eSIsImNvZGVjcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYkFmdGVyU2VuZEZvcm0iLCJyZW1vdmUiLCJzdWNjZXNzIiwiJHN1Ym1pdEJ1dHRvbiIsInJlbW92ZUNsYXNzIiwiZ2VuZXJhdGVFcnJvck1lc3NhZ2VIdG1sIiwibWVzc2FnZXMiLCJlcnJvciIsIiRkaXYiLCJpZCIsIiRoZWFkZXIiLCJ0ZXh0IiwiZ3NfRXJyb3JTYXZlU2V0dGluZ3MiLCJhcHBlbmQiLCIkdWwiLCJtZXNzYWdlc1NldCIsIlNldCIsImZvckVhY2giLCJlcnJvckFycmF5IiwidGV4dENvbnRlbnQiLCJtZXNzYWdlIiwidW5kZWZpbmVkIiwiaGFzIiwiYWRkIiwiYmVmb3JlIiwidXJsIiwiZ2xvYmFsUm9vdFVybCIsImRvY3VtZW50IiwicmVhZHkiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTs7QUFFQTtBQUNB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dkQsYUFBTCxHQUFxQlgscUJBQXFCLENBQUNXLGFBQTNDLENBSGEsQ0FHNkM7O0FBQzFEdUQsSUFBQUEsSUFBSSxDQUFDMkMsZ0JBQUwsR0FBd0I3RyxxQkFBcUIsQ0FBQzZHLGdCQUE5QyxDQUphLENBSW1EOztBQUNoRTNDLElBQUFBLElBQUksQ0FBQzJELGVBQUwsR0FBdUI3SCxxQkFBcUIsQ0FBQzZILGVBQTdDLENBTGEsQ0FLaUQ7O0FBQzlEM0QsSUFBQUEsSUFBSSxDQUFDakIsVUFBTDtBQUNIO0FBdGR5QixDQUE5QixDLENBeWRBOztBQUNBL0MsQ0FBQyxDQUFDc0osUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBTTtBQUNwQnpKLEVBQUFBLHFCQUFxQixDQUFDaUQsVUFBdEI7QUFDSCxDQUZEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pa29QQlggLSBmcmVlIHBob25lIHN5c3RlbSBmb3Igc21hbGwgYnVzaW5lc3NcbiAqIENvcHlyaWdodCDCqSAyMDE3LTIwMjMgQWxleGV5IFBvcnRub3YgYW5kIE5pa29sYXkgQmVrZXRvdlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS5cbiAqIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuXG4vKiBnbG9iYWwgZ2xvYmFsUm9vdFVybCxnbG9iYWxUcmFuc2xhdGUsIEZvcm0sIFBhc3N3b3JkU2NvcmUsIFBieEFwaSwgVXNlck1lc3NhZ2UsIFNvdW5kRmlsZXNTZWxlY3RvciwgJCAqL1xuXG4vKipcbiAqIEEgbW9kdWxlIHRvIGhhbmRsZSBtb2RpZmljYXRpb24gb2YgZ2VuZXJhbCBzZXR0aW5ncy5cbiAqL1xuY29uc3QgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5ID0ge1xuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBmb3JtLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJGZvcm1PYmo6ICQoJyNnZW5lcmFsLXNldHRpbmdzLWZvcm0nKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSB3ZWIgYWRtaW4gcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkd2ViQWRtaW5QYXNzd29yZDogJCgnI1dlYkFkbWluUGFzc3dvcmQnKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBzc2ggcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc3NoUGFzc3dvcmQ6ICQoJyNTU0hQYXNzd29yZCcpLFxuXG4gICAgLyoqXG4gICAgICogalF1ZXJ5IG9iamVjdCBmb3IgdGhlIHdlYiBzc2ggcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkZGlzYWJsZVNTSFBhc3N3b3JkOiAkKCcjU1NIRGlzYWJsZVBhc3N3b3JkTG9naW5zJykucGFyZW50KCcuY2hlY2tib3gnKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBTU0ggcGFzc3dvcmQgZmllbGRzXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc3NoUGFzc3dvcmRTZWdtZW50OiAkKCcjb25seS1pZi1wYXNzd29yZC1lbmFibGVkJyksXG5cbiAgICAvKipcbiAgICAgKiBJZiBwYXNzd29yZCBzZXQsIGl0IHdpbGwgYmUgaGlkZWQgZnJvbSB3ZWIgdWkuXG4gICAgICovXG4gICAgaGlkZGVuUGFzc3dvcmQ6ICd4eHh4eHh4JyxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSByZWNvcmRzIHJldGVudGlvbiBwZXJpb2Qgc2xpZGVyLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyOiAkKCcjUEJYUmVjb3JkU2F2ZVBlcmlvZFNsaWRlcicpLFxuXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgcGVyaW9kIHZhbHVlcyBmb3IgdGhlIHJlY29yZHMgcmV0ZW50aW9uLlxuICAgICAqL1xuICAgIHNhdmVSZWNvcmRzUGVyaW9kOiBbJzMwJywgJzkwJywgJzE4MCcsICczNjAnLCAnMTA4MCcsICcnXSxcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmb3JtIGZpZWxkcyBiZWZvcmUgc3VibWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdmFsaWRhdGVSdWxlczogeyAvLyBnZW5lcmFsU2V0dGluZ3NNb2RpZnkudmFsaWRhdGVSdWxlcy5TU0hQYXNzd29yZC5ydWxlc1xuICAgICAgICBwYnhuYW1lOiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnUEJYTmFtZScsXG4gICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVFbXB0eVBCWE5hbWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFdlYkFkbWluUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdXZWJBZG1pblBhc3N3b3JkJyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgV2ViQWRtaW5QYXNzd29yZFJlcGVhdDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1dlYkFkbWluUGFzc3dvcmRSZXBlYXQnLFxuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYXRjaFtXZWJBZG1pblBhc3N3b3JkXScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV2ViUGFzc3dvcmRzRmllbGREaWZmZXJlbnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFNTSFBhc3N3b3JkOiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnU1NIUGFzc3dvcmQnLFxuICAgICAgICAgICAgcnVsZXM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICBTU0hQYXNzd29yZFJlcGVhdDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1NTSFBhc3N3b3JkUmVwZWF0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWF0Y2hbU1NIUGFzc3dvcmRdJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVTU0hQYXNzd29yZHNGaWVsZERpZmZlcmVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgV0VCUG9ydDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1dFQlBvcnQnLFxuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyWzEuLjY1NTM1XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCUG9ydE91dE9mUmFuZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbV0VCSFRUUFNQb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb1dFQlBvcnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbQUpBTVBvcnRUTFNdJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCUG9ydE5vdEVxdWFsVG9BamFtVExTUG9ydCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgV0VCSFRUUFNQb3J0OiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnV0VCSFRUUFNQb3J0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZWdlclsxLi42NTUzNV0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE91dE9mUmFuZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbV0VCUG9ydF0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9XRUJQb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0VExTXScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb0FqYW1UTFNQb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBBSkFNUG9ydDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ0FKQU1Qb3J0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZWdlclsxLi42NTUzNV0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZUFKQU1Qb3J0T3V0T2ZSYW5nZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RpZmZlcmVudFtBSkFNUG9ydFRMU10nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZUFKQU1Qb3J0T3V0T2ZSYW5nZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gUnVsZXMgZm9yIHRoZSB3ZWIgYWRtaW4gcGFzc3dvcmQgZmllbGQgd2hlbiBpdCBub3QgZXF1YWwgdG8gaGlkZGVuUGFzc3dvcmRcbiAgICB3ZWJBZG1pblBhc3N3b3JkUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlRW1wdHlXZWJQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ21pbkxlbmd0aFs1XScsXG4gICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdlYWtXZWJQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1thLXpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb0xvd1NpbXZvbFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbm90UmVnRXhwJyxcbiAgICAgICAgICAgIHZhbHVlOiAvXFxkLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb051bWJlcnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1tBLVpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sXG4gICAgICAgIH1cbiAgICBdLFxuICAgIC8vIFJ1bGVzIGZvciB0aGUgU1NIIHBhc3N3b3JkIGZpZWxkIHdoZW4gU1NIIGxvZ2luIHRocm91Z2ggdGhlIHBhc3N3b3JkIGVuYWJsZWQsIGFuZCBpdCBub3QgZXF1YWwgdG8gaGlkZGVuUGFzc3dvcmRcbiAgICBhZGRpdGlvbmFsU3NoVmFsaWRSdWxlc1Bhc3M6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlRW1wdHlTU0hQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ21pbkxlbmd0aFs1XScsXG4gICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdlYWtTU0hQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1thLXpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfU1NIUGFzc3dvcmQgKyAnPC9iPjogJyArIGdsb2JhbFRyYW5zbGF0ZS5nc19QYXNzd29yZE5vTG93U2ltdm9sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RSZWdFeHAnLFxuICAgICAgICAgICAgdmFsdWU6IC9cXGQvLFxuICAgICAgICAgICAgcHJvbXB0OiAnPGI+JyArIGdsb2JhbFRyYW5zbGF0ZS5nc19TU0hQYXNzd29yZCArICc8L2I+OiAnICsgZ2xvYmFsVHJhbnNsYXRlLmdzX1Bhc3N3b3JkTm9OdW1iZXJzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RSZWdFeHAnLFxuICAgICAgICAgICAgdmFsdWU6IC9bQS1aXS8sXG4gICAgICAgICAgICBwcm9tcHQ6ICc8Yj4nICsgZ2xvYmFsVHJhbnNsYXRlLmdzX1NTSFBhc3N3b3JkICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sXG4gICAgICAgIH1cbiAgICBdLFxuXG4gICAgLy8gUnVsZXMgZm9yIHRoZSBTU0ggcGFzc3dvcmQgZmllbGQgd2hlbiBTU0ggbG9naW4gdGhyb3VnaCB0aGUgcGFzc3dvcmQgZGlzYWJsZWRcbiAgICBhZGRpdGlvbmFsU3NoVmFsaWRSdWxlc05vUGFzczogW1xuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnZW1wdHknLFxuICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVFbXB0eVNTSFBhc3N3b3JkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbWluTGVuZ3RoWzVdJyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV2Vha1NTSFBhc3N3b3JkLFxuICAgICAgICB9XG4gICAgXSxcblxuICAgIC8qKlxuICAgICAqICBJbml0aWFsaXplIG1vZHVsZSB3aXRoIGV2ZW50IGJpbmRpbmdzIGFuZCBjb21wb25lbnQgaW5pdGlhbGl6YXRpb25zLlxuICAgICAqL1xuICAgIGluaXRpYWxpemUoKSB7XG5cbiAgICAgICAgLy8gV2hlbiBXZWJBZG1pblBhc3N3b3JkIGlucHV0IGlzIGNoYW5nZWQsIHJlY2FsY3VsYXRlIHRoZSBwYXNzd29yZCBzdHJlbmd0aFxuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHdlYkFkbWluUGFzc3dvcmQub24oJ2tleXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kd2ViQWRtaW5QYXNzd29yZC52YWwoKSAhPT0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmhpZGRlblBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuICAgICAgICAgICAgICAgIFBhc3N3b3JkU2NvcmUuY2hlY2tQYXNzU3RyZW5ndGgoe1xuICAgICAgICAgICAgICAgICAgICBwYXNzOiBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHdlYkFkbWluUGFzc3dvcmQudmFsKCksXG4gICAgICAgICAgICAgICAgICAgIGJhcjogJCgnLnBhc3N3b3JkLXNjb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246ICQoJy5wYXNzd29yZC1zY29yZS1zZWN0aW9uJyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdoZW4gU1NIUGFzc3dvcmQgaW5wdXQgaXMgY2hhbmdlZCwgcmVjYWxjdWxhdGUgdGhlIHBhc3N3b3JkIHN0cmVuZ3RoXG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQub24oJ2tleXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQudmFsKCkgIT09IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5oaWRkZW5QYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5pbml0UnVsZXMoKTtcbiAgICAgICAgICAgICAgICBQYXNzd29yZFNjb3JlLmNoZWNrUGFzc1N0cmVuZ3RoKHtcbiAgICAgICAgICAgICAgICAgICAgcGFzczogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRzc2hQYXNzd29yZC52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgYmFyOiAkKCcuc3NoLXBhc3N3b3JkLXNjb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246ICQoJy5zc2gtcGFzc3dvcmQtc2NvcmUtc2VjdGlvbicpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGUgdGFiIG5hdmlnYXRpb24gd2l0aCBoaXN0b3J5IHN1cHBvcnRcbiAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtbWVudScpLmZpbmQoJy5pdGVtJykudGFiKHtcbiAgICAgICAgICAgIGhpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICBoaXN0b3J5VHlwZTogJ2hhc2gnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGUgZHJvcGRvd25zIG9uIHRoZSBmb3JtXG4gICAgICAgICQoJyNnZW5lcmFsLXNldHRpbmdzLWZvcm0gLmRyb3Bkb3duJykuZHJvcGRvd24oKTtcblxuICAgICAgICAvLyBFbmFibGUgY2hlY2tib3hlcyBvbiB0aGUgZm9ybVxuICAgICAgICAkKCcjZ2VuZXJhbC1zZXR0aW5ncy1mb3JtIC5jaGVja2JveCcpLmNoZWNrYm94KCk7XG5cbiAgICAgICAgLy8gRW5hYmxlIHRhYmxlIGRyYWctbi1kcm9wIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgJCgnI2F1ZGlvLWNvZGVjcy10YWJsZSwgI3ZpZGVvLWNvZGVjcy10YWJsZScpLnRhYmxlRG5EKHtcbiAgICAgICAgICAgIG9uRHJvcCgpIHtcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBldmVudCB0byBhY2tub3dsZWRnZSB0aGUgbW9kaWZpY2F0aW9uXG4gICAgICAgICAgICAgICAgRm9ybS5kYXRhQ2hhbmdlZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRHJhZ0NsYXNzOiAnaG92ZXJpbmdSb3cnLFxuICAgICAgICAgICAgZHJhZ0hhbmRsZTogJy5kcmFnSGFuZGxlJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5hYmxlIGRyb3Bkb3duIHdpdGggc291bmQgZmlsZSBzZWxlY3Rpb25cbiAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtZm9ybSAuYXVkaW8tbWVzc2FnZS1zZWxlY3QnKS5kcm9wZG93bihTb3VuZEZpbGVzU2VsZWN0b3IuZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhFbXB0eSgpKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHJlY29yZHMgc2F2ZSBwZXJpb2Qgc2xpZGVyXG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kcmVjb3Jkc1NhdmVQZXJpb2RTbGlkZXJcbiAgICAgICAgICAgIC5zbGlkZXIoe1xuICAgICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgICBtYXg6IDUsXG4gICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICBzbW9vdGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaW50ZXJwcmV0TGFiZWw6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVHJhbnNsYXRlLmdzX1N0b3JlMU1vbnRoT2ZSZWNvcmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVHJhbnNsYXRlLmdzX1N0b3JlM01vbnRoc09mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZTZNb250aHNPZlJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUcmFuc2xhdGUuZ3NfU3RvcmUxWWVhck9mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZTNZZWFyc09mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZUFsbFBvc3NpYmxlUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsc1t2YWx1ZV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZvcm1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRpYWxpemVGb3JtKCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gcnVsZXNcbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuXG4gICAgICAgIC8vIFNob3csIGhpZGUgc3NoIHBhc3N3b3JkIHNlZ21lbnRcbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRkaXNhYmxlU1NIUGFzc3dvcmQuY2hlY2tib3goe1xuICAgICAgICAgICAgJ29uQ2hhbmdlJzogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LnNob3dIaWRlU1NIUGFzc3dvcmRcbiAgICAgICAgfSk7XG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5zaG93SGlkZVNTSFBhc3N3b3JkKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgcmVjb3JkcyBzYXZlIHBlcmlvZCBzbGlkZXJcbiAgICAgICAgY29uc3QgcmVjb3JkU2F2ZVBlcmlvZCA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWUnLCAnUEJYUmVjb3JkU2F2ZVBlcmlvZCcpO1xuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyXG4gICAgICAgICAgICAuc2xpZGVyKCdzZXQgdmFsdWUnLCBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuc2F2ZVJlY29yZHNQZXJpb2QuaW5kZXhPZihyZWNvcmRTYXZlUGVyaW9kKSwgZmFsc2UpO1xuXG4gICAgICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lciB0byBoYW5kbGUgdGFiIGFjdGl2YXRpb25cbiAgICAgICAgJCh3aW5kb3cpLm9uKCdHUy1BY3RpdmF0ZVRhYicsIChldmVudCwgbmFtZVRhYikgPT4ge1xuICAgICAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtbWVudScpLmZpbmQoJy5pdGVtJykudGFiKCdjaGFuZ2UgdGFiJywgbmFtZVRhYik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTaG93LCBoaWRlIHNzaCBwYXNzd29yZCBzZWdtZW50IGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgdXNlIFNTSCBwYXNzd29yZCBjaGVja2JveC5cbiAgICAgKi9cbiAgICBzaG93SGlkZVNTSFBhc3N3b3JkKCl7XG4gICAgICAgIGlmIChnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJGRpc2FibGVTU0hQYXNzd29yZC5jaGVja2JveCgnaXMgY2hlY2tlZCcpKSB7XG4gICAgICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkU2VnbWVudC5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkU2VnbWVudC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGNvbmRpdGlvbnMgZm9yIGRlbGV0aW5nIGFsbCByZWNvcmRzLlxuICAgICAqIENvbXBhcmVzIHRoZSB2YWx1ZSBvZiB0aGUgJ2RlbGV0ZUFsbElucHV0JyBmaWVsZCB3aXRoIGEgcGhyYXNlLlxuICAgICAqIElmIHRoZXkgbWF0Y2gsIGl0IHRyaWdnZXJzIGEgc3lzdGVtIHJlc3RvcmUgdG8gZGVmYXVsdCBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjaGVja0RlbGV0ZUFsbENvbmRpdGlvbnMoKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiAnZGVsZXRlQWxsSW5wdXQnIGZpZWxkLlxuICAgICAgICBjb25zdCBkZWxldGVBbGxJbnB1dCA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWUnLCAnZGVsZXRlQWxsSW5wdXQnKTtcblxuICAgICAgICAvLyBJZiB0aGUgZW50ZXJlZCBwaHJhc2UgbWF0Y2hlcyB0aGUgcGhyYXNlIGluICdnbG9iYWxUcmFuc2xhdGUuZ3NfRW50ZXJEZWxldGVBbGxQaHJhc2UnLFxuICAgICAgICAvLyBjYWxsICdQYnhBcGkuU3lzdGVtUmVzdG9yZURlZmF1bHRTZXR0aW5ncycgdG8gcmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzLlxuICAgICAgICBpZiAoZGVsZXRlQWxsSW5wdXQgPT09IGdsb2JhbFRyYW5zbGF0ZS5nc19FbnRlckRlbGV0ZUFsbFBocmFzZSkge1xuICAgICAgICAgICAgUGJ4QXBpLlN5c3RlbVJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJSZXN0b3JlRGVmYXVsdFNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcmVzcG9uc2UgYWZ0ZXIgcmVzdG9yaW5nIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcmVzcG9uc2UgLSBSZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYWZ0ZXIgcmVzdG9yaW5nIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICovXG4gICAgY2JBZnRlclJlc3RvcmVEZWZhdWx0U2V0dGluZ3MocmVzcG9uc2UpIHtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2UgaXMgdHJ1ZSwgZGlzcGxheSBhIHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgICAvLyBvdGhlcndpc2UsIGRpc3BsYXkgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd0luZm9ybWF0aW9uKGdsb2JhbFRyYW5zbGF0ZS5nc19BbGxTZXR0aW5nc0RlbGV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd011bHRpU3RyaW5nKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZXZlbnQgYWZ0ZXIgdGhlIHNlbGVjdCBzYXZlIHBlcmlvZCBzbGlkZXIgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgc2VsZWN0ZWQgdmFsdWUgZnJvbSB0aGUgc2xpZGVyLlxuICAgICAqL1xuICAgIGNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyKHZhbHVlKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzYXZlIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzbGlkZXIgdmFsdWUuXG4gICAgICAgIGNvbnN0IHNhdmVQZXJpb2QgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuc2F2ZVJlY29yZHNQZXJpb2RbdmFsdWVdO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZm9ybSB2YWx1ZSBmb3IgJ1BCWFJlY29yZFNhdmVQZXJpb2QnIHRvIHRoZSBzZWxlY3RlZCBzYXZlIHBlcmlvZC5cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqLmZvcm0oJ3NldCB2YWx1ZScsICdQQlhSZWNvcmRTYXZlUGVyaW9kJywgc2F2ZVBlcmlvZCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZXZlbnQgdG8gYWNrbm93bGVkZ2UgdGhlIG1vZGlmaWNhdGlvblxuICAgICAgICBGb3JtLmRhdGFDaGFuZ2VkKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZvcm0gaXMgc2VudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzZXR0aW5ncyAtIFRoZSBjdXJyZW50IHNldHRpbmdzIG9mIHRoZSBmb3JtXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBUaGUgdXBkYXRlZCBzZXR0aW5ncyBvZiB0aGUgZm9ybVxuICAgICAqL1xuICAgIGNiQmVmb3JlU2VuZEZvcm0oc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2V0dGluZ3M7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqLmZvcm0oJ2dldCB2YWx1ZXMnKTtcbiAgICAgICAgY29uc3QgYXJyQ29kZWNzID0gW107XG4gICAgICAgICQoJyNhdWRpby1jb2RlY3MtdGFibGUgLmNvZGVjLXJvdywgI3ZpZGVvLWNvZGVjcy10YWJsZSAuY29kZWMtcm93JykuZWFjaCgoaW5kZXgsIG9iaikgPT4ge1xuICAgICAgICAgICAgaWYgKCQob2JqKS5hdHRyKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgYXJyQ29kZWNzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2RlY0lkOiAkKG9iaikuYXR0cignaWQnKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICQob2JqKS5maW5kKCcuY2hlY2tib3gnKS5jaGVja2JveCgnaXMgdW5jaGVja2VkJyksXG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBpbmRleCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5kYXRhLmNvZGVjcyA9IEpTT04uc3RyaW5naWZ5KGFyckNvZGVjcyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBmb3JtIGhhcyBiZWVuIHNlbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIC0gVGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhZnRlciB0aGUgZm9ybSBpcyBzZW50XG4gICAgICovXG4gICAgY2JBZnRlclNlbmRGb3JtKHJlc3BvbnNlKSB7XG4gICAgICAgICQoXCIjZXJyb3ItbWVzc2FnZXNcIikucmVtb3ZlKCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgRm9ybS4kc3VibWl0QnV0dG9uLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmdlbmVyYXRlRXJyb3JNZXNzYWdlSHRtbChyZXNwb25zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKCcucGFzc3dvcmQtdmFsaWRhdGUnKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuY2hlY2tEZWxldGVBbGxDb25kaXRpb25zKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiBjb2xsZWN0cyBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGFib3V0IGEgZGF0YSBzYXZpbmcgZXJyb3JcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdlbmVyYXRlRXJyb3JNZXNzYWdlSHRtbChyZXNwb25zZSkge1xuICAgICAgICBpZiAocmVzcG9uc2UubWVzc2FnZXMgJiYgcmVzcG9uc2UubWVzc2FnZXMuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0ICRkaXYgPSAkKCc8ZGl2PicsIHsgY2xhc3M6ICd1aSBuZWdhdGl2ZSBtZXNzYWdlJywgaWQ6ICdlcnJvci1tZXNzYWdlcycgfSk7XG4gICAgICAgICAgICBjb25zdCAkaGVhZGVyID0gJCgnPGRpdj4nLCB7IGNsYXNzOiAnaGVhZGVyJyB9KS50ZXh0KGdsb2JhbFRyYW5zbGF0ZS5nc19FcnJvclNhdmVTZXR0aW5ncyk7XG4gICAgICAgICAgICAkZGl2LmFwcGVuZCgkaGVhZGVyKTtcbiAgICAgICAgICAgIGNvbnN0ICR1bCA9ICQoJzx1bD4nLCB7IGNsYXNzOiAnbGlzdCcgfSk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2VzLmVycm9yLmZvckVhY2goZXJyb3JBcnJheSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyb3JBcnJheS5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRDb250ZW50ID0nJztcbiAgICAgICAgICAgICAgICAgICAgaWYoZ2xvYmFsVHJhbnNsYXRlW2Vycm9yLm1lc3NhZ2VdID09PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dENvbnRlbnQgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50ID0gZ2xvYmFsVHJhbnNsYXRlW2Vycm9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc1NldC5oYXModGV4dENvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNTZXQuYWRkKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAkdWwuYXBwZW5kKCQoJzxsaT4nKS50ZXh0KHRleHRDb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICRkaXYuYXBwZW5kKCR1bCk7XG4gICAgICAgICAgICAkKCcjc3VibWl0YnV0dG9uJykuYmVmb3JlKCRkaXYpO1xuICAgICAgICAgICAgcmV0dXJuICRkaXY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgdmFsaWRhdGlvbiBydWxlcyBvZiB0aGUgZm9ybVxuICAgICAqL1xuICAgIGluaXRSdWxlcygpIHtcbiAgICAgICAgLy8gU1NIUGFzc3dvcmRcbiAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZGlzYWJsZVNTSFBhc3N3b3JkLmNoZWNrYm94KCdpcyBjaGVja2VkJykpIHtcbiAgICAgICAgICAgIEZvcm0udmFsaWRhdGVSdWxlcy5TU0hQYXNzd29yZC5ydWxlcyA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5hZGRpdGlvbmFsU3NoVmFsaWRSdWxlc05vUGFzcztcbiAgICAgICAgfSBlbHNlIGlmIChnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkLnZhbCgpID09PSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuaGlkZGVuUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIEZvcm0udmFsaWRhdGVSdWxlcy5TU0hQYXNzd29yZC5ydWxlcyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzLlNTSFBhc3N3b3JkLnJ1bGVzID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmFkZGl0aW9uYWxTc2hWYWxpZFJ1bGVzUGFzcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlYkFkbWluUGFzc3dvcmRcbiAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kd2ViQWRtaW5QYXNzd29yZC52YWwoKSA9PT0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmhpZGRlblBhc3N3b3JkKSB7XG4gICAgICAgICAgICBGb3JtLnZhbGlkYXRlUnVsZXMuV2ViQWRtaW5QYXNzd29yZC5ydWxlcyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzLldlYkFkbWluUGFzc3dvcmQucnVsZXMgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkud2ViQWRtaW5QYXNzd29yZFJ1bGVzO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGZvcm0gd2l0aCBjdXN0b20gc2V0dGluZ3NcbiAgICAgKi9cbiAgICBpbml0aWFsaXplRm9ybSgpIHtcbiAgICAgICAgRm9ybS4kZm9ybU9iaiA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iajtcbiAgICAgICAgRm9ybS51cmwgPSBgJHtnbG9iYWxSb290VXJsfWdlbmVyYWwtc2V0dGluZ3Mvc2F2ZWA7IC8vIEZvcm0gc3VibWlzc2lvbiBVUkxcbiAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LnZhbGlkYXRlUnVsZXM7IC8vIEZvcm0gdmFsaWRhdGlvbiBydWxlc1xuICAgICAgICBGb3JtLmNiQmVmb3JlU2VuZEZvcm0gPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuY2JCZWZvcmVTZW5kRm9ybTsgLy8gQ2FsbGJhY2sgYmVmb3JlIGZvcm0gaXMgc2VudFxuICAgICAgICBGb3JtLmNiQWZ0ZXJTZW5kRm9ybSA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5jYkFmdGVyU2VuZEZvcm07IC8vIENhbGxiYWNrIGFmdGVyIGZvcm0gaXMgc2VudFxuICAgICAgICBGb3JtLmluaXRpYWxpemUoKTtcbiAgICB9XG59O1xuXG4vLyBXaGVuIHRoZSBkb2N1bWVudCBpcyByZWFkeSwgaW5pdGlhbGl6ZSB0aGUgZ2VuZXJhbFNldHRpbmdzIG1hbmFnZW1lbnQgaW50ZXJmYWNlLlxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5pbml0aWFsaXplKCk7XG59KTsiXX0= \ No newline at end of file diff --git a/sites/admin-cabinet/assets/js/src/GeneralSettings/general-settings-modify.js b/sites/admin-cabinet/assets/js/src/GeneralSettings/general-settings-modify.js index 9344f8f7b..aabe559bb 100644 --- a/sites/admin-cabinet/assets/js/src/GeneralSettings/general-settings-modify.js +++ b/sites/admin-cabinet/assets/js/src/GeneralSettings/general-settings-modify.js @@ -418,14 +418,49 @@ const generalSettingsModify = { * @param {Object} response - The response from the server after the form is sent */ cbAfterSendForm(response) { + $("#error-messages").remove(); if (!response.success) { Form.$submitButton.removeClass('disabled'); + generalSettingsModify.generateErrorMessageHtml(response); } else { $('.password-validate').remove(); } generalSettingsModify.checkDeleteAllConditions(); }, + /** + * The function collects an information message about a data saving error + * @param response + * @returns {string} + */ + generateErrorMessageHtml(response) { + if (response.messages && response.messages.error) { + const $div = $('
    ', { class: 'ui negative message', id: 'error-messages' }); + const $header = $('
    ', { class: 'header' }).text(globalTranslate.gs_ErrorSaveSettings); + $div.append($header); + const $ul = $('
      ', { class: 'list' }); + const messagesSet = new Set(); + response.messages.error.forEach(errorArray => { + errorArray.forEach(error => { + let textContent =''; + if(globalTranslate[error.message] === undefined){ + textContent = error.message; + }else{ + textContent = globalTranslate[error.message]; + } + if (messagesSet.has(textContent)) { + return; + } + messagesSet.add(error.message); + $ul.append($('
    • ').text(textContent)); + }); + }); + $div.append($ul); + $('#submitbutton').before($div); + return $div; + } + }, + /** * Initialize the validation rules of the form */ diff --git a/src/Common/Messages/ru.php b/src/Common/Messages/ru.php index f2960dd24..fc0bc506f 100644 --- a/src/Common/Messages/ru.php +++ b/src/Common/Messages/ru.php @@ -246,6 +246,8 @@ 'gs_PBXRecordSavePeriodLabel' => 'Период хранения записей разговоров', 'gs_StoreAllPossibleRecords' => '∞', 'gs_DisableAllModules' => 'Отключить маркетплейс', + 'gs_ErrorSaveSettings' => 'Ошибка сохранения настроек', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Указанный внутренний номер уже используется', 'pr_AddSIPProvider' => 'Подключить SIP', 'pr_AddIAXProvider' => 'Подключить IAX', 'pr_QualifyInstructionsIAX' => 'При включение этой опции Asterisk будет отправлять SIP Options пакеты. Это необходимо для поддержки NAT туннелирования на вашем маршрутизаторе.', From 7cd0c17767124ed1232a9b7915f087e9d939822b Mon Sep 17 00:00:00 2001 From: boffart <> Date: Thu, 11 Jul 2024 09:22:32 +0300 Subject: [PATCH 05/13] =?UTF-8?q?#767=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/js/pbx/GeneralSettings/general-settings-modify.js | 4 +--- .../assets/js/src/GeneralSettings/general-settings-modify.js | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/sites/admin-cabinet/assets/js/pbx/GeneralSettings/general-settings-modify.js b/sites/admin-cabinet/assets/js/pbx/GeneralSettings/general-settings-modify.js index fbb8aa32d..89800a675 100644 --- a/sites/admin-cabinet/assets/js/pbx/GeneralSettings/general-settings-modify.js +++ b/sites/admin-cabinet/assets/js/pbx/GeneralSettings/general-settings-modify.js @@ -371,7 +371,6 @@ var generalSettingsModify = { /** * The function collects an information message about a data saving error * @param response - * @returns {string} */ generateErrorMessageHtml: function generateErrorMessageHtml(response) { if (response.messages && response.messages.error) { @@ -407,7 +406,6 @@ var generalSettingsModify = { }); $div.append($ul); $('#submitbutton').before($div); - return $div; } }, @@ -452,4 +450,4 @@ var generalSettingsModify = { $(document).ready(function () { generalSettingsModify.initialize(); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9HZW5lcmFsU2V0dGluZ3MvZ2VuZXJhbC1zZXR0aW5ncy1tb2RpZnkuanMiXSwibmFtZXMiOlsiZ2VuZXJhbFNldHRpbmdzTW9kaWZ5IiwiJGZvcm1PYmoiLCIkIiwiJHdlYkFkbWluUGFzc3dvcmQiLCIkc3NoUGFzc3dvcmQiLCIkZGlzYWJsZVNTSFBhc3N3b3JkIiwicGFyZW50IiwiJHNzaFBhc3N3b3JkU2VnbWVudCIsImhpZGRlblBhc3N3b3JkIiwiJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyIiwic2F2ZVJlY29yZHNQZXJpb2QiLCJ2YWxpZGF0ZVJ1bGVzIiwicGJ4bmFtZSIsImlkZW50aWZpZXIiLCJydWxlcyIsInR5cGUiLCJwcm9tcHQiLCJnbG9iYWxUcmFuc2xhdGUiLCJnc19WYWxpZGF0ZUVtcHR5UEJYTmFtZSIsIldlYkFkbWluUGFzc3dvcmQiLCJXZWJBZG1pblBhc3N3b3JkUmVwZWF0IiwiZ3NfVmFsaWRhdGVXZWJQYXNzd29yZHNGaWVsZERpZmZlcmVudCIsIlNTSFBhc3N3b3JkIiwiU1NIUGFzc3dvcmRSZXBlYXQiLCJnc19WYWxpZGF0ZVNTSFBhc3N3b3Jkc0ZpZWxkRGlmZmVyZW50IiwiV0VCUG9ydCIsImdzX1ZhbGlkYXRlV0VCUG9ydE91dE9mUmFuZ2UiLCJnc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9XRUJQb3J0IiwiZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0IiwiZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1UTFNQb3J0IiwiV0VCSFRUUFNQb3J0IiwiZ3NfVmFsaWRhdGVXRUJIVFRQU1BvcnRPdXRPZlJhbmdlIiwiZ3NfVmFsaWRhdGVXRUJIVFRQU1BvcnROb3RFcXVhbFRvQWphbVBvcnQiLCJnc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9BamFtVExTUG9ydCIsIkFKQU1Qb3J0IiwiZ3NfVmFsaWRhdGVBSkFNUG9ydE91dE9mUmFuZ2UiLCJ3ZWJBZG1pblBhc3N3b3JkUnVsZXMiLCJnc19WYWxpZGF0ZUVtcHR5V2ViUGFzc3dvcmQiLCJnc19WYWxpZGF0ZVdlYWtXZWJQYXNzd29yZCIsInZhbHVlIiwiZ3NfUGFzc3dvcmRzIiwiZ3NfUGFzc3dvcmROb0xvd1NpbXZvbCIsImdzX1Bhc3N3b3JkTm9OdW1iZXJzIiwiZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sIiwiYWRkaXRpb25hbFNzaFZhbGlkUnVsZXNQYXNzIiwiZ3NfVmFsaWRhdGVFbXB0eVNTSFBhc3N3b3JkIiwiZ3NfVmFsaWRhdGVXZWFrU1NIUGFzc3dvcmQiLCJnc19TU0hQYXNzd29yZCIsImFkZGl0aW9uYWxTc2hWYWxpZFJ1bGVzTm9QYXNzIiwiaW5pdGlhbGl6ZSIsIm9uIiwidmFsIiwiaW5pdFJ1bGVzIiwiUGFzc3dvcmRTY29yZSIsImNoZWNrUGFzc1N0cmVuZ3RoIiwicGFzcyIsImJhciIsInNlY3Rpb24iLCJmaW5kIiwidGFiIiwiaGlzdG9yeSIsImhpc3RvcnlUeXBlIiwiZHJvcGRvd24iLCJjaGVja2JveCIsInRhYmxlRG5EIiwib25Ecm9wIiwiRm9ybSIsImRhdGFDaGFuZ2VkIiwib25EcmFnQ2xhc3MiLCJkcmFnSGFuZGxlIiwiU291bmRGaWxlc1NlbGVjdG9yIiwiZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhFbXB0eSIsInNsaWRlciIsIm1pbiIsIm1heCIsInN0ZXAiLCJzbW9vdGgiLCJpbnRlcnByZXRMYWJlbCIsImxhYmVscyIsImdzX1N0b3JlMU1vbnRoT2ZSZWNvcmRzIiwiZ3NfU3RvcmUzTW9udGhzT2ZSZWNvcmRzIiwiZ3NfU3RvcmU2TW9udGhzT2ZSZWNvcmRzIiwiZ3NfU3RvcmUxWWVhck9mUmVjb3JkcyIsImdzX1N0b3JlM1llYXJzT2ZSZWNvcmRzIiwiZ3NfU3RvcmVBbGxQb3NzaWJsZVJlY29yZHMiLCJvbkNoYW5nZSIsImNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyIiwiaW5pdGlhbGl6ZUZvcm0iLCJzaG93SGlkZVNTSFBhc3N3b3JkIiwicmVjb3JkU2F2ZVBlcmlvZCIsImZvcm0iLCJpbmRleE9mIiwid2luZG93IiwiZXZlbnQiLCJuYW1lVGFiIiwiaGlkZSIsInNob3ciLCJjaGVja0RlbGV0ZUFsbENvbmRpdGlvbnMiLCJkZWxldGVBbGxJbnB1dCIsImdzX0VudGVyRGVsZXRlQWxsUGhyYXNlIiwiUGJ4QXBpIiwiU3lzdGVtUmVzdG9yZURlZmF1bHRTZXR0aW5ncyIsImNiQWZ0ZXJSZXN0b3JlRGVmYXVsdFNldHRpbmdzIiwicmVzcG9uc2UiLCJVc2VyTWVzc2FnZSIsInNob3dJbmZvcm1hdGlvbiIsImdzX0FsbFNldHRpbmdzRGVsZXRlZCIsInNob3dNdWx0aVN0cmluZyIsInNhdmVQZXJpb2QiLCJjYkJlZm9yZVNlbmRGb3JtIiwic2V0dGluZ3MiLCJyZXN1bHQiLCJkYXRhIiwiYXJyQ29kZWNzIiwiZWFjaCIsImluZGV4Iiwib2JqIiwiYXR0ciIsInB1c2giLCJjb2RlY0lkIiwiZGlzYWJsZWQiLCJwcmlvcml0eSIsImNvZGVjcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYkFmdGVyU2VuZEZvcm0iLCJyZW1vdmUiLCJzdWNjZXNzIiwiJHN1Ym1pdEJ1dHRvbiIsInJlbW92ZUNsYXNzIiwiZ2VuZXJhdGVFcnJvck1lc3NhZ2VIdG1sIiwibWVzc2FnZXMiLCJlcnJvciIsIiRkaXYiLCJpZCIsIiRoZWFkZXIiLCJ0ZXh0IiwiZ3NfRXJyb3JTYXZlU2V0dGluZ3MiLCJhcHBlbmQiLCIkdWwiLCJtZXNzYWdlc1NldCIsIlNldCIsImZvckVhY2giLCJlcnJvckFycmF5IiwidGV4dENvbnRlbnQiLCJtZXNzYWdlIiwidW5kZWZpbmVkIiwiaGFzIiwiYWRkIiwiYmVmb3JlIiwidXJsIiwiZ2xvYmFsUm9vdFVybCIsImRvY3VtZW50IiwicmVhZHkiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQSxxQkFBcUIsR0FBRztBQUMxQjtBQUNKO0FBQ0E7QUFDQTtBQUNJQyxFQUFBQSxRQUFRLEVBQUVDLENBQUMsQ0FBQyx3QkFBRCxDQUxlOztBQU8xQjtBQUNKO0FBQ0E7QUFDQTtBQUNJQyxFQUFBQSxpQkFBaUIsRUFBRUQsQ0FBQyxDQUFDLG1CQUFELENBWE07O0FBYTFCO0FBQ0o7QUFDQTtBQUNBO0FBQ0lFLEVBQUFBLFlBQVksRUFBRUYsQ0FBQyxDQUFDLGNBQUQsQ0FqQlc7O0FBbUIxQjtBQUNKO0FBQ0E7QUFDQTtBQUNJRyxFQUFBQSxtQkFBbUIsRUFBRUgsQ0FBQyxDQUFDLDJCQUFELENBQUQsQ0FBK0JJLE1BQS9CLENBQXNDLFdBQXRDLENBdkJLOztBQXlCMUI7QUFDSjtBQUNBO0FBQ0E7QUFDSUMsRUFBQUEsbUJBQW1CLEVBQUVMLENBQUMsQ0FBQywyQkFBRCxDQTdCSTs7QUErQjFCO0FBQ0o7QUFDQTtBQUNJTSxFQUFBQSxjQUFjLEVBQUUsU0FsQ1U7O0FBb0MxQjtBQUNKO0FBQ0E7QUFDQTtBQUNJQyxFQUFBQSx3QkFBd0IsRUFBRVAsQ0FBQyxDQUFDLDRCQUFELENBeENEOztBQTBDMUI7QUFDSjtBQUNBO0FBQ0lRLEVBQUFBLGlCQUFpQixFQUFFLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxLQUFiLEVBQW9CLEtBQXBCLEVBQTJCLE1BQTNCLEVBQW1DLEVBQW5DLENBN0NPOztBQStDMUI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNJQyxFQUFBQSxhQUFhLEVBQUU7QUFBRTtBQUNiQyxJQUFBQSxPQUFPLEVBQUU7QUFDTEMsTUFBQUEsVUFBVSxFQUFFLFNBRFA7QUFFTEMsTUFBQUEsS0FBSyxFQUFFLENBQ0g7QUFDSUMsUUFBQUEsSUFBSSxFQUFFLE9BRFY7QUFFSUMsUUFBQUEsTUFBTSxFQUFFQyxlQUFlLENBQUNDO0FBRjVCLE9BREc7QUFGRixLQURFO0FBVVhDLElBQUFBLGdCQUFnQixFQUFFO0FBQ2ROLE1BQUFBLFVBQVUsRUFBRSxrQkFERTtBQUVkQyxNQUFBQSxLQUFLLEVBQUU7QUFGTyxLQVZQO0FBY1hNLElBQUFBLHNCQUFzQixFQUFFO0FBQ3BCUCxNQUFBQSxVQUFVLEVBQUUsd0JBRFE7QUFFcEJDLE1BQUFBLEtBQUssRUFBRSxDQUNIO0FBQ0lDLFFBQUFBLElBQUksRUFBRSx5QkFEVjtBQUVJQyxRQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ0k7QUFGNUIsT0FERztBQUZhLEtBZGI7QUF1QlhDLElBQUFBLFdBQVcsRUFBRTtBQUNUVCxNQUFBQSxVQUFVLEVBQUUsYUFESDtBQUVUQyxNQUFBQSxLQUFLLEVBQUU7QUFGRSxLQXZCRjtBQTJCWFMsSUFBQUEsaUJBQWlCLEVBQUU7QUFDZlYsTUFBQUEsVUFBVSxFQUFFLG1CQURHO0FBRWZDLE1BQUFBLEtBQUssRUFBRSxDQUNIO0FBQ0lDLFFBQUFBLElBQUksRUFBRSxvQkFEVjtBQUVJQyxRQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ087QUFGNUIsT0FERztBQUZRLEtBM0JSO0FBb0NYQyxJQUFBQSxPQUFPLEVBQUU7QUFDTFosTUFBQUEsVUFBVSxFQUFFLFNBRFA7QUFFTEMsTUFBQUEsS0FBSyxFQUFFLENBQ0g7QUFDSUMsUUFBQUEsSUFBSSxFQUFFLG1CQURWO0FBRUlDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDUztBQUY1QixPQURHLEVBS0g7QUFDSVgsUUFBQUEsSUFBSSxFQUFFLHlCQURWO0FBRUlDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDVTtBQUY1QixPQUxHLEVBU0g7QUFDSVosUUFBQUEsSUFBSSxFQUFFLHdCQURWO0FBRUlDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDVztBQUY1QixPQVRHLEVBYUg7QUFDSWIsUUFBQUEsSUFBSSxFQUFFLHFCQURWO0FBRUlDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDWTtBQUY1QixPQWJHO0FBRkYsS0FwQ0U7QUF5RFhDLElBQUFBLFlBQVksRUFBRTtBQUNWakIsTUFBQUEsVUFBVSxFQUFFLGNBREY7QUFFVkMsTUFBQUEsS0FBSyxFQUFFLENBQ0g7QUFDSUMsUUFBQUEsSUFBSSxFQUFFLG1CQURWO0FBRUlDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDYztBQUY1QixPQURHLEVBS0g7QUFDSWhCLFFBQUFBLElBQUksRUFBRSxvQkFEVjtBQUVJQyxRQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ1U7QUFGNUIsT0FMRyxFQVNIO0FBQ0laLFFBQUFBLElBQUksRUFBRSx3QkFEVjtBQUVJQyxRQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ2U7QUFGNUIsT0FURyxFQWFIO0FBQ0lqQixRQUFBQSxJQUFJLEVBQUUscUJBRFY7QUFFSUMsUUFBQUEsTUFBTSxFQUFFQyxlQUFlLENBQUNnQjtBQUY1QixPQWJHO0FBRkcsS0F6REg7QUE4RVhDLElBQUFBLFFBQVEsRUFBRTtBQUNOckIsTUFBQUEsVUFBVSxFQUFFLFVBRE47QUFFTkMsTUFBQUEsS0FBSyxFQUFFLENBQ0g7QUFDSUMsUUFBQUEsSUFBSSxFQUFFLG1CQURWO0FBRUlDLFFBQUFBLE1BQU0sRUFBRUMsZUFBZSxDQUFDa0I7QUFGNUIsT0FERyxFQUtIO0FBQ0lwQixRQUFBQSxJQUFJLEVBQUUsd0JBRFY7QUFFSUMsUUFBQUEsTUFBTSxFQUFFQyxlQUFlLENBQUNrQjtBQUY1QixPQUxHO0FBRkQ7QUE5RUMsR0FwRFc7QUFpSjFCO0FBQ0FDLEVBQUFBLHFCQUFxQixFQUFFLENBQ25CO0FBQ0lyQixJQUFBQSxJQUFJLEVBQUUsT0FEVjtBQUVJQyxJQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ29CO0FBRjVCLEdBRG1CLEVBS25CO0FBQ0l0QixJQUFBQSxJQUFJLEVBQUUsY0FEVjtBQUVJQyxJQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQ3FCO0FBRjVCLEdBTG1CLEVBU25CO0FBQ0l2QixJQUFBQSxJQUFJLEVBQUUsV0FEVjtBQUVJd0IsSUFBQUEsS0FBSyxFQUFFLE9BRlg7QUFHSXZCLElBQUFBLE1BQU0sRUFBRSxRQUFRQyxlQUFlLENBQUN1QixZQUF4QixHQUF1QyxRQUF2QyxHQUFrRHZCLGVBQWUsQ0FBQ3dCO0FBSDlFLEdBVG1CLEVBY25CO0FBQ0kxQixJQUFBQSxJQUFJLEVBQUUsV0FEVjtBQUVJd0IsSUFBQUEsS0FBSyxFQUFFLElBRlg7QUFHSXZCLElBQUFBLE1BQU0sRUFBRSxRQUFRQyxlQUFlLENBQUN1QixZQUF4QixHQUF1QyxRQUF2QyxHQUFrRHZCLGVBQWUsQ0FBQ3lCO0FBSDlFLEdBZG1CLEVBbUJuQjtBQUNJM0IsSUFBQUEsSUFBSSxFQUFFLFdBRFY7QUFFSXdCLElBQUFBLEtBQUssRUFBRSxPQUZYO0FBR0l2QixJQUFBQSxNQUFNLEVBQUUsUUFBUUMsZUFBZSxDQUFDdUIsWUFBeEIsR0FBdUMsUUFBdkMsR0FBa0R2QixlQUFlLENBQUMwQjtBQUg5RSxHQW5CbUIsQ0FsSkc7QUEySzFCO0FBQ0FDLEVBQUFBLDJCQUEyQixFQUFFLENBQ3pCO0FBQ0k3QixJQUFBQSxJQUFJLEVBQUUsT0FEVjtBQUVJQyxJQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQzRCO0FBRjVCLEdBRHlCLEVBS3pCO0FBQ0k5QixJQUFBQSxJQUFJLEVBQUUsY0FEVjtBQUVJQyxJQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQzZCO0FBRjVCLEdBTHlCLEVBU3pCO0FBQ0kvQixJQUFBQSxJQUFJLEVBQUUsV0FEVjtBQUVJd0IsSUFBQUEsS0FBSyxFQUFFLE9BRlg7QUFHSXZCLElBQUFBLE1BQU0sRUFBRSxRQUFRQyxlQUFlLENBQUM4QixjQUF4QixHQUF5QyxRQUF6QyxHQUFvRDlCLGVBQWUsQ0FBQ3dCO0FBSGhGLEdBVHlCLEVBY3pCO0FBQ0kxQixJQUFBQSxJQUFJLEVBQUUsV0FEVjtBQUVJd0IsSUFBQUEsS0FBSyxFQUFFLElBRlg7QUFHSXZCLElBQUFBLE1BQU0sRUFBRSxRQUFRQyxlQUFlLENBQUM4QixjQUF4QixHQUF5QyxRQUF6QyxHQUFvRDlCLGVBQWUsQ0FBQ3lCO0FBSGhGLEdBZHlCLEVBbUJ6QjtBQUNJM0IsSUFBQUEsSUFBSSxFQUFFLFdBRFY7QUFFSXdCLElBQUFBLEtBQUssRUFBRSxPQUZYO0FBR0l2QixJQUFBQSxNQUFNLEVBQUUsUUFBUUMsZUFBZSxDQUFDOEIsY0FBeEIsR0FBeUMsUUFBekMsR0FBb0Q5QixlQUFlLENBQUMwQjtBQUhoRixHQW5CeUIsQ0E1S0g7QUFzTTFCO0FBQ0FLLEVBQUFBLDZCQUE2QixFQUFFLENBQzNCO0FBQ0lqQyxJQUFBQSxJQUFJLEVBQUUsT0FEVjtBQUVJQyxJQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQzRCO0FBRjVCLEdBRDJCLEVBSzNCO0FBQ0k5QixJQUFBQSxJQUFJLEVBQUUsY0FEVjtBQUVJQyxJQUFBQSxNQUFNLEVBQUVDLGVBQWUsQ0FBQzZCO0FBRjVCLEdBTDJCLENBdk1MOztBQWtOMUI7QUFDSjtBQUNBO0FBQ0lHLEVBQUFBLFVBck4wQix3QkFxTmI7QUFFVDtBQUNBakQsSUFBQUEscUJBQXFCLENBQUNHLGlCQUF0QixDQUF3QytDLEVBQXhDLENBQTJDLE9BQTNDLEVBQW9ELFlBQU07QUFDdEQsVUFBSWxELHFCQUFxQixDQUFDRyxpQkFBdEIsQ0FBd0NnRCxHQUF4QyxPQUFrRG5ELHFCQUFxQixDQUFDUSxjQUE1RSxFQUE0RjtBQUN4RlIsUUFBQUEscUJBQXFCLENBQUNvRCxTQUF0QjtBQUNBQyxRQUFBQSxhQUFhLENBQUNDLGlCQUFkLENBQWdDO0FBQzVCQyxVQUFBQSxJQUFJLEVBQUV2RCxxQkFBcUIsQ0FBQ0csaUJBQXRCLENBQXdDZ0QsR0FBeEMsRUFEc0I7QUFFNUJLLFVBQUFBLEdBQUcsRUFBRXRELENBQUMsQ0FBQyxpQkFBRCxDQUZzQjtBQUc1QnVELFVBQUFBLE9BQU8sRUFBRXZELENBQUMsQ0FBQyx5QkFBRDtBQUhrQixTQUFoQztBQUtIO0FBQ0osS0FURCxFQUhTLENBY1Q7O0FBQ0FGLElBQUFBLHFCQUFxQixDQUFDSSxZQUF0QixDQUFtQzhDLEVBQW5DLENBQXNDLE9BQXRDLEVBQStDLFlBQU07QUFDakQsVUFBSWxELHFCQUFxQixDQUFDSSxZQUF0QixDQUFtQytDLEdBQW5DLE9BQTZDbkQscUJBQXFCLENBQUNRLGNBQXZFLEVBQXVGO0FBQ25GUixRQUFBQSxxQkFBcUIsQ0FBQ29ELFNBQXRCO0FBQ0FDLFFBQUFBLGFBQWEsQ0FBQ0MsaUJBQWQsQ0FBZ0M7QUFDNUJDLFVBQUFBLElBQUksRUFBRXZELHFCQUFxQixDQUFDSSxZQUF0QixDQUFtQytDLEdBQW5DLEVBRHNCO0FBRTVCSyxVQUFBQSxHQUFHLEVBQUV0RCxDQUFDLENBQUMscUJBQUQsQ0FGc0I7QUFHNUJ1RCxVQUFBQSxPQUFPLEVBQUV2RCxDQUFDLENBQUMsNkJBQUQ7QUFIa0IsU0FBaEM7QUFLSDtBQUNKLEtBVEQsRUFmUyxDQTBCVDs7QUFDQUEsSUFBQUEsQ0FBQyxDQUFDLHdCQUFELENBQUQsQ0FBNEJ3RCxJQUE1QixDQUFpQyxPQUFqQyxFQUEwQ0MsR0FBMUMsQ0FBOEM7QUFDMUNDLE1BQUFBLE9BQU8sRUFBRSxJQURpQztBQUUxQ0MsTUFBQUEsV0FBVyxFQUFFO0FBRjZCLEtBQTlDLEVBM0JTLENBZ0NUOztBQUNBM0QsSUFBQUEsQ0FBQyxDQUFDLGtDQUFELENBQUQsQ0FBc0M0RCxRQUF0QyxHQWpDUyxDQW1DVDs7QUFDQTVELElBQUFBLENBQUMsQ0FBQyxrQ0FBRCxDQUFELENBQXNDNkQsUUFBdEMsR0FwQ1MsQ0FzQ1Q7O0FBQ0E3RCxJQUFBQSxDQUFDLENBQUMsMENBQUQsQ0FBRCxDQUE4QzhELFFBQTlDLENBQXVEO0FBQ25EQyxNQUFBQSxNQURtRCxvQkFDMUM7QUFDTDtBQUNBQyxRQUFBQSxJQUFJLENBQUNDLFdBQUw7QUFDSCxPQUprRDtBQUtuREMsTUFBQUEsV0FBVyxFQUFFLGFBTHNDO0FBTW5EQyxNQUFBQSxVQUFVLEVBQUU7QUFOdUMsS0FBdkQsRUF2Q1MsQ0FnRFQ7O0FBQ0FuRSxJQUFBQSxDQUFDLENBQUMsOENBQUQsQ0FBRCxDQUFrRDRELFFBQWxELENBQTJEUSxrQkFBa0IsQ0FBQ0MsNEJBQW5CLEVBQTNELEVBakRTLENBbURUOztBQUNBdkUsSUFBQUEscUJBQXFCLENBQUNTLHdCQUF0QixDQUNLK0QsTUFETCxDQUNZO0FBQ0pDLE1BQUFBLEdBQUcsRUFBRSxDQUREO0FBRUpDLE1BQUFBLEdBQUcsRUFBRSxDQUZEO0FBR0pDLE1BQUFBLElBQUksRUFBRSxDQUhGO0FBSUpDLE1BQUFBLE1BQU0sRUFBRSxJQUpKO0FBS0pDLE1BQUFBLGNBQWMsRUFBRSx3QkFBVXRDLEtBQVYsRUFBaUI7QUFDN0IsWUFBSXVDLE1BQU0sR0FBRyxDQUNUN0QsZUFBZSxDQUFDOEQsdUJBRFAsRUFFVDlELGVBQWUsQ0FBQytELHdCQUZQLEVBR1QvRCxlQUFlLENBQUNnRSx3QkFIUCxFQUlUaEUsZUFBZSxDQUFDaUUsc0JBSlAsRUFLVGpFLGVBQWUsQ0FBQ2tFLHVCQUxQLEVBTVRsRSxlQUFlLENBQUNtRSwwQkFOUCxDQUFiO0FBUUEsZUFBT04sTUFBTSxDQUFDdkMsS0FBRCxDQUFiO0FBQ0gsT0FmRztBQWdCSjhDLE1BQUFBLFFBQVEsRUFBRXJGLHFCQUFxQixDQUFDc0Y7QUFoQjVCLEtBRFosRUFwRFMsQ0F5RVQ7O0FBQ0F0RixJQUFBQSxxQkFBcUIsQ0FBQ3VGLGNBQXRCLEdBMUVTLENBNEVUOztBQUNBdkYsSUFBQUEscUJBQXFCLENBQUNvRCxTQUF0QixHQTdFUyxDQStFVDs7QUFDQXBELElBQUFBLHFCQUFxQixDQUFDSyxtQkFBdEIsQ0FBMEMwRCxRQUExQyxDQUFtRDtBQUMvQyxrQkFBWS9ELHFCQUFxQixDQUFDd0Y7QUFEYSxLQUFuRDtBQUdBeEYsSUFBQUEscUJBQXFCLENBQUN3RixtQkFBdEIsR0FuRlMsQ0FxRlQ7O0FBQ0EsUUFBTUMsZ0JBQWdCLEdBQUd6RixxQkFBcUIsQ0FBQ0MsUUFBdEIsQ0FBK0J5RixJQUEvQixDQUFvQyxXQUFwQyxFQUFpRCxxQkFBakQsQ0FBekI7QUFDQTFGLElBQUFBLHFCQUFxQixDQUFDUyx3QkFBdEIsQ0FDSytELE1BREwsQ0FDWSxXQURaLEVBQ3lCeEUscUJBQXFCLENBQUNVLGlCQUF0QixDQUF3Q2lGLE9BQXhDLENBQWdERixnQkFBaEQsQ0FEekIsRUFDNEYsS0FENUYsRUF2RlMsQ0EwRlQ7O0FBQ0F2RixJQUFBQSxDQUFDLENBQUMwRixNQUFELENBQUQsQ0FBVTFDLEVBQVYsQ0FBYSxnQkFBYixFQUErQixVQUFDMkMsS0FBRCxFQUFRQyxPQUFSLEVBQW9CO0FBQy9DNUYsTUFBQUEsQ0FBQyxDQUFDLHdCQUFELENBQUQsQ0FBNEJ3RCxJQUE1QixDQUFpQyxPQUFqQyxFQUEwQ0MsR0FBMUMsQ0FBOEMsWUFBOUMsRUFBNERtQyxPQUE1RDtBQUNILEtBRkQ7QUFHSCxHQW5UeUI7O0FBcVQxQjtBQUNKO0FBQ0E7QUFDSU4sRUFBQUEsbUJBeFQwQixpQ0F3VEw7QUFDakIsUUFBSXhGLHFCQUFxQixDQUFDSyxtQkFBdEIsQ0FBMEMwRCxRQUExQyxDQUFtRCxZQUFuRCxDQUFKLEVBQXNFO0FBQ2xFL0QsTUFBQUEscUJBQXFCLENBQUNPLG1CQUF0QixDQUEwQ3dGLElBQTFDO0FBQ0gsS0FGRCxNQUVPO0FBQ0gvRixNQUFBQSxxQkFBcUIsQ0FBQ08sbUJBQXRCLENBQTBDeUYsSUFBMUM7QUFDSDs7QUFDRGhHLElBQUFBLHFCQUFxQixDQUFDb0QsU0FBdEI7QUFDSCxHQS9UeUI7O0FBZ1UxQjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0k2QyxFQUFBQSx3QkFyVTBCLHNDQXFVQztBQUV2QjtBQUNBLFFBQU1DLGNBQWMsR0FBR2xHLHFCQUFxQixDQUFDQyxRQUF0QixDQUErQnlGLElBQS9CLENBQW9DLFdBQXBDLEVBQWlELGdCQUFqRCxDQUF2QixDQUh1QixDQUt2QjtBQUNBOztBQUNBLFFBQUlRLGNBQWMsS0FBS2pGLGVBQWUsQ0FBQ2tGLHVCQUF2QyxFQUFnRTtBQUM1REMsTUFBQUEsTUFBTSxDQUFDQyw0QkFBUCxDQUFvQ3JHLHFCQUFxQixDQUFDc0csNkJBQTFEO0FBQ0g7QUFDSixHQS9VeUI7O0FBaVYxQjtBQUNKO0FBQ0E7QUFDQTtBQUNJQSxFQUFBQSw2QkFyVjBCLHlDQXFWSUMsUUFyVkosRUFxVmM7QUFFcEM7QUFDQTtBQUNBLFFBQUlBLFFBQVEsS0FBSyxJQUFqQixFQUF1QjtBQUNuQkMsTUFBQUEsV0FBVyxDQUFDQyxlQUFaLENBQTRCeEYsZUFBZSxDQUFDeUYscUJBQTVDO0FBQ0gsS0FGRCxNQUVPO0FBQ0hGLE1BQUFBLFdBQVcsQ0FBQ0csZUFBWixDQUE0QkosUUFBNUI7QUFDSDtBQUNKLEdBOVZ5Qjs7QUFnVzFCO0FBQ0o7QUFDQTtBQUNBO0FBQ0lqQixFQUFBQSw2QkFwVzBCLHlDQW9XSS9DLEtBcFdKLEVBb1dXO0FBRWpDO0FBQ0EsUUFBTXFFLFVBQVUsR0FBRzVHLHFCQUFxQixDQUFDVSxpQkFBdEIsQ0FBd0M2QixLQUF4QyxDQUFuQixDQUhpQyxDQUtqQzs7QUFDQXZDLElBQUFBLHFCQUFxQixDQUFDQyxRQUF0QixDQUErQnlGLElBQS9CLENBQW9DLFdBQXBDLEVBQWlELHFCQUFqRCxFQUF3RWtCLFVBQXhFLEVBTmlDLENBUWpDOztBQUNBMUMsSUFBQUEsSUFBSSxDQUFDQyxXQUFMO0FBQ0gsR0E5V3lCOztBQWdYMUI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNJMEMsRUFBQUEsZ0JBclgwQiw0QkFxWFRDLFFBclhTLEVBcVhDO0FBQ3ZCLFFBQU1DLE1BQU0sR0FBR0QsUUFBZjtBQUNBQyxJQUFBQSxNQUFNLENBQUNDLElBQVAsR0FBY2hILHFCQUFxQixDQUFDQyxRQUF0QixDQUErQnlGLElBQS9CLENBQW9DLFlBQXBDLENBQWQ7QUFDQSxRQUFNdUIsU0FBUyxHQUFHLEVBQWxCO0FBQ0EvRyxJQUFBQSxDQUFDLENBQUMsZ0VBQUQsQ0FBRCxDQUFvRWdILElBQXBFLENBQXlFLFVBQUNDLEtBQUQsRUFBUUMsR0FBUixFQUFnQjtBQUNyRixVQUFJbEgsQ0FBQyxDQUFDa0gsR0FBRCxDQUFELENBQU9DLElBQVAsQ0FBWSxJQUFaLENBQUosRUFBdUI7QUFDbkJKLFFBQUFBLFNBQVMsQ0FBQ0ssSUFBVixDQUFlO0FBQ1hDLFVBQUFBLE9BQU8sRUFBRXJILENBQUMsQ0FBQ2tILEdBQUQsQ0FBRCxDQUFPQyxJQUFQLENBQVksSUFBWixDQURFO0FBRVhHLFVBQUFBLFFBQVEsRUFBRXRILENBQUMsQ0FBQ2tILEdBQUQsQ0FBRCxDQUFPMUQsSUFBUCxDQUFZLFdBQVosRUFBeUJLLFFBQXpCLENBQWtDLGNBQWxDLENBRkM7QUFHWDBELFVBQUFBLFFBQVEsRUFBRU47QUFIQyxTQUFmO0FBS0g7QUFDSixLQVJEO0FBU0FKLElBQUFBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZVSxNQUFaLEdBQXFCQyxJQUFJLENBQUNDLFNBQUwsQ0FBZVgsU0FBZixDQUFyQjtBQUVBLFdBQU9GLE1BQVA7QUFDSCxHQXJZeUI7O0FBdVkxQjtBQUNKO0FBQ0E7QUFDQTtBQUNJYyxFQUFBQSxlQTNZMEIsMkJBMllWdEIsUUEzWVUsRUEyWUE7QUFDdEJyRyxJQUFBQSxDQUFDLENBQUMsaUJBQUQsQ0FBRCxDQUFxQjRILE1BQXJCOztBQUNBLFFBQUksQ0FBQ3ZCLFFBQVEsQ0FBQ3dCLE9BQWQsRUFBdUI7QUFDbkI3RCxNQUFBQSxJQUFJLENBQUM4RCxhQUFMLENBQW1CQyxXQUFuQixDQUErQixVQUEvQjtBQUNBakksTUFBQUEscUJBQXFCLENBQUNrSSx3QkFBdEIsQ0FBK0MzQixRQUEvQztBQUNILEtBSEQsTUFHTztBQUNIckcsTUFBQUEsQ0FBQyxDQUFDLG9CQUFELENBQUQsQ0FBd0I0SCxNQUF4QjtBQUNIOztBQUNEOUgsSUFBQUEscUJBQXFCLENBQUNpRyx3QkFBdEI7QUFDSCxHQXBaeUI7O0FBc1oxQjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0lpQyxFQUFBQSx3QkEzWjBCLG9DQTJaRDNCLFFBM1pDLEVBMlpTO0FBQy9CLFFBQUlBLFFBQVEsQ0FBQzRCLFFBQVQsSUFBcUI1QixRQUFRLENBQUM0QixRQUFULENBQWtCQyxLQUEzQyxFQUFrRDtBQUM5QyxVQUFNQyxJQUFJLEdBQUduSSxDQUFDLENBQUMsT0FBRCxFQUFVO0FBQUUsaUJBQU8scUJBQVQ7QUFBZ0NvSSxRQUFBQSxFQUFFLEVBQUU7QUFBcEMsT0FBVixDQUFkO0FBQ0EsVUFBTUMsT0FBTyxHQUFHckksQ0FBQyxDQUFDLE9BQUQsRUFBVTtBQUFFLGlCQUFPO0FBQVQsT0FBVixDQUFELENBQWdDc0ksSUFBaEMsQ0FBcUN2SCxlQUFlLENBQUN3SCxvQkFBckQsQ0FBaEI7QUFDQUosTUFBQUEsSUFBSSxDQUFDSyxNQUFMLENBQVlILE9BQVo7QUFDQSxVQUFNSSxHQUFHLEdBQUd6SSxDQUFDLENBQUMsTUFBRCxFQUFTO0FBQUUsaUJBQU87QUFBVCxPQUFULENBQWI7QUFDQSxVQUFNMEksV0FBVyxHQUFHLElBQUlDLEdBQUosRUFBcEI7QUFDQXRDLE1BQUFBLFFBQVEsQ0FBQzRCLFFBQVQsQ0FBa0JDLEtBQWxCLENBQXdCVSxPQUF4QixDQUFnQyxVQUFBQyxVQUFVLEVBQUk7QUFDMUNBLFFBQUFBLFVBQVUsQ0FBQ0QsT0FBWCxDQUFtQixVQUFBVixLQUFLLEVBQUk7QUFDeEIsY0FBSVksV0FBVyxHQUFFLEVBQWpCOztBQUNBLGNBQUcvSCxlQUFlLENBQUNtSCxLQUFLLENBQUNhLE9BQVAsQ0FBZixLQUFtQ0MsU0FBdEMsRUFBZ0Q7QUFDNUNGLFlBQUFBLFdBQVcsR0FBR1osS0FBSyxDQUFDYSxPQUFwQjtBQUNILFdBRkQsTUFFSztBQUNERCxZQUFBQSxXQUFXLEdBQUcvSCxlQUFlLENBQUNtSCxLQUFLLENBQUNhLE9BQVAsQ0FBN0I7QUFDSDs7QUFDRCxjQUFJTCxXQUFXLENBQUNPLEdBQVosQ0FBZ0JILFdBQWhCLENBQUosRUFBa0M7QUFDOUI7QUFDSDs7QUFDREosVUFBQUEsV0FBVyxDQUFDUSxHQUFaLENBQWdCaEIsS0FBSyxDQUFDYSxPQUF0QjtBQUNBTixVQUFBQSxHQUFHLENBQUNELE1BQUosQ0FBV3hJLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVXNJLElBQVYsQ0FBZVEsV0FBZixDQUFYO0FBQ0gsU0FaRDtBQWFILE9BZEQ7QUFlQVgsTUFBQUEsSUFBSSxDQUFDSyxNQUFMLENBQVlDLEdBQVo7QUFDQXpJLE1BQUFBLENBQUMsQ0FBQyxlQUFELENBQUQsQ0FBbUJtSixNQUFuQixDQUEwQmhCLElBQTFCO0FBQ0EsYUFBT0EsSUFBUDtBQUNIO0FBQ0osR0FyYnlCOztBQXViMUI7QUFDSjtBQUNBO0FBQ0lqRixFQUFBQSxTQTFiMEIsdUJBMGJkO0FBQ1I7QUFDQSxRQUFJcEQscUJBQXFCLENBQUNLLG1CQUF0QixDQUEwQzBELFFBQTFDLENBQW1ELFlBQW5ELENBQUosRUFBc0U7QUFDbEVHLE1BQUFBLElBQUksQ0FBQ3ZELGFBQUwsQ0FBbUJXLFdBQW5CLENBQStCUixLQUEvQixHQUF1Q2QscUJBQXFCLENBQUNnRCw2QkFBN0Q7QUFDSCxLQUZELE1BRU8sSUFBSWhELHFCQUFxQixDQUFDSSxZQUF0QixDQUFtQytDLEdBQW5DLE9BQTZDbkQscUJBQXFCLENBQUNRLGNBQXZFLEVBQXVGO0FBQzFGMEQsTUFBQUEsSUFBSSxDQUFDdkQsYUFBTCxDQUFtQlcsV0FBbkIsQ0FBK0JSLEtBQS9CLEdBQXVDLEVBQXZDO0FBQ0gsS0FGTSxNQUVBO0FBQ0hvRCxNQUFBQSxJQUFJLENBQUN2RCxhQUFMLENBQW1CVyxXQUFuQixDQUErQlIsS0FBL0IsR0FBdUNkLHFCQUFxQixDQUFDNEMsMkJBQTdEO0FBQ0gsS0FSTyxDQVVSOzs7QUFDQSxRQUFJNUMscUJBQXFCLENBQUNHLGlCQUF0QixDQUF3Q2dELEdBQXhDLE9BQWtEbkQscUJBQXFCLENBQUNRLGNBQTVFLEVBQTRGO0FBQ3hGMEQsTUFBQUEsSUFBSSxDQUFDdkQsYUFBTCxDQUFtQlEsZ0JBQW5CLENBQW9DTCxLQUFwQyxHQUE0QyxFQUE1QztBQUNILEtBRkQsTUFFTztBQUNIb0QsTUFBQUEsSUFBSSxDQUFDdkQsYUFBTCxDQUFtQlEsZ0JBQW5CLENBQW9DTCxLQUFwQyxHQUE0Q2QscUJBQXFCLENBQUNvQyxxQkFBbEU7QUFDSDtBQUNKLEdBMWN5Qjs7QUE0YzFCO0FBQ0o7QUFDQTtBQUNJbUQsRUFBQUEsY0EvYzBCLDRCQStjVDtBQUNickIsSUFBQUEsSUFBSSxDQUFDakUsUUFBTCxHQUFnQkQscUJBQXFCLENBQUNDLFFBQXRDO0FBQ0FpRSxJQUFBQSxJQUFJLENBQUNvRixHQUFMLGFBQWNDLGFBQWQsMkJBRmEsQ0FFdUM7O0FBQ3BEckYsSUFBQUEsSUFBSSxDQUFDdkQsYUFBTCxHQUFxQlgscUJBQXFCLENBQUNXLGFBQTNDLENBSGEsQ0FHNkM7O0FBQzFEdUQsSUFBQUEsSUFBSSxDQUFDMkMsZ0JBQUwsR0FBd0I3RyxxQkFBcUIsQ0FBQzZHLGdCQUE5QyxDQUphLENBSW1EOztBQUNoRTNDLElBQUFBLElBQUksQ0FBQzJELGVBQUwsR0FBdUI3SCxxQkFBcUIsQ0FBQzZILGVBQTdDLENBTGEsQ0FLaUQ7O0FBQzlEM0QsSUFBQUEsSUFBSSxDQUFDakIsVUFBTDtBQUNIO0FBdGR5QixDQUE5QixDLENBeWRBOztBQUNBL0MsQ0FBQyxDQUFDc0osUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBTTtBQUNwQnpKLEVBQUFBLHFCQUFxQixDQUFDaUQsVUFBdEI7QUFDSCxDQUZEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pa29QQlggLSBmcmVlIHBob25lIHN5c3RlbSBmb3Igc21hbGwgYnVzaW5lc3NcbiAqIENvcHlyaWdodCDCqSAyMDE3LTIwMjMgQWxleGV5IFBvcnRub3YgYW5kIE5pa29sYXkgQmVrZXRvdlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS5cbiAqIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuXG4vKiBnbG9iYWwgZ2xvYmFsUm9vdFVybCxnbG9iYWxUcmFuc2xhdGUsIEZvcm0sIFBhc3N3b3JkU2NvcmUsIFBieEFwaSwgVXNlck1lc3NhZ2UsIFNvdW5kRmlsZXNTZWxlY3RvciwgJCAqL1xuXG4vKipcbiAqIEEgbW9kdWxlIHRvIGhhbmRsZSBtb2RpZmljYXRpb24gb2YgZ2VuZXJhbCBzZXR0aW5ncy5cbiAqL1xuY29uc3QgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5ID0ge1xuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBmb3JtLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJGZvcm1PYmo6ICQoJyNnZW5lcmFsLXNldHRpbmdzLWZvcm0nKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSB3ZWIgYWRtaW4gcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkd2ViQWRtaW5QYXNzd29yZDogJCgnI1dlYkFkbWluUGFzc3dvcmQnKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBzc2ggcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc3NoUGFzc3dvcmQ6ICQoJyNTU0hQYXNzd29yZCcpLFxuXG4gICAgLyoqXG4gICAgICogalF1ZXJ5IG9iamVjdCBmb3IgdGhlIHdlYiBzc2ggcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkZGlzYWJsZVNTSFBhc3N3b3JkOiAkKCcjU1NIRGlzYWJsZVBhc3N3b3JkTG9naW5zJykucGFyZW50KCcuY2hlY2tib3gnKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBTU0ggcGFzc3dvcmQgZmllbGRzXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc3NoUGFzc3dvcmRTZWdtZW50OiAkKCcjb25seS1pZi1wYXNzd29yZC1lbmFibGVkJyksXG5cbiAgICAvKipcbiAgICAgKiBJZiBwYXNzd29yZCBzZXQsIGl0IHdpbGwgYmUgaGlkZWQgZnJvbSB3ZWIgdWkuXG4gICAgICovXG4gICAgaGlkZGVuUGFzc3dvcmQ6ICd4eHh4eHh4JyxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSByZWNvcmRzIHJldGVudGlvbiBwZXJpb2Qgc2xpZGVyLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyOiAkKCcjUEJYUmVjb3JkU2F2ZVBlcmlvZFNsaWRlcicpLFxuXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgcGVyaW9kIHZhbHVlcyBmb3IgdGhlIHJlY29yZHMgcmV0ZW50aW9uLlxuICAgICAqL1xuICAgIHNhdmVSZWNvcmRzUGVyaW9kOiBbJzMwJywgJzkwJywgJzE4MCcsICczNjAnLCAnMTA4MCcsICcnXSxcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmb3JtIGZpZWxkcyBiZWZvcmUgc3VibWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdmFsaWRhdGVSdWxlczogeyAvLyBnZW5lcmFsU2V0dGluZ3NNb2RpZnkudmFsaWRhdGVSdWxlcy5TU0hQYXNzd29yZC5ydWxlc1xuICAgICAgICBwYnhuYW1lOiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnUEJYTmFtZScsXG4gICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVFbXB0eVBCWE5hbWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFdlYkFkbWluUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdXZWJBZG1pblBhc3N3b3JkJyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgV2ViQWRtaW5QYXNzd29yZFJlcGVhdDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1dlYkFkbWluUGFzc3dvcmRSZXBlYXQnLFxuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYXRjaFtXZWJBZG1pblBhc3N3b3JkXScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV2ViUGFzc3dvcmRzRmllbGREaWZmZXJlbnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFNTSFBhc3N3b3JkOiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnU1NIUGFzc3dvcmQnLFxuICAgICAgICAgICAgcnVsZXM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICBTU0hQYXNzd29yZFJlcGVhdDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1NTSFBhc3N3b3JkUmVwZWF0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWF0Y2hbU1NIUGFzc3dvcmRdJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVTU0hQYXNzd29yZHNGaWVsZERpZmZlcmVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgV0VCUG9ydDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1dFQlBvcnQnLFxuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyWzEuLjY1NTM1XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCUG9ydE91dE9mUmFuZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbV0VCSFRUUFNQb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb1dFQlBvcnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbQUpBTVBvcnRUTFNdJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCUG9ydE5vdEVxdWFsVG9BamFtVExTUG9ydCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgV0VCSFRUUFNQb3J0OiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnV0VCSFRUUFNQb3J0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZWdlclsxLi42NTUzNV0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE91dE9mUmFuZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbV0VCUG9ydF0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9XRUJQb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0VExTXScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb0FqYW1UTFNQb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBBSkFNUG9ydDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ0FKQU1Qb3J0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZWdlclsxLi42NTUzNV0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZUFKQU1Qb3J0T3V0T2ZSYW5nZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RpZmZlcmVudFtBSkFNUG9ydFRMU10nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZUFKQU1Qb3J0T3V0T2ZSYW5nZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gUnVsZXMgZm9yIHRoZSB3ZWIgYWRtaW4gcGFzc3dvcmQgZmllbGQgd2hlbiBpdCBub3QgZXF1YWwgdG8gaGlkZGVuUGFzc3dvcmRcbiAgICB3ZWJBZG1pblBhc3N3b3JkUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlRW1wdHlXZWJQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ21pbkxlbmd0aFs1XScsXG4gICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdlYWtXZWJQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1thLXpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb0xvd1NpbXZvbFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbm90UmVnRXhwJyxcbiAgICAgICAgICAgIHZhbHVlOiAvXFxkLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb051bWJlcnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1tBLVpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sXG4gICAgICAgIH1cbiAgICBdLFxuICAgIC8vIFJ1bGVzIGZvciB0aGUgU1NIIHBhc3N3b3JkIGZpZWxkIHdoZW4gU1NIIGxvZ2luIHRocm91Z2ggdGhlIHBhc3N3b3JkIGVuYWJsZWQsIGFuZCBpdCBub3QgZXF1YWwgdG8gaGlkZGVuUGFzc3dvcmRcbiAgICBhZGRpdGlvbmFsU3NoVmFsaWRSdWxlc1Bhc3M6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlRW1wdHlTU0hQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ21pbkxlbmd0aFs1XScsXG4gICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdlYWtTU0hQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1thLXpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfU1NIUGFzc3dvcmQgKyAnPC9iPjogJyArIGdsb2JhbFRyYW5zbGF0ZS5nc19QYXNzd29yZE5vTG93U2ltdm9sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RSZWdFeHAnLFxuICAgICAgICAgICAgdmFsdWU6IC9cXGQvLFxuICAgICAgICAgICAgcHJvbXB0OiAnPGI+JyArIGdsb2JhbFRyYW5zbGF0ZS5nc19TU0hQYXNzd29yZCArICc8L2I+OiAnICsgZ2xvYmFsVHJhbnNsYXRlLmdzX1Bhc3N3b3JkTm9OdW1iZXJzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RSZWdFeHAnLFxuICAgICAgICAgICAgdmFsdWU6IC9bQS1aXS8sXG4gICAgICAgICAgICBwcm9tcHQ6ICc8Yj4nICsgZ2xvYmFsVHJhbnNsYXRlLmdzX1NTSFBhc3N3b3JkICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sXG4gICAgICAgIH1cbiAgICBdLFxuXG4gICAgLy8gUnVsZXMgZm9yIHRoZSBTU0ggcGFzc3dvcmQgZmllbGQgd2hlbiBTU0ggbG9naW4gdGhyb3VnaCB0aGUgcGFzc3dvcmQgZGlzYWJsZWRcbiAgICBhZGRpdGlvbmFsU3NoVmFsaWRSdWxlc05vUGFzczogW1xuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnZW1wdHknLFxuICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVFbXB0eVNTSFBhc3N3b3JkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbWluTGVuZ3RoWzVdJyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV2Vha1NTSFBhc3N3b3JkLFxuICAgICAgICB9XG4gICAgXSxcblxuICAgIC8qKlxuICAgICAqICBJbml0aWFsaXplIG1vZHVsZSB3aXRoIGV2ZW50IGJpbmRpbmdzIGFuZCBjb21wb25lbnQgaW5pdGlhbGl6YXRpb25zLlxuICAgICAqL1xuICAgIGluaXRpYWxpemUoKSB7XG5cbiAgICAgICAgLy8gV2hlbiBXZWJBZG1pblBhc3N3b3JkIGlucHV0IGlzIGNoYW5nZWQsIHJlY2FsY3VsYXRlIHRoZSBwYXNzd29yZCBzdHJlbmd0aFxuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHdlYkFkbWluUGFzc3dvcmQub24oJ2tleXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kd2ViQWRtaW5QYXNzd29yZC52YWwoKSAhPT0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmhpZGRlblBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuICAgICAgICAgICAgICAgIFBhc3N3b3JkU2NvcmUuY2hlY2tQYXNzU3RyZW5ndGgoe1xuICAgICAgICAgICAgICAgICAgICBwYXNzOiBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHdlYkFkbWluUGFzc3dvcmQudmFsKCksXG4gICAgICAgICAgICAgICAgICAgIGJhcjogJCgnLnBhc3N3b3JkLXNjb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246ICQoJy5wYXNzd29yZC1zY29yZS1zZWN0aW9uJyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdoZW4gU1NIUGFzc3dvcmQgaW5wdXQgaXMgY2hhbmdlZCwgcmVjYWxjdWxhdGUgdGhlIHBhc3N3b3JkIHN0cmVuZ3RoXG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQub24oJ2tleXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQudmFsKCkgIT09IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5oaWRkZW5QYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5pbml0UnVsZXMoKTtcbiAgICAgICAgICAgICAgICBQYXNzd29yZFNjb3JlLmNoZWNrUGFzc1N0cmVuZ3RoKHtcbiAgICAgICAgICAgICAgICAgICAgcGFzczogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRzc2hQYXNzd29yZC52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgYmFyOiAkKCcuc3NoLXBhc3N3b3JkLXNjb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246ICQoJy5zc2gtcGFzc3dvcmQtc2NvcmUtc2VjdGlvbicpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGUgdGFiIG5hdmlnYXRpb24gd2l0aCBoaXN0b3J5IHN1cHBvcnRcbiAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtbWVudScpLmZpbmQoJy5pdGVtJykudGFiKHtcbiAgICAgICAgICAgIGhpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICBoaXN0b3J5VHlwZTogJ2hhc2gnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGUgZHJvcGRvd25zIG9uIHRoZSBmb3JtXG4gICAgICAgICQoJyNnZW5lcmFsLXNldHRpbmdzLWZvcm0gLmRyb3Bkb3duJykuZHJvcGRvd24oKTtcblxuICAgICAgICAvLyBFbmFibGUgY2hlY2tib3hlcyBvbiB0aGUgZm9ybVxuICAgICAgICAkKCcjZ2VuZXJhbC1zZXR0aW5ncy1mb3JtIC5jaGVja2JveCcpLmNoZWNrYm94KCk7XG5cbiAgICAgICAgLy8gRW5hYmxlIHRhYmxlIGRyYWctbi1kcm9wIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgJCgnI2F1ZGlvLWNvZGVjcy10YWJsZSwgI3ZpZGVvLWNvZGVjcy10YWJsZScpLnRhYmxlRG5EKHtcbiAgICAgICAgICAgIG9uRHJvcCgpIHtcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBldmVudCB0byBhY2tub3dsZWRnZSB0aGUgbW9kaWZpY2F0aW9uXG4gICAgICAgICAgICAgICAgRm9ybS5kYXRhQ2hhbmdlZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRHJhZ0NsYXNzOiAnaG92ZXJpbmdSb3cnLFxuICAgICAgICAgICAgZHJhZ0hhbmRsZTogJy5kcmFnSGFuZGxlJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5hYmxlIGRyb3Bkb3duIHdpdGggc291bmQgZmlsZSBzZWxlY3Rpb25cbiAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtZm9ybSAuYXVkaW8tbWVzc2FnZS1zZWxlY3QnKS5kcm9wZG93bihTb3VuZEZpbGVzU2VsZWN0b3IuZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhFbXB0eSgpKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHJlY29yZHMgc2F2ZSBwZXJpb2Qgc2xpZGVyXG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kcmVjb3Jkc1NhdmVQZXJpb2RTbGlkZXJcbiAgICAgICAgICAgIC5zbGlkZXIoe1xuICAgICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgICBtYXg6IDUsXG4gICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICBzbW9vdGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaW50ZXJwcmV0TGFiZWw6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVHJhbnNsYXRlLmdzX1N0b3JlMU1vbnRoT2ZSZWNvcmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVHJhbnNsYXRlLmdzX1N0b3JlM01vbnRoc09mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZTZNb250aHNPZlJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUcmFuc2xhdGUuZ3NfU3RvcmUxWWVhck9mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZTNZZWFyc09mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZUFsbFBvc3NpYmxlUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsc1t2YWx1ZV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZvcm1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRpYWxpemVGb3JtKCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gcnVsZXNcbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuXG4gICAgICAgIC8vIFNob3csIGhpZGUgc3NoIHBhc3N3b3JkIHNlZ21lbnRcbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRkaXNhYmxlU1NIUGFzc3dvcmQuY2hlY2tib3goe1xuICAgICAgICAgICAgJ29uQ2hhbmdlJzogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LnNob3dIaWRlU1NIUGFzc3dvcmRcbiAgICAgICAgfSk7XG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5zaG93SGlkZVNTSFBhc3N3b3JkKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgcmVjb3JkcyBzYXZlIHBlcmlvZCBzbGlkZXJcbiAgICAgICAgY29uc3QgcmVjb3JkU2F2ZVBlcmlvZCA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWUnLCAnUEJYUmVjb3JkU2F2ZVBlcmlvZCcpO1xuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyXG4gICAgICAgICAgICAuc2xpZGVyKCdzZXQgdmFsdWUnLCBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuc2F2ZVJlY29yZHNQZXJpb2QuaW5kZXhPZihyZWNvcmRTYXZlUGVyaW9kKSwgZmFsc2UpO1xuXG4gICAgICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lciB0byBoYW5kbGUgdGFiIGFjdGl2YXRpb25cbiAgICAgICAgJCh3aW5kb3cpLm9uKCdHUy1BY3RpdmF0ZVRhYicsIChldmVudCwgbmFtZVRhYikgPT4ge1xuICAgICAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtbWVudScpLmZpbmQoJy5pdGVtJykudGFiKCdjaGFuZ2UgdGFiJywgbmFtZVRhYik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTaG93LCBoaWRlIHNzaCBwYXNzd29yZCBzZWdtZW50IGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgdXNlIFNTSCBwYXNzd29yZCBjaGVja2JveC5cbiAgICAgKi9cbiAgICBzaG93SGlkZVNTSFBhc3N3b3JkKCl7XG4gICAgICAgIGlmIChnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJGRpc2FibGVTU0hQYXNzd29yZC5jaGVja2JveCgnaXMgY2hlY2tlZCcpKSB7XG4gICAgICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkU2VnbWVudC5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkU2VnbWVudC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGNvbmRpdGlvbnMgZm9yIGRlbGV0aW5nIGFsbCByZWNvcmRzLlxuICAgICAqIENvbXBhcmVzIHRoZSB2YWx1ZSBvZiB0aGUgJ2RlbGV0ZUFsbElucHV0JyBmaWVsZCB3aXRoIGEgcGhyYXNlLlxuICAgICAqIElmIHRoZXkgbWF0Y2gsIGl0IHRyaWdnZXJzIGEgc3lzdGVtIHJlc3RvcmUgdG8gZGVmYXVsdCBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjaGVja0RlbGV0ZUFsbENvbmRpdGlvbnMoKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiAnZGVsZXRlQWxsSW5wdXQnIGZpZWxkLlxuICAgICAgICBjb25zdCBkZWxldGVBbGxJbnB1dCA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWUnLCAnZGVsZXRlQWxsSW5wdXQnKTtcblxuICAgICAgICAvLyBJZiB0aGUgZW50ZXJlZCBwaHJhc2UgbWF0Y2hlcyB0aGUgcGhyYXNlIGluICdnbG9iYWxUcmFuc2xhdGUuZ3NfRW50ZXJEZWxldGVBbGxQaHJhc2UnLFxuICAgICAgICAvLyBjYWxsICdQYnhBcGkuU3lzdGVtUmVzdG9yZURlZmF1bHRTZXR0aW5ncycgdG8gcmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzLlxuICAgICAgICBpZiAoZGVsZXRlQWxsSW5wdXQgPT09IGdsb2JhbFRyYW5zbGF0ZS5nc19FbnRlckRlbGV0ZUFsbFBocmFzZSkge1xuICAgICAgICAgICAgUGJ4QXBpLlN5c3RlbVJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJSZXN0b3JlRGVmYXVsdFNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcmVzcG9uc2UgYWZ0ZXIgcmVzdG9yaW5nIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcmVzcG9uc2UgLSBSZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYWZ0ZXIgcmVzdG9yaW5nIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICovXG4gICAgY2JBZnRlclJlc3RvcmVEZWZhdWx0U2V0dGluZ3MocmVzcG9uc2UpIHtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2UgaXMgdHJ1ZSwgZGlzcGxheSBhIHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgICAvLyBvdGhlcndpc2UsIGRpc3BsYXkgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd0luZm9ybWF0aW9uKGdsb2JhbFRyYW5zbGF0ZS5nc19BbGxTZXR0aW5nc0RlbGV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd011bHRpU3RyaW5nKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZXZlbnQgYWZ0ZXIgdGhlIHNlbGVjdCBzYXZlIHBlcmlvZCBzbGlkZXIgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgc2VsZWN0ZWQgdmFsdWUgZnJvbSB0aGUgc2xpZGVyLlxuICAgICAqL1xuICAgIGNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyKHZhbHVlKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzYXZlIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzbGlkZXIgdmFsdWUuXG4gICAgICAgIGNvbnN0IHNhdmVQZXJpb2QgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuc2F2ZVJlY29yZHNQZXJpb2RbdmFsdWVdO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZm9ybSB2YWx1ZSBmb3IgJ1BCWFJlY29yZFNhdmVQZXJpb2QnIHRvIHRoZSBzZWxlY3RlZCBzYXZlIHBlcmlvZC5cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqLmZvcm0oJ3NldCB2YWx1ZScsICdQQlhSZWNvcmRTYXZlUGVyaW9kJywgc2F2ZVBlcmlvZCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZXZlbnQgdG8gYWNrbm93bGVkZ2UgdGhlIG1vZGlmaWNhdGlvblxuICAgICAgICBGb3JtLmRhdGFDaGFuZ2VkKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZvcm0gaXMgc2VudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzZXR0aW5ncyAtIFRoZSBjdXJyZW50IHNldHRpbmdzIG9mIHRoZSBmb3JtXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBUaGUgdXBkYXRlZCBzZXR0aW5ncyBvZiB0aGUgZm9ybVxuICAgICAqL1xuICAgIGNiQmVmb3JlU2VuZEZvcm0oc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2V0dGluZ3M7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqLmZvcm0oJ2dldCB2YWx1ZXMnKTtcbiAgICAgICAgY29uc3QgYXJyQ29kZWNzID0gW107XG4gICAgICAgICQoJyNhdWRpby1jb2RlY3MtdGFibGUgLmNvZGVjLXJvdywgI3ZpZGVvLWNvZGVjcy10YWJsZSAuY29kZWMtcm93JykuZWFjaCgoaW5kZXgsIG9iaikgPT4ge1xuICAgICAgICAgICAgaWYgKCQob2JqKS5hdHRyKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgYXJyQ29kZWNzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2RlY0lkOiAkKG9iaikuYXR0cignaWQnKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICQob2JqKS5maW5kKCcuY2hlY2tib3gnKS5jaGVja2JveCgnaXMgdW5jaGVja2VkJyksXG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBpbmRleCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5kYXRhLmNvZGVjcyA9IEpTT04uc3RyaW5naWZ5KGFyckNvZGVjcyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBmb3JtIGhhcyBiZWVuIHNlbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIC0gVGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhZnRlciB0aGUgZm9ybSBpcyBzZW50XG4gICAgICovXG4gICAgY2JBZnRlclNlbmRGb3JtKHJlc3BvbnNlKSB7XG4gICAgICAgICQoXCIjZXJyb3ItbWVzc2FnZXNcIikucmVtb3ZlKCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgRm9ybS4kc3VibWl0QnV0dG9uLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmdlbmVyYXRlRXJyb3JNZXNzYWdlSHRtbChyZXNwb25zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKCcucGFzc3dvcmQtdmFsaWRhdGUnKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuY2hlY2tEZWxldGVBbGxDb25kaXRpb25zKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiBjb2xsZWN0cyBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGFib3V0IGEgZGF0YSBzYXZpbmcgZXJyb3JcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdlbmVyYXRlRXJyb3JNZXNzYWdlSHRtbChyZXNwb25zZSkge1xuICAgICAgICBpZiAocmVzcG9uc2UubWVzc2FnZXMgJiYgcmVzcG9uc2UubWVzc2FnZXMuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0ICRkaXYgPSAkKCc8ZGl2PicsIHsgY2xhc3M6ICd1aSBuZWdhdGl2ZSBtZXNzYWdlJywgaWQ6ICdlcnJvci1tZXNzYWdlcycgfSk7XG4gICAgICAgICAgICBjb25zdCAkaGVhZGVyID0gJCgnPGRpdj4nLCB7IGNsYXNzOiAnaGVhZGVyJyB9KS50ZXh0KGdsb2JhbFRyYW5zbGF0ZS5nc19FcnJvclNhdmVTZXR0aW5ncyk7XG4gICAgICAgICAgICAkZGl2LmFwcGVuZCgkaGVhZGVyKTtcbiAgICAgICAgICAgIGNvbnN0ICR1bCA9ICQoJzx1bD4nLCB7IGNsYXNzOiAnbGlzdCcgfSk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHJlc3BvbnNlLm1lc3NhZ2VzLmVycm9yLmZvckVhY2goZXJyb3JBcnJheSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyb3JBcnJheS5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRDb250ZW50ID0nJztcbiAgICAgICAgICAgICAgICAgICAgaWYoZ2xvYmFsVHJhbnNsYXRlW2Vycm9yLm1lc3NhZ2VdID09PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dENvbnRlbnQgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50ID0gZ2xvYmFsVHJhbnNsYXRlW2Vycm9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc1NldC5oYXModGV4dENvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNTZXQuYWRkKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAkdWwuYXBwZW5kKCQoJzxsaT4nKS50ZXh0KHRleHRDb250ZW50KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICRkaXYuYXBwZW5kKCR1bCk7XG4gICAgICAgICAgICAkKCcjc3VibWl0YnV0dG9uJykuYmVmb3JlKCRkaXYpO1xuICAgICAgICAgICAgcmV0dXJuICRkaXY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgdmFsaWRhdGlvbiBydWxlcyBvZiB0aGUgZm9ybVxuICAgICAqL1xuICAgIGluaXRSdWxlcygpIHtcbiAgICAgICAgLy8gU1NIUGFzc3dvcmRcbiAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZGlzYWJsZVNTSFBhc3N3b3JkLmNoZWNrYm94KCdpcyBjaGVja2VkJykpIHtcbiAgICAgICAgICAgIEZvcm0udmFsaWRhdGVSdWxlcy5TU0hQYXNzd29yZC5ydWxlcyA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5hZGRpdGlvbmFsU3NoVmFsaWRSdWxlc05vUGFzcztcbiAgICAgICAgfSBlbHNlIGlmIChnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkLnZhbCgpID09PSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuaGlkZGVuUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIEZvcm0udmFsaWRhdGVSdWxlcy5TU0hQYXNzd29yZC5ydWxlcyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzLlNTSFBhc3N3b3JkLnJ1bGVzID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmFkZGl0aW9uYWxTc2hWYWxpZFJ1bGVzUGFzcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlYkFkbWluUGFzc3dvcmRcbiAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kd2ViQWRtaW5QYXNzd29yZC52YWwoKSA9PT0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmhpZGRlblBhc3N3b3JkKSB7XG4gICAgICAgICAgICBGb3JtLnZhbGlkYXRlUnVsZXMuV2ViQWRtaW5QYXNzd29yZC5ydWxlcyA9IFtdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzLldlYkFkbWluUGFzc3dvcmQucnVsZXMgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkud2ViQWRtaW5QYXNzd29yZFJ1bGVzO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGZvcm0gd2l0aCBjdXN0b20gc2V0dGluZ3NcbiAgICAgKi9cbiAgICBpbml0aWFsaXplRm9ybSgpIHtcbiAgICAgICAgRm9ybS4kZm9ybU9iaiA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iajtcbiAgICAgICAgRm9ybS51cmwgPSBgJHtnbG9iYWxSb290VXJsfWdlbmVyYWwtc2V0dGluZ3Mvc2F2ZWA7IC8vIEZvcm0gc3VibWlzc2lvbiBVUkxcbiAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LnZhbGlkYXRlUnVsZXM7IC8vIEZvcm0gdmFsaWRhdGlvbiBydWxlc1xuICAgICAgICBGb3JtLmNiQmVmb3JlU2VuZEZvcm0gPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuY2JCZWZvcmVTZW5kRm9ybTsgLy8gQ2FsbGJhY2sgYmVmb3JlIGZvcm0gaXMgc2VudFxuICAgICAgICBGb3JtLmNiQWZ0ZXJTZW5kRm9ybSA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5jYkFmdGVyU2VuZEZvcm07IC8vIENhbGxiYWNrIGFmdGVyIGZvcm0gaXMgc2VudFxuICAgICAgICBGb3JtLmluaXRpYWxpemUoKTtcbiAgICB9XG59O1xuXG4vLyBXaGVuIHRoZSBkb2N1bWVudCBpcyByZWFkeSwgaW5pdGlhbGl6ZSB0aGUgZ2VuZXJhbFNldHRpbmdzIG1hbmFnZW1lbnQgaW50ZXJmYWNlLlxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5pbml0aWFsaXplKCk7XG59KTsiXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9HZW5lcmFsU2V0dGluZ3MvZ2VuZXJhbC1zZXR0aW5ncy1tb2RpZnkuanMiXSwibmFtZXMiOlsiZ2VuZXJhbFNldHRpbmdzTW9kaWZ5IiwiJGZvcm1PYmoiLCIkIiwiJHdlYkFkbWluUGFzc3dvcmQiLCIkc3NoUGFzc3dvcmQiLCIkZGlzYWJsZVNTSFBhc3N3b3JkIiwicGFyZW50IiwiJHNzaFBhc3N3b3JkU2VnbWVudCIsImhpZGRlblBhc3N3b3JkIiwiJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyIiwic2F2ZVJlY29yZHNQZXJpb2QiLCJ2YWxpZGF0ZVJ1bGVzIiwicGJ4bmFtZSIsImlkZW50aWZpZXIiLCJydWxlcyIsInR5cGUiLCJwcm9tcHQiLCJnbG9iYWxUcmFuc2xhdGUiLCJnc19WYWxpZGF0ZUVtcHR5UEJYTmFtZSIsIldlYkFkbWluUGFzc3dvcmQiLCJXZWJBZG1pblBhc3N3b3JkUmVwZWF0IiwiZ3NfVmFsaWRhdGVXZWJQYXNzd29yZHNGaWVsZERpZmZlcmVudCIsIlNTSFBhc3N3b3JkIiwiU1NIUGFzc3dvcmRSZXBlYXQiLCJnc19WYWxpZGF0ZVNTSFBhc3N3b3Jkc0ZpZWxkRGlmZmVyZW50IiwiV0VCUG9ydCIsImdzX1ZhbGlkYXRlV0VCUG9ydE91dE9mUmFuZ2UiLCJnc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9XRUJQb3J0IiwiZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0IiwiZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1UTFNQb3J0IiwiV0VCSFRUUFNQb3J0IiwiZ3NfVmFsaWRhdGVXRUJIVFRQU1BvcnRPdXRPZlJhbmdlIiwiZ3NfVmFsaWRhdGVXRUJIVFRQU1BvcnROb3RFcXVhbFRvQWphbVBvcnQiLCJnc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9BamFtVExTUG9ydCIsIkFKQU1Qb3J0IiwiZ3NfVmFsaWRhdGVBSkFNUG9ydE91dE9mUmFuZ2UiLCJ3ZWJBZG1pblBhc3N3b3JkUnVsZXMiLCJnc19WYWxpZGF0ZUVtcHR5V2ViUGFzc3dvcmQiLCJnc19WYWxpZGF0ZVdlYWtXZWJQYXNzd29yZCIsInZhbHVlIiwiZ3NfUGFzc3dvcmRzIiwiZ3NfUGFzc3dvcmROb0xvd1NpbXZvbCIsImdzX1Bhc3N3b3JkTm9OdW1iZXJzIiwiZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sIiwiYWRkaXRpb25hbFNzaFZhbGlkUnVsZXNQYXNzIiwiZ3NfVmFsaWRhdGVFbXB0eVNTSFBhc3N3b3JkIiwiZ3NfVmFsaWRhdGVXZWFrU1NIUGFzc3dvcmQiLCJnc19TU0hQYXNzd29yZCIsImFkZGl0aW9uYWxTc2hWYWxpZFJ1bGVzTm9QYXNzIiwiaW5pdGlhbGl6ZSIsIm9uIiwidmFsIiwiaW5pdFJ1bGVzIiwiUGFzc3dvcmRTY29yZSIsImNoZWNrUGFzc1N0cmVuZ3RoIiwicGFzcyIsImJhciIsInNlY3Rpb24iLCJmaW5kIiwidGFiIiwiaGlzdG9yeSIsImhpc3RvcnlUeXBlIiwiZHJvcGRvd24iLCJjaGVja2JveCIsInRhYmxlRG5EIiwib25Ecm9wIiwiRm9ybSIsImRhdGFDaGFuZ2VkIiwib25EcmFnQ2xhc3MiLCJkcmFnSGFuZGxlIiwiU291bmRGaWxlc1NlbGVjdG9yIiwiZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhFbXB0eSIsInNsaWRlciIsIm1pbiIsIm1heCIsInN0ZXAiLCJzbW9vdGgiLCJpbnRlcnByZXRMYWJlbCIsImxhYmVscyIsImdzX1N0b3JlMU1vbnRoT2ZSZWNvcmRzIiwiZ3NfU3RvcmUzTW9udGhzT2ZSZWNvcmRzIiwiZ3NfU3RvcmU2TW9udGhzT2ZSZWNvcmRzIiwiZ3NfU3RvcmUxWWVhck9mUmVjb3JkcyIsImdzX1N0b3JlM1llYXJzT2ZSZWNvcmRzIiwiZ3NfU3RvcmVBbGxQb3NzaWJsZVJlY29yZHMiLCJvbkNoYW5nZSIsImNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyIiwiaW5pdGlhbGl6ZUZvcm0iLCJzaG93SGlkZVNTSFBhc3N3b3JkIiwicmVjb3JkU2F2ZVBlcmlvZCIsImZvcm0iLCJpbmRleE9mIiwid2luZG93IiwiZXZlbnQiLCJuYW1lVGFiIiwiaGlkZSIsInNob3ciLCJjaGVja0RlbGV0ZUFsbENvbmRpdGlvbnMiLCJkZWxldGVBbGxJbnB1dCIsImdzX0VudGVyRGVsZXRlQWxsUGhyYXNlIiwiUGJ4QXBpIiwiU3lzdGVtUmVzdG9yZURlZmF1bHRTZXR0aW5ncyIsImNiQWZ0ZXJSZXN0b3JlRGVmYXVsdFNldHRpbmdzIiwicmVzcG9uc2UiLCJVc2VyTWVzc2FnZSIsInNob3dJbmZvcm1hdGlvbiIsImdzX0FsbFNldHRpbmdzRGVsZXRlZCIsInNob3dNdWx0aVN0cmluZyIsInNhdmVQZXJpb2QiLCJjYkJlZm9yZVNlbmRGb3JtIiwic2V0dGluZ3MiLCJyZXN1bHQiLCJkYXRhIiwiYXJyQ29kZWNzIiwiZWFjaCIsImluZGV4Iiwib2JqIiwiYXR0ciIsInB1c2giLCJjb2RlY0lkIiwiZGlzYWJsZWQiLCJwcmlvcml0eSIsImNvZGVjcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJjYkFmdGVyU2VuZEZvcm0iLCJyZW1vdmUiLCJzdWNjZXNzIiwiJHN1Ym1pdEJ1dHRvbiIsInJlbW92ZUNsYXNzIiwiZ2VuZXJhdGVFcnJvck1lc3NhZ2VIdG1sIiwibWVzc2FnZXMiLCJlcnJvciIsIiRkaXYiLCJpZCIsIiRoZWFkZXIiLCJ0ZXh0IiwiZ3NfRXJyb3JTYXZlU2V0dGluZ3MiLCJhcHBlbmQiLCIkdWwiLCJtZXNzYWdlc1NldCIsIlNldCIsImZvckVhY2giLCJlcnJvckFycmF5IiwidGV4dENvbnRlbnQiLCJtZXNzYWdlIiwidW5kZWZpbmVkIiwiaGFzIiwiYWRkIiwiYmVmb3JlIiwidXJsIiwiZ2xvYmFsUm9vdFVybCIsImRvY3VtZW50IiwicmVhZHkiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFHQTs7QUFFQTtBQUNB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LENBQUNXLGFBQTNDLENBSGEsQ0FHNkM7O0FBQzFEdUQsSUFBQUEsSUFBSSxDQUFDMkMsZ0JBQUwsR0FBd0I3RyxxQkFBcUIsQ0FBQzZHLGdCQUE5QyxDQUphLENBSW1EOztBQUNoRTNDLElBQUFBLElBQUksQ0FBQzJELGVBQUwsR0FBdUI3SCxxQkFBcUIsQ0FBQzZILGVBQTdDLENBTGEsQ0FLaUQ7O0FBQzlEM0QsSUFBQUEsSUFBSSxDQUFDakIsVUFBTDtBQUNIO0FBcGR5QixDQUE5QixDLENBdWRBOztBQUNBL0MsQ0FBQyxDQUFDc0osUUFBRCxDQUFELENBQVlDLEtBQVosQ0FBa0IsWUFBTTtBQUNwQnpKLEVBQUFBLHFCQUFxQixDQUFDaUQsVUFBdEI7QUFDSCxDQUZEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIE1pa29QQlggLSBmcmVlIHBob25lIHN5c3RlbSBmb3Igc21hbGwgYnVzaW5lc3NcbiAqIENvcHlyaWdodCDCqSAyMDE3LTIwMjMgQWxleGV5IFBvcnRub3YgYW5kIE5pa29sYXkgQmVrZXRvdlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS5cbiAqIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuXG4vKiBnbG9iYWwgZ2xvYmFsUm9vdFVybCxnbG9iYWxUcmFuc2xhdGUsIEZvcm0sIFBhc3N3b3JkU2NvcmUsIFBieEFwaSwgVXNlck1lc3NhZ2UsIFNvdW5kRmlsZXNTZWxlY3RvciwgJCAqL1xuXG4vKipcbiAqIEEgbW9kdWxlIHRvIGhhbmRsZSBtb2RpZmljYXRpb24gb2YgZ2VuZXJhbCBzZXR0aW5ncy5cbiAqL1xuY29uc3QgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5ID0ge1xuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBmb3JtLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJGZvcm1PYmo6ICQoJyNnZW5lcmFsLXNldHRpbmdzLWZvcm0nKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSB3ZWIgYWRtaW4gcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkd2ViQWRtaW5QYXNzd29yZDogJCgnI1dlYkFkbWluUGFzc3dvcmQnKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBzc2ggcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc3NoUGFzc3dvcmQ6ICQoJyNTU0hQYXNzd29yZCcpLFxuXG4gICAgLyoqXG4gICAgICogalF1ZXJ5IG9iamVjdCBmb3IgdGhlIHdlYiBzc2ggcGFzc3dvcmQgaW5wdXQgZmllbGQuXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkZGlzYWJsZVNTSFBhc3N3b3JkOiAkKCcjU1NIRGlzYWJsZVBhc3N3b3JkTG9naW5zJykucGFyZW50KCcuY2hlY2tib3gnKSxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSBTU0ggcGFzc3dvcmQgZmllbGRzXG4gICAgICogQHR5cGUge2pRdWVyeX1cbiAgICAgKi9cbiAgICAkc3NoUGFzc3dvcmRTZWdtZW50OiAkKCcjb25seS1pZi1wYXNzd29yZC1lbmFibGVkJyksXG5cbiAgICAvKipcbiAgICAgKiBJZiBwYXNzd29yZCBzZXQsIGl0IHdpbGwgYmUgaGlkZWQgZnJvbSB3ZWIgdWkuXG4gICAgICovXG4gICAgaGlkZGVuUGFzc3dvcmQ6ICd4eHh4eHh4JyxcblxuICAgIC8qKlxuICAgICAqIGpRdWVyeSBvYmplY3QgZm9yIHRoZSByZWNvcmRzIHJldGVudGlvbiBwZXJpb2Qgc2xpZGVyLlxuICAgICAqIEB0eXBlIHtqUXVlcnl9XG4gICAgICovXG4gICAgJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyOiAkKCcjUEJYUmVjb3JkU2F2ZVBlcmlvZFNsaWRlcicpLFxuXG4gICAgLyoqXG4gICAgICogUG9zc2libGUgcGVyaW9kIHZhbHVlcyBmb3IgdGhlIHJlY29yZHMgcmV0ZW50aW9uLlxuICAgICAqL1xuICAgIHNhdmVSZWNvcmRzUGVyaW9kOiBbJzMwJywgJzkwJywgJzE4MCcsICczNjAnLCAnMTA4MCcsICcnXSxcblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRpb24gcnVsZXMgZm9yIHRoZSBmb3JtIGZpZWxkcyBiZWZvcmUgc3VibWlzc2lvbi5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICovXG4gICAgdmFsaWRhdGVSdWxlczogeyAvLyBnZW5lcmFsU2V0dGluZ3NNb2RpZnkudmFsaWRhdGVSdWxlcy5TU0hQYXNzd29yZC5ydWxlc1xuICAgICAgICBwYnhuYW1lOiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnUEJYTmFtZScsXG4gICAgICAgICAgICBydWxlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVFbXB0eVBCWE5hbWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFdlYkFkbWluUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6ICdXZWJBZG1pblBhc3N3b3JkJyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgV2ViQWRtaW5QYXNzd29yZFJlcGVhdDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1dlYkFkbWluUGFzc3dvcmRSZXBlYXQnLFxuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYXRjaFtXZWJBZG1pblBhc3N3b3JkXScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV2ViUGFzc3dvcmRzRmllbGREaWZmZXJlbnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFNTSFBhc3N3b3JkOiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnU1NIUGFzc3dvcmQnLFxuICAgICAgICAgICAgcnVsZXM6IFtdLFxuICAgICAgICB9LFxuICAgICAgICBTU0hQYXNzd29yZFJlcGVhdDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1NTSFBhc3N3b3JkUmVwZWF0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWF0Y2hbU1NIUGFzc3dvcmRdJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVTU0hQYXNzd29yZHNGaWVsZERpZmZlcmVudCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgV0VCUG9ydDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ1dFQlBvcnQnLFxuICAgICAgICAgICAgcnVsZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyWzEuLjY1NTM1XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCUG9ydE91dE9mUmFuZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbV0VCSFRUUFNQb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb1dFQlBvcnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbQUpBTVBvcnRUTFNdJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVXRUJQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCUG9ydE5vdEVxdWFsVG9BamFtVExTUG9ydCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgV0VCSFRUUFNQb3J0OiB7XG4gICAgICAgICAgICBpZGVudGlmaWVyOiAnV0VCSFRUUFNQb3J0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZWdlclsxLi42NTUzNV0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE91dE9mUmFuZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkaWZmZXJlbnRbV0VCUG9ydF0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdFQkhUVFBTUG9ydE5vdEVxdWFsVG9XRUJQb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0VExTXScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb0FqYW1Qb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGlmZmVyZW50W0FKQU1Qb3J0XScsXG4gICAgICAgICAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV0VCSFRUUFNQb3J0Tm90RXF1YWxUb0FqYW1UTFNQb3J0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBBSkFNUG9ydDoge1xuICAgICAgICAgICAgaWRlbnRpZmllcjogJ0FKQU1Qb3J0JyxcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50ZWdlclsxLi42NTUzNV0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZUFKQU1Qb3J0T3V0T2ZSYW5nZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RpZmZlcmVudFtBSkFNUG9ydFRMU10nLFxuICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZUFKQU1Qb3J0T3V0T2ZSYW5nZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gUnVsZXMgZm9yIHRoZSB3ZWIgYWRtaW4gcGFzc3dvcmQgZmllbGQgd2hlbiBpdCBub3QgZXF1YWwgdG8gaGlkZGVuUGFzc3dvcmRcbiAgICB3ZWJBZG1pblBhc3N3b3JkUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlRW1wdHlXZWJQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ21pbkxlbmd0aFs1XScsXG4gICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdlYWtXZWJQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1thLXpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb0xvd1NpbXZvbFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbm90UmVnRXhwJyxcbiAgICAgICAgICAgIHZhbHVlOiAvXFxkLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb051bWJlcnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1tBLVpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmRzICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sXG4gICAgICAgIH1cbiAgICBdLFxuICAgIC8vIFJ1bGVzIGZvciB0aGUgU1NIIHBhc3N3b3JkIGZpZWxkIHdoZW4gU1NIIGxvZ2luIHRocm91Z2ggdGhlIHBhc3N3b3JkIGVuYWJsZWQsIGFuZCBpdCBub3QgZXF1YWwgdG8gaGlkZGVuUGFzc3dvcmRcbiAgICBhZGRpdGlvbmFsU3NoVmFsaWRSdWxlc1Bhc3M6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ2VtcHR5JyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlRW1wdHlTU0hQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ21pbkxlbmd0aFs1XScsXG4gICAgICAgICAgICBwcm9tcHQ6IGdsb2JhbFRyYW5zbGF0ZS5nc19WYWxpZGF0ZVdlYWtTU0hQYXNzd29yZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ25vdFJlZ0V4cCcsXG4gICAgICAgICAgICB2YWx1ZTogL1thLXpdLyxcbiAgICAgICAgICAgIHByb21wdDogJzxiPicgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfU1NIUGFzc3dvcmQgKyAnPC9iPjogJyArIGdsb2JhbFRyYW5zbGF0ZS5nc19QYXNzd29yZE5vTG93U2ltdm9sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RSZWdFeHAnLFxuICAgICAgICAgICAgdmFsdWU6IC9cXGQvLFxuICAgICAgICAgICAgcHJvbXB0OiAnPGI+JyArIGdsb2JhbFRyYW5zbGF0ZS5nc19TU0hQYXNzd29yZCArICc8L2I+OiAnICsgZ2xvYmFsVHJhbnNsYXRlLmdzX1Bhc3N3b3JkTm9OdW1iZXJzXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICdub3RSZWdFeHAnLFxuICAgICAgICAgICAgdmFsdWU6IC9bQS1aXS8sXG4gICAgICAgICAgICBwcm9tcHQ6ICc8Yj4nICsgZ2xvYmFsVHJhbnNsYXRlLmdzX1NTSFBhc3N3b3JkICsgJzwvYj46ICcgKyBnbG9iYWxUcmFuc2xhdGUuZ3NfUGFzc3dvcmROb1VwcGVyU2ltdm9sXG4gICAgICAgIH1cbiAgICBdLFxuXG4gICAgLy8gUnVsZXMgZm9yIHRoZSBTU0ggcGFzc3dvcmQgZmllbGQgd2hlbiBTU0ggbG9naW4gdGhyb3VnaCB0aGUgcGFzc3dvcmQgZGlzYWJsZWRcbiAgICBhZGRpdGlvbmFsU3NoVmFsaWRSdWxlc05vUGFzczogW1xuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnZW1wdHknLFxuICAgICAgICAgICAgcHJvbXB0OiBnbG9iYWxUcmFuc2xhdGUuZ3NfVmFsaWRhdGVFbXB0eVNTSFBhc3N3b3JkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAnbWluTGVuZ3RoWzVdJyxcbiAgICAgICAgICAgIHByb21wdDogZ2xvYmFsVHJhbnNsYXRlLmdzX1ZhbGlkYXRlV2Vha1NTSFBhc3N3b3JkLFxuICAgICAgICB9XG4gICAgXSxcblxuICAgIC8qKlxuICAgICAqICBJbml0aWFsaXplIG1vZHVsZSB3aXRoIGV2ZW50IGJpbmRpbmdzIGFuZCBjb21wb25lbnQgaW5pdGlhbGl6YXRpb25zLlxuICAgICAqL1xuICAgIGluaXRpYWxpemUoKSB7XG5cbiAgICAgICAgLy8gV2hlbiBXZWJBZG1pblBhc3N3b3JkIGlucHV0IGlzIGNoYW5nZWQsIHJlY2FsY3VsYXRlIHRoZSBwYXNzd29yZCBzdHJlbmd0aFxuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHdlYkFkbWluUGFzc3dvcmQub24oJ2tleXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kd2ViQWRtaW5QYXNzd29yZC52YWwoKSAhPT0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmhpZGRlblBhc3N3b3JkKSB7XG4gICAgICAgICAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuICAgICAgICAgICAgICAgIFBhc3N3b3JkU2NvcmUuY2hlY2tQYXNzU3RyZW5ndGgoe1xuICAgICAgICAgICAgICAgICAgICBwYXNzOiBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHdlYkFkbWluUGFzc3dvcmQudmFsKCksXG4gICAgICAgICAgICAgICAgICAgIGJhcjogJCgnLnBhc3N3b3JkLXNjb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246ICQoJy5wYXNzd29yZC1zY29yZS1zZWN0aW9uJyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdoZW4gU1NIUGFzc3dvcmQgaW5wdXQgaXMgY2hhbmdlZCwgcmVjYWxjdWxhdGUgdGhlIHBhc3N3b3JkIHN0cmVuZ3RoXG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQub24oJ2tleXVwJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQudmFsKCkgIT09IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5oaWRkZW5QYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5pbml0UnVsZXMoKTtcbiAgICAgICAgICAgICAgICBQYXNzd29yZFNjb3JlLmNoZWNrUGFzc1N0cmVuZ3RoKHtcbiAgICAgICAgICAgICAgICAgICAgcGFzczogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRzc2hQYXNzd29yZC52YWwoKSxcbiAgICAgICAgICAgICAgICAgICAgYmFyOiAkKCcuc3NoLXBhc3N3b3JkLXNjb3JlJyksXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246ICQoJy5zc2gtcGFzc3dvcmQtc2NvcmUtc2VjdGlvbicpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGUgdGFiIG5hdmlnYXRpb24gd2l0aCBoaXN0b3J5IHN1cHBvcnRcbiAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtbWVudScpLmZpbmQoJy5pdGVtJykudGFiKHtcbiAgICAgICAgICAgIGhpc3Rvcnk6IHRydWUsXG4gICAgICAgICAgICBoaXN0b3J5VHlwZTogJ2hhc2gnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbmFibGUgZHJvcGRvd25zIG9uIHRoZSBmb3JtXG4gICAgICAgICQoJyNnZW5lcmFsLXNldHRpbmdzLWZvcm0gLmRyb3Bkb3duJykuZHJvcGRvd24oKTtcblxuICAgICAgICAvLyBFbmFibGUgY2hlY2tib3hlcyBvbiB0aGUgZm9ybVxuICAgICAgICAkKCcjZ2VuZXJhbC1zZXR0aW5ncy1mb3JtIC5jaGVja2JveCcpLmNoZWNrYm94KCk7XG5cbiAgICAgICAgLy8gRW5hYmxlIHRhYmxlIGRyYWctbi1kcm9wIGZ1bmN0aW9uYWxpdHlcbiAgICAgICAgJCgnI2F1ZGlvLWNvZGVjcy10YWJsZSwgI3ZpZGVvLWNvZGVjcy10YWJsZScpLnRhYmxlRG5EKHtcbiAgICAgICAgICAgIG9uRHJvcCgpIHtcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGNoYW5nZSBldmVudCB0byBhY2tub3dsZWRnZSB0aGUgbW9kaWZpY2F0aW9uXG4gICAgICAgICAgICAgICAgRm9ybS5kYXRhQ2hhbmdlZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRHJhZ0NsYXNzOiAnaG92ZXJpbmdSb3cnLFxuICAgICAgICAgICAgZHJhZ0hhbmRsZTogJy5kcmFnSGFuZGxlJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5hYmxlIGRyb3Bkb3duIHdpdGggc291bmQgZmlsZSBzZWxlY3Rpb25cbiAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtZm9ybSAuYXVkaW8tbWVzc2FnZS1zZWxlY3QnKS5kcm9wZG93bihTb3VuZEZpbGVzU2VsZWN0b3IuZ2V0RHJvcGRvd25TZXR0aW5nc1dpdGhFbXB0eSgpKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHJlY29yZHMgc2F2ZSBwZXJpb2Qgc2xpZGVyXG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kcmVjb3Jkc1NhdmVQZXJpb2RTbGlkZXJcbiAgICAgICAgICAgIC5zbGlkZXIoe1xuICAgICAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgICAgICAgICBtYXg6IDUsXG4gICAgICAgICAgICAgICAgc3RlcDogMSxcbiAgICAgICAgICAgICAgICBzbW9vdGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaW50ZXJwcmV0TGFiZWw6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVHJhbnNsYXRlLmdzX1N0b3JlMU1vbnRoT2ZSZWNvcmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsVHJhbnNsYXRlLmdzX1N0b3JlM01vbnRoc09mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZTZNb250aHNPZlJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUcmFuc2xhdGUuZ3NfU3RvcmUxWWVhck9mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZTNZZWFyc09mUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRyYW5zbGF0ZS5nc19TdG9yZUFsbFBvc3NpYmxlUmVjb3JkcyxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsc1t2YWx1ZV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZvcm1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRpYWxpemVGb3JtKCk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gcnVsZXNcbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuXG4gICAgICAgIC8vIFNob3csIGhpZGUgc3NoIHBhc3N3b3JkIHNlZ21lbnRcbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRkaXNhYmxlU1NIUGFzc3dvcmQuY2hlY2tib3goe1xuICAgICAgICAgICAgJ29uQ2hhbmdlJzogZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LnNob3dIaWRlU1NIUGFzc3dvcmRcbiAgICAgICAgfSk7XG4gICAgICAgIGdlbmVyYWxTZXR0aW5nc01vZGlmeS5zaG93SGlkZVNTSFBhc3N3b3JkKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgcmVjb3JkcyBzYXZlIHBlcmlvZCBzbGlkZXJcbiAgICAgICAgY29uc3QgcmVjb3JkU2F2ZVBlcmlvZCA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWUnLCAnUEJYUmVjb3JkU2F2ZVBlcmlvZCcpO1xuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHJlY29yZHNTYXZlUGVyaW9kU2xpZGVyXG4gICAgICAgICAgICAuc2xpZGVyKCdzZXQgdmFsdWUnLCBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuc2F2ZVJlY29yZHNQZXJpb2QuaW5kZXhPZihyZWNvcmRTYXZlUGVyaW9kKSwgZmFsc2UpO1xuXG4gICAgICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lciB0byBoYW5kbGUgdGFiIGFjdGl2YXRpb25cbiAgICAgICAgJCh3aW5kb3cpLm9uKCdHUy1BY3RpdmF0ZVRhYicsIChldmVudCwgbmFtZVRhYikgPT4ge1xuICAgICAgICAgICAgJCgnI2dlbmVyYWwtc2V0dGluZ3MtbWVudScpLmZpbmQoJy5pdGVtJykudGFiKCdjaGFuZ2UgdGFiJywgbmFtZVRhYik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTaG93LCBoaWRlIHNzaCBwYXNzd29yZCBzZWdtZW50IGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgdXNlIFNTSCBwYXNzd29yZCBjaGVja2JveC5cbiAgICAgKi9cbiAgICBzaG93SGlkZVNTSFBhc3N3b3JkKCl7XG4gICAgICAgIGlmIChnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJGRpc2FibGVTU0hQYXNzd29yZC5jaGVja2JveCgnaXMgY2hlY2tlZCcpKSB7XG4gICAgICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkU2VnbWVudC5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuJHNzaFBhc3N3b3JkU2VnbWVudC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRSdWxlcygpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGNvbmRpdGlvbnMgZm9yIGRlbGV0aW5nIGFsbCByZWNvcmRzLlxuICAgICAqIENvbXBhcmVzIHRoZSB2YWx1ZSBvZiB0aGUgJ2RlbGV0ZUFsbElucHV0JyBmaWVsZCB3aXRoIGEgcGhyYXNlLlxuICAgICAqIElmIHRoZXkgbWF0Y2gsIGl0IHRyaWdnZXJzIGEgc3lzdGVtIHJlc3RvcmUgdG8gZGVmYXVsdCBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjaGVja0RlbGV0ZUFsbENvbmRpdGlvbnMoKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiAnZGVsZXRlQWxsSW5wdXQnIGZpZWxkLlxuICAgICAgICBjb25zdCBkZWxldGVBbGxJbnB1dCA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kZm9ybU9iai5mb3JtKCdnZXQgdmFsdWUnLCAnZGVsZXRlQWxsSW5wdXQnKTtcblxuICAgICAgICAvLyBJZiB0aGUgZW50ZXJlZCBwaHJhc2UgbWF0Y2hlcyB0aGUgcGhyYXNlIGluICdnbG9iYWxUcmFuc2xhdGUuZ3NfRW50ZXJEZWxldGVBbGxQaHJhc2UnLFxuICAgICAgICAvLyBjYWxsICdQYnhBcGkuU3lzdGVtUmVzdG9yZURlZmF1bHRTZXR0aW5ncycgdG8gcmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzLlxuICAgICAgICBpZiAoZGVsZXRlQWxsSW5wdXQgPT09IGdsb2JhbFRyYW5zbGF0ZS5nc19FbnRlckRlbGV0ZUFsbFBocmFzZSkge1xuICAgICAgICAgICAgUGJ4QXBpLlN5c3RlbVJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJSZXN0b3JlRGVmYXVsdFNldHRpbmdzKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcmVzcG9uc2UgYWZ0ZXIgcmVzdG9yaW5nIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcmVzcG9uc2UgLSBSZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYWZ0ZXIgcmVzdG9yaW5nIGRlZmF1bHQgc2V0dGluZ3MuXG4gICAgICovXG4gICAgY2JBZnRlclJlc3RvcmVEZWZhdWx0U2V0dGluZ3MocmVzcG9uc2UpIHtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVzcG9uc2UgaXMgdHJ1ZSwgZGlzcGxheSBhIHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgICAvLyBvdGhlcndpc2UsIGRpc3BsYXkgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuXG4gICAgICAgIGlmIChyZXNwb25zZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd0luZm9ybWF0aW9uKGdsb2JhbFRyYW5zbGF0ZS5nc19BbGxTZXR0aW5nc0RlbGV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgVXNlck1lc3NhZ2Uuc2hvd011bHRpU3RyaW5nKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgZXZlbnQgYWZ0ZXIgdGhlIHNlbGVjdCBzYXZlIHBlcmlvZCBzbGlkZXIgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgc2VsZWN0ZWQgdmFsdWUgZnJvbSB0aGUgc2xpZGVyLlxuICAgICAqL1xuICAgIGNiQWZ0ZXJTZWxlY3RTYXZlUGVyaW9kU2xpZGVyKHZhbHVlKSB7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzYXZlIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzbGlkZXIgdmFsdWUuXG4gICAgICAgIGNvbnN0IHNhdmVQZXJpb2QgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuc2F2ZVJlY29yZHNQZXJpb2RbdmFsdWVdO1xuXG4gICAgICAgIC8vIFNldCB0aGUgZm9ybSB2YWx1ZSBmb3IgJ1BCWFJlY29yZFNhdmVQZXJpb2QnIHRvIHRoZSBzZWxlY3RlZCBzYXZlIHBlcmlvZC5cbiAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqLmZvcm0oJ3NldCB2YWx1ZScsICdQQlhSZWNvcmRTYXZlUGVyaW9kJywgc2F2ZVBlcmlvZCk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciBjaGFuZ2UgZXZlbnQgdG8gYWNrbm93bGVkZ2UgdGhlIG1vZGlmaWNhdGlvblxuICAgICAgICBGb3JtLmRhdGFDaGFuZ2VkKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZvcm0gaXMgc2VudFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzZXR0aW5ncyAtIFRoZSBjdXJyZW50IHNldHRpbmdzIG9mIHRoZSBmb3JtXG4gICAgICogQHJldHVybnMge09iamVjdH0gLSBUaGUgdXBkYXRlZCBzZXR0aW5ncyBvZiB0aGUgZm9ybVxuICAgICAqL1xuICAgIGNiQmVmb3JlU2VuZEZvcm0oc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2V0dGluZ3M7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqLmZvcm0oJ2dldCB2YWx1ZXMnKTtcbiAgICAgICAgY29uc3QgYXJyQ29kZWNzID0gW107XG4gICAgICAgICQoJyNhdWRpby1jb2RlY3MtdGFibGUgLmNvZGVjLXJvdywgI3ZpZGVvLWNvZGVjcy10YWJsZSAuY29kZWMtcm93JykuZWFjaCgoaW5kZXgsIG9iaikgPT4ge1xuICAgICAgICAgICAgaWYgKCQob2JqKS5hdHRyKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgYXJyQ29kZWNzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBjb2RlY0lkOiAkKG9iaikuYXR0cignaWQnKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICQob2JqKS5maW5kKCcuY2hlY2tib3gnKS5jaGVja2JveCgnaXMgdW5jaGVja2VkJyksXG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBpbmRleCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdC5kYXRhLmNvZGVjcyA9IEpTT04uc3RyaW5naWZ5KGFyckNvZGVjcyk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBmb3JtIGhhcyBiZWVuIHNlbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlc3BvbnNlIC0gVGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhZnRlciB0aGUgZm9ybSBpcyBzZW50XG4gICAgICovXG4gICAgY2JBZnRlclNlbmRGb3JtKHJlc3BvbnNlKSB7XG4gICAgICAgICQoXCIjZXJyb3ItbWVzc2FnZXNcIikucmVtb3ZlKCk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgRm9ybS4kc3VibWl0QnV0dG9uLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmdlbmVyYXRlRXJyb3JNZXNzYWdlSHRtbChyZXNwb25zZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKCcucGFzc3dvcmQtdmFsaWRhdGUnKS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuY2hlY2tEZWxldGVBbGxDb25kaXRpb25zKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiBjb2xsZWN0cyBhbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGFib3V0IGEgZGF0YSBzYXZpbmcgZXJyb3JcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2VcbiAgICAgKi9cbiAgICBnZW5lcmF0ZUVycm9yTWVzc2FnZUh0bWwocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm1lc3NhZ2VzICYmIHJlc3BvbnNlLm1lc3NhZ2VzLmVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCAkZGl2ID0gJCgnPGRpdj4nLCB7IGNsYXNzOiAndWkgbmVnYXRpdmUgbWVzc2FnZScsIGlkOiAnZXJyb3ItbWVzc2FnZXMnIH0pO1xuICAgICAgICAgICAgY29uc3QgJGhlYWRlciA9ICQoJzxkaXY+JywgeyBjbGFzczogJ2hlYWRlcicgfSkudGV4dChnbG9iYWxUcmFuc2xhdGUuZ3NfRXJyb3JTYXZlU2V0dGluZ3MpO1xuICAgICAgICAgICAgJGRpdi5hcHBlbmQoJGhlYWRlcik7XG4gICAgICAgICAgICBjb25zdCAkdWwgPSAkKCc8dWw+JywgeyBjbGFzczogJ2xpc3QnIH0pO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXNTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICByZXNwb25zZS5tZXNzYWdlcy5lcnJvci5mb3JFYWNoKGVycm9yQXJyYXkgPT4ge1xuICAgICAgICAgICAgICAgIGVycm9yQXJyYXkuZm9yRWFjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0Q29udGVudCA9Jyc7XG4gICAgICAgICAgICAgICAgICAgIGlmKGdsb2JhbFRyYW5zbGF0ZVtlcnJvci5tZXNzYWdlXSA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb250ZW50ID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudCA9IGdsb2JhbFRyYW5zbGF0ZVtlcnJvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNTZXQuaGFzKHRleHRDb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzU2V0LmFkZChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgJHVsLmFwcGVuZCgkKCc8bGk+JykudGV4dCh0ZXh0Q29udGVudCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkZGl2LmFwcGVuZCgkdWwpO1xuICAgICAgICAgICAgJCgnI3N1Ym1pdGJ1dHRvbicpLmJlZm9yZSgkZGl2KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSB2YWxpZGF0aW9uIHJ1bGVzIG9mIHRoZSBmb3JtXG4gICAgICovXG4gICAgaW5pdFJ1bGVzKCkge1xuICAgICAgICAvLyBTU0hQYXNzd29yZFxuICAgICAgICBpZiAoZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRkaXNhYmxlU1NIUGFzc3dvcmQuY2hlY2tib3goJ2lzIGNoZWNrZWQnKSkge1xuICAgICAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzLlNTSFBhc3N3b3JkLnJ1bGVzID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmFkZGl0aW9uYWxTc2hWYWxpZFJ1bGVzTm9QYXNzO1xuICAgICAgICB9IGVsc2UgaWYgKGdlbmVyYWxTZXR0aW5nc01vZGlmeS4kc3NoUGFzc3dvcmQudmFsKCkgPT09IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5oaWRkZW5QYXNzd29yZCkge1xuICAgICAgICAgICAgRm9ybS52YWxpZGF0ZVJ1bGVzLlNTSFBhc3N3b3JkLnJ1bGVzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBGb3JtLnZhbGlkYXRlUnVsZXMuU1NIUGFzc3dvcmQucnVsZXMgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuYWRkaXRpb25hbFNzaFZhbGlkUnVsZXNQYXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2ViQWRtaW5QYXNzd29yZFxuICAgICAgICBpZiAoZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiR3ZWJBZG1pblBhc3N3b3JkLnZhbCgpID09PSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkuaGlkZGVuUGFzc3dvcmQpIHtcbiAgICAgICAgICAgIEZvcm0udmFsaWRhdGVSdWxlcy5XZWJBZG1pblBhc3N3b3JkLnJ1bGVzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBGb3JtLnZhbGlkYXRlUnVsZXMuV2ViQWRtaW5QYXNzd29yZC5ydWxlcyA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS53ZWJBZG1pblBhc3N3b3JkUnVsZXM7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSB0aGUgZm9ybSB3aXRoIGN1c3RvbSBzZXR0aW5nc1xuICAgICAqL1xuICAgIGluaXRpYWxpemVGb3JtKCkge1xuICAgICAgICBGb3JtLiRmb3JtT2JqID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LiRmb3JtT2JqO1xuICAgICAgICBGb3JtLnVybCA9IGAke2dsb2JhbFJvb3RVcmx9Z2VuZXJhbC1zZXR0aW5ncy9zYXZlYDsgLy8gRm9ybSBzdWJtaXNzaW9uIFVSTFxuICAgICAgICBGb3JtLnZhbGlkYXRlUnVsZXMgPSBnZW5lcmFsU2V0dGluZ3NNb2RpZnkudmFsaWRhdGVSdWxlczsgLy8gRm9ybSB2YWxpZGF0aW9uIHJ1bGVzXG4gICAgICAgIEZvcm0uY2JCZWZvcmVTZW5kRm9ybSA9IGdlbmVyYWxTZXR0aW5nc01vZGlmeS5jYkJlZm9yZVNlbmRGb3JtOyAvLyBDYWxsYmFjayBiZWZvcmUgZm9ybSBpcyBzZW50XG4gICAgICAgIEZvcm0uY2JBZnRlclNlbmRGb3JtID0gZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmNiQWZ0ZXJTZW5kRm9ybTsgLy8gQ2FsbGJhY2sgYWZ0ZXIgZm9ybSBpcyBzZW50XG4gICAgICAgIEZvcm0uaW5pdGlhbGl6ZSgpO1xuICAgIH1cbn07XG5cbi8vIFdoZW4gdGhlIGRvY3VtZW50IGlzIHJlYWR5LCBpbml0aWFsaXplIHRoZSBnZW5lcmFsU2V0dGluZ3MgbWFuYWdlbWVudCBpbnRlcmZhY2UuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG4gICAgZ2VuZXJhbFNldHRpbmdzTW9kaWZ5LmluaXRpYWxpemUoKTtcbn0pOyJdfQ== \ No newline at end of file diff --git a/sites/admin-cabinet/assets/js/src/GeneralSettings/general-settings-modify.js b/sites/admin-cabinet/assets/js/src/GeneralSettings/general-settings-modify.js index aabe559bb..220bf610f 100644 --- a/sites/admin-cabinet/assets/js/src/GeneralSettings/general-settings-modify.js +++ b/sites/admin-cabinet/assets/js/src/GeneralSettings/general-settings-modify.js @@ -431,7 +431,6 @@ const generalSettingsModify = { /** * The function collects an information message about a data saving error * @param response - * @returns {string} */ generateErrorMessageHtml(response) { if (response.messages && response.messages.error) { @@ -457,7 +456,6 @@ const generalSettingsModify = { }); $div.append($ul); $('#submitbutton').before($div); - return $div; } }, From d7480ae8250b4ad6ff2afd01dede8b166d96111d Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 11 Jul 2024 17:22:06 +0300 Subject: [PATCH 06/13] Translated using Weblate (Thai) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Greek) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Georgian) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Czech) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Polish) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Italian) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Danish) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Vietnamese) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (French) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (English) Currently translated at 100.0% (1243 of 1243 strings) Translated using Weblate (German) Currently translated at 100.0% (1243 of 1243 strings) Co-authored-by: Anonymous Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/az/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/cs/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/da/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/de/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/el/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/en/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/es/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/fr/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/it/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/ja/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/ka/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/nl/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/pl/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/pt/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/pt_BR/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/ro/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/sv/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/th/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/tr/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/uk/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/vi/ Translate-URL: https://weblate.mikopbx.com/projects/mikopbx/admin-web-interface/zh_Hans/ Translation: MIKOPBX/Core --- src/Common/Messages/az.php | 2 ++ src/Common/Messages/cs.php | 2 ++ src/Common/Messages/da.php | 2 ++ src/Common/Messages/de.php | 2 ++ src/Common/Messages/el.php | 2 ++ src/Common/Messages/en.php | 2 ++ src/Common/Messages/es.php | 2 ++ src/Common/Messages/fr.php | 2 ++ src/Common/Messages/it.php | 2 ++ src/Common/Messages/ja.php | 2 ++ src/Common/Messages/ka.php | 2 ++ src/Common/Messages/nl.php | 2 ++ src/Common/Messages/pl.php | 2 ++ src/Common/Messages/pt.php | 2 ++ src/Common/Messages/pt_BR.php | 2 ++ src/Common/Messages/ro.php | 2 ++ src/Common/Messages/sv.php | 2 ++ src/Common/Messages/th.php | 2 ++ src/Common/Messages/tr.php | 2 ++ src/Common/Messages/uk.php | 2 ++ src/Common/Messages/vi.php | 2 ++ src/Common/Messages/zh_Hans.php | 2 ++ 22 files changed, 44 insertions(+) diff --git a/src/Common/Messages/az.php b/src/Common/Messages/az.php index 02ceeba9e..33d6b8421 100644 --- a/src/Common/Messages/az.php +++ b/src/Common/Messages/az.php @@ -1279,4 +1279,6 @@ 'nw_NATInfo6OR' => 'YA', 'nw_NATInfo2' => '1:1 NAT istifadə edilmirsə, marşrutlaşdırıcının parametrlərində aşağıdakı portları ictimai IP-dən PBX-in daxili IP ünvanına yönləndirin.', 'nw_PublicSIPPort' => 'SIP port nömrəsi daxili %SIP_PORT% PBX-ə yönləndirildi', + 'gs_ErrorSaveSettings' => 'Parametrləri yadda saxlama xətası', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Göstərilən artırma nömrəsi artıq istifadə olunur', ]; diff --git a/src/Common/Messages/cs.php b/src/Common/Messages/cs.php index 1bc3eeb4e..e1c497780 100644 --- a/src/Common/Messages/cs.php +++ b/src/Common/Messages/cs.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo6OR' => 'NEBO', 'nw_PublicSIPPort' => 'Číslo SIP portu přesměrováno na interní %SIP_PORT% PBX', 'nw_PublicTLSPort' => 'Číslo portu SIP TLS přesměrováno na interní %TLS_PORT% PBX', + 'gs_ErrorSaveSettings' => 'Při ukládání nastavení došlo k chybě', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Zadané číslo pobočky se již používá', ]; diff --git a/src/Common/Messages/da.php b/src/Common/Messages/da.php index bb21dd3fc..ad7a1060e 100644 --- a/src/Common/Messages/da.php +++ b/src/Common/Messages/da.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo2' => 'Hvis 1:1 NAT ikke bruges, skal du omdirigere følgende porte fra den offentlige IP til den interne IP-adresse på PBX\'en i dine routerindstillinger.', 'nw_NATInfo4' => '%RTP_PORT_FROM%-%RTP_PORT_TO% UDP', 'nw_NATInfo5' => 'Hvis et eksternt værtsnavn er angivet, vil det blive brugt frem for den eksterne IP-adresse.', + 'gs_ErrorSaveSettings' => 'Fejl under lagring af indstillinger', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Det angivne lokalnummer er allerede i brug', ]; diff --git a/src/Common/Messages/de.php b/src/Common/Messages/de.php index c54ec14ba..efd51e7d2 100644 --- a/src/Common/Messages/de.php +++ b/src/Common/Messages/de.php @@ -1283,4 +1283,6 @@ 'nw_NATInfo1' => 'Wenn Ihr Netzwerk für die Unterstützung von 1:1-NAT konfiguriert ist (normalerweise die Standardeinstellung in Clouds), müssen Sie keine zusätzlichen Einstellungen an Ihrem Router vornehmen.', 'nw_NATInfo2' => 'Wenn 1:1 NAT nicht verwendet wird, leiten Sie in Ihren Router-Einstellungen die folgenden Ports von der öffentlichen IP auf die interne IP-Adresse der TK-Anlage um.', 'nw_PublicSIPPort' => 'SIP-Portnummer, die an die interne %SIP_PORT%-PBX weitergeleitet wird', + 'gs_ErrorSaveSettings' => 'Fehler beim Speichern der Einstellungen', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Die angegebene Nebenstellennummer wird bereits verwendet', ]; diff --git a/src/Common/Messages/el.php b/src/Common/Messages/el.php index c1536316c..517e22994 100644 --- a/src/Common/Messages/el.php +++ b/src/Common/Messages/el.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo2' => 'Εάν δεν χρησιμοποιείται NAT 1:1, ανακατευθύνετε τις ακόλουθες θύρες από τη δημόσια IP στην εσωτερική διεύθυνση IP του PBX στις ρυθμίσεις του δρομολογητή σας.', 'nw_PublicSIPPort' => 'Ο αριθμός θύρας SIP προωθείται στο εσωτερικό PBX %SIP_PORT%', 'nw_PublicTLSPort' => 'Ο αριθμός θύρας SIP TLS προωθείται στο εσωτερικό PBX %TLS_PORT%', + 'gs_ErrorSaveSettings' => 'Σφάλμα αποθήκευσης ρυθμίσεων', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Ο καθορισμένος αριθμός επέκτασης χρησιμοποιείται ήδη', ]; diff --git a/src/Common/Messages/en.php b/src/Common/Messages/en.php index 328d6e08f..77a589267 100644 --- a/src/Common/Messages/en.php +++ b/src/Common/Messages/en.php @@ -1283,4 +1283,6 @@ 'nw_NATInfo6OR' => 'OR', 'nw_PublicSIPPort' => 'SIP port number forwarded to internal %SIP_PORT% PBX', 'nw_PublicTLSPort' => 'SIP TLS port number forwarded to internal %TLS_PORT% PBX', + 'gs_ErrorSaveSettings' => 'Error saving settings', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'The specified extension number is already in use', ]; diff --git a/src/Common/Messages/es.php b/src/Common/Messages/es.php index 6f929df81..7cf505b6f 100644 --- a/src/Common/Messages/es.php +++ b/src/Common/Messages/es.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo3' => '%SIP_PORT% TCP/UDP y %TLS_PORT% TCP', 'nw_NATInfo5' => 'Si se especifica un nombre de host externo, se utilizará con preferencia a la dirección IP externa.', 'nw_PublicTLSPort' => 'Número de puerto SIP TLS reenviado al PBX interno %TLS_PORT%', + 'gs_ErrorSaveSettings' => 'Error al guardar la configuración', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'El número de extensión especificado ya está en uso', ]; diff --git a/src/Common/Messages/fr.php b/src/Common/Messages/fr.php index 529625e53..9091997f0 100644 --- a/src/Common/Messages/fr.php +++ b/src/Common/Messages/fr.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo2' => 'Si le NAT 1:1 n\'est pas utilisé, redirigez les ports suivants de l\'adresse IP publique vers l\'adresse IP interne du PBX dans les paramètres de votre routeur.', 'nw_NATInfo3' => '%SIP_PORT% TCP/UDP et %TLS_PORT% TCP', 'nw_NATInfo4' => '%RTP_PORT_FROM%-%RTP_PORT_TO%UDP', + 'gs_ErrorSaveSettings' => 'Erreur lors de l\'enregistrement des paramètres', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Le numéro de poste spécifié est déjà utilisé', ]; diff --git a/src/Common/Messages/it.php b/src/Common/Messages/it.php index 2b432f2b5..e526eac53 100644 --- a/src/Common/Messages/it.php +++ b/src/Common/Messages/it.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo6OR' => 'O', 'nw_PublicSIPPort' => 'Numero di porta SIP inoltrato al PBX interno %SIP_PORT%.', 'nw_PublicTLSPort' => 'Numero di porta SIP TLS inoltrato al PBX interno %TLS_PORT%.', + 'gs_ErrorSaveSettings' => 'Errore durante il salvataggio delle impostazioni', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Il numero di interno specificato è già in uso', ]; diff --git a/src/Common/Messages/ja.php b/src/Common/Messages/ja.php index b86b10654..b626ff3b6 100644 --- a/src/Common/Messages/ja.php +++ b/src/Common/Messages/ja.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo2' => '1:1 NAT が使用されていない場合は、ルーター設定で次のポートをパブリック IP から PBX の内部 IP アドレスにリダイレクトします。', 'nw_NATInfo3' => '%SIP_PORT% TCP/UDP および %TLS_PORT% TCP', 'nw_PublicTLSPort' => '内部 %TLS_PORT% PBX に転送される SIP TLS ポート番号', + 'mo_ThisNumberNotUniqueForExtensionsModels' => '指定された内線番号はすでに使用されています', + 'gs_ErrorSaveSettings' => '設定の保存中にエラーが発生しました', ]; diff --git a/src/Common/Messages/ka.php b/src/Common/Messages/ka.php index acade8f33..dfb0673ac 100644 --- a/src/Common/Messages/ka.php +++ b/src/Common/Messages/ka.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo1' => 'თუ თქვენი ქსელი კონფიგურირებულია 1:1 NAT-ის მხარდასაჭერად (ჩვეულებრივ, ნაგულისხმევია ღრუბლებში), თქვენ არ გჭირდებათ რაიმე დამატებითი პარამეტრების გაკეთება თქვენს როუტერზე.', 'nw_NATInfo5' => 'თუ მითითებულია გარე ჰოსტის სახელი, ის გამოყენებული იქნება უპირატესად გარე IP მისამართის ნაცვლად.', 'nw_PublicSIPPort' => 'SIP პორტის ნომერი გადაგზავნილია შიდა %SIP_PORT% PBX-ში', + 'gs_ErrorSaveSettings' => 'შეცდომა პარამეტრების შენახვისას', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'მითითებული გაფართოების ნომერი უკვე გამოიყენება', ]; diff --git a/src/Common/Messages/nl.php b/src/Common/Messages/nl.php index 4c0561107..8215594f5 100644 --- a/src/Common/Messages/nl.php +++ b/src/Common/Messages/nl.php @@ -1279,4 +1279,6 @@ 'nw_NATInfo6OR' => 'OF', 'nw_PublicSIPPort' => 'SIP-poortnummer doorgestuurd naar interne %SIP_PORT% PBX', 'nw_PublicTLSPort' => 'SIP TLS-poortnummer doorgestuurd naar interne %TLS_PORT% PBX', + 'gs_ErrorSaveSettings' => 'Fout bij opslaan van instellingen', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Het opgegeven toestelnummer is al in gebruik', ]; diff --git a/src/Common/Messages/pl.php b/src/Common/Messages/pl.php index fbf24a53a..d12375291 100644 --- a/src/Common/Messages/pl.php +++ b/src/Common/Messages/pl.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo5' => 'Jeśli określono zewnętrzną nazwę hosta, będzie ona używana zamiast zewnętrznego adresu IP.', 'nw_NATInfo6OR' => 'LUB', 'nw_PublicTLSPort' => 'Numer portu SIP TLS przekazywany do wewnętrznej centrali %TLS_PORT% PBX', + 'gs_ErrorSaveSettings' => 'Błąd podczas zapisywania ustawień', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Podany numer wewnętrzny jest już zajęty', ]; diff --git a/src/Common/Messages/pt.php b/src/Common/Messages/pt.php index 20c7269d5..01fff494f 100644 --- a/src/Common/Messages/pt.php +++ b/src/Common/Messages/pt.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo6OR' => 'OU', 'nw_PublicSIPPort' => 'Número da porta SIP encaminhado para PBX interno %SIP_PORT%', 'nw_PublicTLSPort' => 'Número da porta SIP TLS encaminhado para PBX interno %TLS_PORT%', + 'gs_ErrorSaveSettings' => 'Erro ao salvar as configurações', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'O número de ramal especificado já está em uso', ]; diff --git a/src/Common/Messages/pt_BR.php b/src/Common/Messages/pt_BR.php index 79609afb0..6062ca170 100644 --- a/src/Common/Messages/pt_BR.php +++ b/src/Common/Messages/pt_BR.php @@ -1279,4 +1279,6 @@ 'nw_NATInfo5' => 'Se um nome de host externo for especificado, ele será usado preferencialmente ao endereço IP externo.', 'nw_NATInfo6OR' => 'OU', 'nw_PublicSIPPort' => 'Número da porta SIP encaminhado para PBX interno %SIP_PORT%', + 'gs_ErrorSaveSettings' => 'Erro ao salvar as configurações', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'O número de ramal especificado já está em uso', ]; diff --git a/src/Common/Messages/ro.php b/src/Common/Messages/ro.php index cf18aa1c2..77963fed8 100644 --- a/src/Common/Messages/ro.php +++ b/src/Common/Messages/ro.php @@ -1262,4 +1262,6 @@ 'nw_NATInfo6OR' => 'SAU', 'nw_PublicSIPPort' => 'Numărul portului SIP redirecționat către PBX intern %SIP_PORT%.', 'nw_PublicTLSPort' => 'Numărul portului SIP TLS redirecționat către centrala internă %TLS_PORT%.', + 'gs_ErrorSaveSettings' => 'Eroare la salvarea setărilor', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Numărul de extensie specificat este deja în uz', ]; diff --git a/src/Common/Messages/sv.php b/src/Common/Messages/sv.php index 9b643d04c..764d4656a 100644 --- a/src/Common/Messages/sv.php +++ b/src/Common/Messages/sv.php @@ -1246,4 +1246,6 @@ 'nw_NATInfo6OR' => 'ELLER', 'nw_PublicSIPPort' => 'SIP-portnummer vidarebefordrat till intern %SIP_PORT% PBX', 'nw_PublicTLSPort' => 'SIP TLS-portnummer vidarebefordrat till intern %TLS_PORT% PBX', + 'gs_ErrorSaveSettings' => 'Det gick inte att spara inställningar', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Det angivna anknytningsnumret används redan', ]; diff --git a/src/Common/Messages/th.php b/src/Common/Messages/th.php index 7afd76e93..adee96048 100644 --- a/src/Common/Messages/th.php +++ b/src/Common/Messages/th.php @@ -1244,4 +1244,6 @@ 'nw_PublicTLSPort' => 'หมายเลขพอร์ต SIP TLS ส่งต่อไปยัง PBX ภายใน %TLS_PORT%', 'nw_NATInfo1' => 'หากเครือข่ายของคุณได้รับการกำหนดค่าให้รองรับ NAT 1:1 (โดยปกติจะเป็นค่าเริ่มต้นในระบบคลาวด์) คุณไม่จำเป็นต้องทำการตั้งค่าเพิ่มเติมใดๆ บนเราเตอร์ของคุณ', 'nw_NATInfo2' => 'หากไม่ได้ใช้ NAT 1:1 ให้เปลี่ยนเส้นทางพอร์ตต่อไปนี้จาก IP สาธารณะไปยังที่อยู่ IP ภายในของ PBX ในการตั้งค่าเราเตอร์ของคุณ', + 'gs_ErrorSaveSettings' => 'เกิดข้อผิดพลาดในการบันทึกการตั้งค่า', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'หมายเลขต่อขยายที่ระบุมีการใช้งานแล้ว', ]; diff --git a/src/Common/Messages/tr.php b/src/Common/Messages/tr.php index 266403485..c3fd6c8a1 100644 --- a/src/Common/Messages/tr.php +++ b/src/Common/Messages/tr.php @@ -1246,4 +1246,6 @@ 'nw_NATInfo4' => '%RTP_PORT_FROM%-%RTP_PORT_TO% UDP', 'nw_NATInfo5' => 'Harici bir ana bilgisayar adı belirtilirse, harici IP adresi yerine bu ad kullanılacaktır.', 'nw_PublicSIPPort' => 'Dahili %SIP_PORT% PBX\'e iletilen SIP bağlantı noktası numarası', + 'gs_ErrorSaveSettings' => 'Ayarlar kaydedilirken hata oluştu', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Belirtilen dahili numara zaten kullanımda', ]; diff --git a/src/Common/Messages/uk.php b/src/Common/Messages/uk.php index c3bae740a..74e774788 100644 --- a/src/Common/Messages/uk.php +++ b/src/Common/Messages/uk.php @@ -1280,4 +1280,6 @@ 'nw_NATInfo5' => 'Якщо вказано зовнішнє ім\'я хоста, воно буде використовуватись у пріоритеті замість зовнішньої IP-адреси.', 'nw_PublicSIPPort' => 'Номер порту SIP перенаправленого на внутрішній %SIP_PORT% PBX', 'nw_PublicTLSPort' => 'Номер порту SIP TLS перенаправленого на внутрішній %TLS_PORT% PBX', + 'gs_ErrorSaveSettings' => 'Помилка збереження налаштувань', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Вказаний внутрішній номер вже використовується', ]; diff --git a/src/Common/Messages/vi.php b/src/Common/Messages/vi.php index 4eeded666..f3de3c885 100644 --- a/src/Common/Messages/vi.php +++ b/src/Common/Messages/vi.php @@ -1246,4 +1246,6 @@ 'nw_NATInfo3' => '%SIP_PORT% TCP/UDP và %TLS_PORT% TCP', 'nw_NATInfo4' => '%RTP_PORT_FROM%-%RTP_PORT_TO% UDP', 'nw_NATInfo6OR' => 'HOẶC', + 'gs_ErrorSaveSettings' => 'Lỗi lưu cài đặt', + 'mo_ThisNumberNotUniqueForExtensionsModels' => 'Số máy nhánh được chỉ định đã được sử dụng', ]; diff --git a/src/Common/Messages/zh_Hans.php b/src/Common/Messages/zh_Hans.php index 4e706b227..b529d5daf 100644 --- a/src/Common/Messages/zh_Hans.php +++ b/src/Common/Messages/zh_Hans.php @@ -1246,4 +1246,6 @@ 'nw_NATInfo4' => '%RTP_PORT_FROM%-%RTP_PORT_TO% UDP', 'nw_NATInfo5' => '如果指定了外部主机名,则将优先使用外部主机名而不是外部 IP 地址。', 'nw_PublicTLSPort' => '转发到内部 %TLS_PORT% PBX 的 SIP TLS 端口号', + 'gs_ErrorSaveSettings' => '保存设置时出错', + 'mo_ThisNumberNotUniqueForExtensionsModels' => '指定的分机号码已被使用', ]; From c500efff3c9cb0b9b883ac08d3b36c27fa4aa78a Mon Sep 17 00:00:00 2001 From: boffart <> Date: Fri, 12 Jul 2024 11:57:47 +0300 Subject: [PATCH 07/13] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=D0=B5=D1=80=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/System/Storage.php | 141 ------------------------------------ 1 file changed, 141 deletions(-) diff --git a/src/Core/System/Storage.php b/src/Core/System/Storage.php index 1d61439da..206073c1b 100644 --- a/src/Core/System/Storage.php +++ b/src/Core/System/Storage.php @@ -172,147 +172,6 @@ public function copyMohFilesToStorage(): void } } - /** - * Mount an SFTP disk. - * - * @param string $host The SFTP server host. - * @param string $port The SFTP server port. - * @param string $user The SFTP server username. - * @param string $pass The SFTP server password. - * @param string $remote_dir The remote directory on the SFTP server. - * @param string $local_dir The local directory to mount the SFTP disk. - * @return bool Returns true if the SFTP disk is successfully mounted, false otherwise. - */ - public static function mountSftpDisk(string $host, string $port, string $user, string $pass, string $remote_dir, string $local_dir): bool - { - - // Create the local directory if it doesn't exist - Util::mwMkdir($local_dir); - - $out = []; - $timeoutPath = Util::which('timeout'); - $sshfsPath = Util::which('sshfs'); - - // Build the command to mount the SFTP disk - $command = "$timeoutPath 3 $sshfsPath -p $port -o nonempty -o password_stdin -o 'StrictHostKeyChecking=no' " . "$user@$host:$remote_dir $local_dir << EOF\n" . "$pass\n" . "EOF\n"; - - // Execute the command to mount the SFTP disk - Processes::mwExec($command, $out); - $response = trim(implode('', $out)); - - if ('Terminated' === $response) { - // The remote server did not respond or an incorrect password was provided. - unset($response); - } - - return self::isStorageDiskMounted("$local_dir "); - } - - /** - * Mount an FTP disk. - * - * @param string $host The FTP server host. - * @param string $port The FTP server port. - * @param string $user The FTP server username. - * @param string $pass The FTP server password. - * @param string $remote_dir The remote directory on the FTP server. - * @param string $local_dir The local directory to mount the FTP disk. - * @return bool Returns true if the FTP disk is successfully mounted, false otherwise. - */ - public static function mountFtp(string $host, string $port, string $user, string $pass, string $remote_dir, string $local_dir): bool - { - - // Create the local directory if it doesn't exist - Util::mwMkdir($local_dir); - $out = []; - - // Build the authentication line for the FTP connection - $auth_line = ''; - if (!empty($user)) { - $auth_line .= 'user="' . $user; - if (!empty($pass)) { - $auth_line .= ":$pass"; - } - $auth_line .= '",'; - } - - // Build the connect line for the FTP connection - $connect_line = 'ftp://' . $host; - if (!empty($port)) { - $connect_line .= ":$port"; - } - if (!empty($remote_dir)) { - $connect_line .= $remote_dir; - } - - $timeoutPath = Util::which('timeout'); - $curlftpfsPath = Util::which('curlftpfs'); - - // Build the command to mount the FTP disk - $command = "$timeoutPath 3 $curlftpfsPath -o allow_other -o {$auth_line}fsname=$host $connect_line $local_dir"; - - // Execute the command to mount the FTP disk - Processes::mwExec($command, $out); - $response = trim(implode('', $out)); - if ('Terminated' === $response) { - // The remote server did not respond or an incorrect password was provided. - unset($response); - } - - return self::isStorageDiskMounted("$local_dir "); - } - - /** - * Mount a WebDAV disk. - * - * @param string $host The WebDAV server host. - * @param string $user The WebDAV server username. - * @param string $pass The WebDAV server password. - * @param string $dstDir The destination directory on the WebDAV server. - * @param string $local_dir The local directory to mount the WebDAV disk. - * @return bool Returns true if the WebDAV disk is successfully mounted, false otherwise. - */ - public static function mountWebDav(string $host, string $user, string $pass, string $dstDir, string $local_dir): bool - { - $host = trim($host); - $dstDir = trim($dstDir); - - // Remove trailing slash from host if present - if (substr($host, -1) === '/') { - $host = substr($host, 0, -1); - } - - // Remove leading slash from destination directory if present - if ($dstDir[0] === '/') { - $dstDir = substr($dstDir, 1); - } - - // Create the local directory if it doesn't exist - Util::mwMkdir($local_dir); - $out = []; - $conf = 'dav_user www' . PHP_EOL . - 'dav_group www' . PHP_EOL; - - - // Write WebDAV credentials to secrets file - file_put_contents('/etc/davfs2/secrets', "$host$dstDir $user $pass"); - file_put_contents('/etc/davfs2/davfs2.conf', $conf); - $timeoutPath = Util::which('timeout'); - $mount = Util::which('mount.davfs'); - - // Build the command to mount the WebDAV disk - $command = "$timeoutPath 3 yes | $mount $host$dstDir $local_dir"; - - // Execute the command to mount the WebDAV disk - Processes::mwExec($command, $out); - $response = trim(implode('', $out)); - if ('Terminated' === $response) { - // The remote server did not respond or an incorrect password was provided. - unset($response); - } - return self::isStorageDiskMounted("$local_dir "); - } - /** * Create a file system on a disk. * From a9b4361c3b91120676d5e5941f681ca9b766bf6a Mon Sep 17 00:00:00 2001 From: boffart <> Date: Fri, 12 Jul 2024 13:27:14 +0300 Subject: [PATCH 08/13] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=8B?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BE=20=D1=82=D0=BE=D1=87=D0=BA=D0=B5=20=D0=BC=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B4?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/System/Storage.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Core/System/Storage.php b/src/Core/System/Storage.php index 206073c1b..8ec32621b 100644 --- a/src/Core/System/Storage.php +++ b/src/Core/System/Storage.php @@ -123,11 +123,12 @@ public static function isStorageDiskMounted(string $filter = '', string &$mount_ $grep = Util::which('grep'); $mount = Util::which('mount'); $awk = Util::which('awk'); + $head = Util::which('head'); $filter = escapeshellarg($filter); // Execute the command to filter the mount points based on the filter - $out = shell_exec("$mount | $grep $filter | $awk '{print $3}'"); + $out = shell_exec("$mount | $grep $filter | $awk '{print $3}' | $head -n 1"); $mount_dir = trim($out); return ($mount_dir !== ''); } @@ -1489,9 +1490,10 @@ public static function diskIsMounted(string $disk, string $filter = '/dev/') $out = []; $grepPath = Util::which('grep'); $mountPath = Util::which('mount'); + $headPath = Util::which('head'); // Execute mount command and grep the output for the disk name - Processes::mwExec("$mountPath | $grepPath '$filter$disk'", $out); + Processes::mwExec("$mountPath | $grepPath '$filter${disk}' | $headPath -n 1", $out); if (count($out) > 0) { $res_out = end($out); } else { @@ -1541,9 +1543,10 @@ public static function getFreeSpace(string $hdd) $grep = Util::which('grep'); $awk = Util::which('awk'); $df = Util::which('df'); + $head = Util::which('head'); // Execute df command to get the free space for the HDD - Processes::mwExec("$df -m | $grep $hdd | $awk '{print $4}'", $out); + Processes::mwExec("$df -m | $grep $hdd | $grep -v custom_modules | $head -n 1 | $awk '{print $4}'", $out); $result = 0; // Sum up the free space values From bda9c04dfde89d475173ab2bd2111bbf7046d434 Mon Sep 17 00:00:00 2001 From: boffart <> Date: Wed, 17 Jul 2024 08:37:47 +0300 Subject: [PATCH 09/13] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Lib/System/ConvertAudioFileAction.php | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/PBXCoreREST/Lib/System/ConvertAudioFileAction.php b/src/PBXCoreREST/Lib/System/ConvertAudioFileAction.php index 826325408..0aa008b79 100644 --- a/src/PBXCoreREST/Lib/System/ConvertAudioFileAction.php +++ b/src/PBXCoreREST/Lib/System/ConvertAudioFileAction.php @@ -22,11 +22,12 @@ use MikoPBX\Core\System\Processes; use MikoPBX\Core\System\Util; use MikoPBX\PBXCoreREST\Lib\PBXApiResult; +use Phalcon\Di\Injectable; /** * * @package MikoPBX\PBXCoreREST\Lib\System */ -class ConvertAudioFileAction extends \Phalcon\Di\Injectable +class ConvertAudioFileAction extends Injectable { /** * Convert the audio file to various codecs using Asterisk. @@ -38,18 +39,17 @@ public static function main(string $filename): PBXApiResult { $res = new PBXApiResult(); $res->processor = __METHOD__; - if ( ! file_exists($filename)) { + if (!file_exists($filename)) { $res->success = false; - $res->messages[] = "File '{$filename}' not found."; - - return $res; + $res->messages[] = "File '$filename' not found."; } $out = []; $tmp_filename = '/tmp/' . time() . "_" . basename($filename); - if (false === copy($filename, $tmp_filename)) { + if ($res->success && false === copy($filename, $tmp_filename)) { $res->success = false; - $res->messages[] = "Unable to create temporary file '{$tmp_filename}'."; - + $res->messages[] = "Unable to create temporary file '$tmp_filename'."; + } + if(!$res->success){ return $res; } @@ -62,12 +62,14 @@ public static function main(string $filename): PBXApiResult $tmp_filename = escapeshellcmd($tmp_filename); $n_filename = escapeshellcmd($n_filename); $soxPath = Util::which('sox'); - Processes::mwExec("{$soxPath} -v 0.99 -G '{$tmp_filename}' -c 1 -r 8000 -b 16 '{$n_filename}'", $out); + + // Предварительная конвертация в wav. + Processes::mwExec("$soxPath -v 0.99 -G '$n_filename' -c 1 -r 8000 -b 16 '$n_filename'", $out); $result_str = implode('', $out); // Convert wav file to mp3 format $lamePath = Util::which('lame'); - Processes::mwExec("{$lamePath} -b 32 --silent '{$n_filename}' '{$n_filename_mp3}'", $out); + Processes::mwExec("$lamePath -b 32 --silent '$n_filename' '$n_filename_mp3'", $out); $result_mp3 = implode('', $out); // Convert the file to various codecs using Asterisk @@ -77,7 +79,7 @@ public static function main(string $filename): PBXApiResult foreach ($codecs as $codec){ $result = shell_exec("$asteriskPath -rx 'file convert $tmp_filename $trimmedFileName.$codec'"); if(strpos($result, 'Converted') !== 0){ - shell_exec("$rmPath -rf /root/test.{$codec}"); + shell_exec("$rmPath -rf /root/test.$codec"); } } @@ -91,9 +93,8 @@ public static function main(string $filename): PBXApiResult return $res; } - if (file_exists($filename) - && $filename !== $n_filename - && $filename !== $n_filename_mp3) { + if ($filename !== $n_filename + && $filename !== $n_filename_mp3 && file_exists($filename)) { // Remove the original file if it's different from the converted files unlink($filename); } From c5655c859942da46d23406732c0869a29dfd3238 Mon Sep 17 00:00:00 2001 From: boffart <> Date: Mon, 22 Jul 2024 09:20:56 +0300 Subject: [PATCH 10/13] =?UTF-8?q?#770=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D1=83=20kvm.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/System/RootFS/etc/group | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Core/System/RootFS/etc/group b/src/Core/System/RootFS/etc/group index cc2963de0..2010fe792 100644 --- a/src/Core/System/RootFS/etc/group +++ b/src/Core/System/RootFS/etc/group @@ -11,3 +11,4 @@ dialout:x:1008: kmem:x:1009: uucp:x:1010: www:x:1011: +kvm:x:61: From 728f79c10eb097f5ffa49d3c57df2144149b7219 Mon Sep 17 00:00:00 2001 From: boffart <> Date: Tue, 23 Jul 2024 14:38:19 +0300 Subject: [PATCH 11/13] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Workers/Libs/WorkerCallEvents/ActionDialAnswer.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Core/Workers/Libs/WorkerCallEvents/ActionDialAnswer.php b/src/Core/Workers/Libs/WorkerCallEvents/ActionDialAnswer.php index 218743ce6..cd345d65e 100644 --- a/src/Core/Workers/Libs/WorkerCallEvents/ActionDialAnswer.php +++ b/src/Core/Workers/Libs/WorkerCallEvents/ActionDialAnswer.php @@ -118,16 +118,15 @@ private static function fillPickUpCdr($worker, $data): void $new_data = $m_row_data->toArray(); // Update certain fields in the new data. - $new_data['start'] = $data['answer']; - $new_data['answer'] = $data['answer']; - $new_data['endtime'] = ''; + $new_data['start'] = $data['answer']; + $new_data['answer'] = $data['answer']; + $new_data['endtime'] = ''; $new_data['dst_chan'] = $data['agi_channel']; - $new_data['dst_num'] = $data['dst_num']; + $new_data['dst_num'] = $data['dst_num']; $new_data['UNIQUEID'] = $data['id']; // Check if call recording is enabled for this source and destination numbers. if ($worker->enableMonitor($new_data['src_num'] ?? '', $new_data['dst_num'] ?? '')) { - // If it is, start recording the call. $new_data['recordingfile'] = $worker->MixMonitor($new_data['dst_chan'], 'pickup_' . $new_data['UNIQUEID'], '', '', 'fillPickUpCdr'); } From da3e0394997389f95cd5c440b663e6232b2e007e Mon Sep 17 00:00:00 2001 From: boffart <> Date: Wed, 24 Jul 2024 13:02:06 +0300 Subject: [PATCH 12/13] =?UTF-8?q?#727=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BB=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81?= =?UTF-8?q?=D1=81=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20/=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B4=D0=BB=D1=8F=20ssh.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/System/Configs/SSHConf.php | 72 ++++++++++++++--------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/Core/System/Configs/SSHConf.php b/src/Core/System/Configs/SSHConf.php index 9ab671a28..49bf68e1f 100644 --- a/src/Core/System/Configs/SSHConf.php +++ b/src/Core/System/Configs/SSHConf.php @@ -60,8 +60,8 @@ public function configure(): bool file_put_contents($lofFile, ''); } $this->generateDropbearKeys(); - $sshLogin = $this->getSSHLogin(); - $sshPort = escapeshellcmd(PbxSettings::getValueByKey(PbxSettingsConstants::SSH_PORT)); + $sshLogin = $this->getCreateSshUser(); + $sshPort = escapeshellcmd(PbxSettings::getValueByKey(PbxSettingsConstants::SSH_PORT)); // Update root password and restart SSH server $this->updateShellPassword($sshLogin); @@ -118,38 +118,34 @@ private function generateDropbearKeys(): void * * @return string SSH login username. */ - private function getSSHLogin(): string + private function getCreateSshUser(): string { $sshLogin = PbxSettings::getValueByKey(PbxSettingsConstants::SSH_LOGIN); $homeDir = $this->getUserHomeDir($sshLogin); - $passwdPath = '/etc/passwd'; - $newEntry = "$sshLogin:x:0:0:MikoPBX Admin:$homeDir:/bin/bash\n"; - - if ($sshLogin !== 'root') { - // Read the current contents of the passwd file - $passwdContent = file_get_contents($passwdPath); - $lines = explode("\n", $passwdContent); - $updated = false; - - // Check each line and update the entry if it exists - foreach ($lines as &$line) { - if (strpos($line, "$sshLogin:") === 0) { - $line = $newEntry; - $updated = true; - break; - } - } - unset($line); // break the reference with the last element - - // If the entry was updated, rewrite the file - if ($updated) { - file_put_contents($passwdPath, implode("\n", $lines)); - } else { - // Append the new entry if it wasn't found - file_put_contents($passwdPath, $newEntry, FILE_APPEND); + // System users, you can't touch them + $mainUsers = ['root', 'www']; + $bbPath = Util::which('busybox'); + // We clean all non-system users + exec("$bbPath cut -f 1 -d ':' < /etc/passwd", $systemUsers); + foreach ($systemUsers as $user){ + if($sshLogin === $user || in_array($user, $mainUsers, true)){ + continue; } + // Deleting the user + shell_exec("$bbPath deluser $user"); + // Deleting the group + shell_exec("$bbPath delgroup $user"); + } + if ($sshLogin !== 'root') { + // Adding a group '$sshLogin' + shell_exec("$bbPath addgroup $sshLogin"); + // Adding user '$sshLogin' + shell_exec("$bbPath adduser -h $homeDir -g 'MikoPBX SSH Admin' -s /bin/bash -G root -D '$sshLogin'"); + // Adding a user to the group '$sshLogin' + shell_exec("$bbPath addgroup -S '$sshLogin' $sshLogin"); + // Adding a user to the group 'root' + shell_exec("$bbPath addgroup -S '$sshLogin' root"); } - return $sshLogin; } @@ -174,17 +170,21 @@ private function getUserHomeDir(string $sshLogin = 'root'): string */ private function updateShellPassword(string $sshLogin = 'root'): void { - $password = PbxSettings::getValueByKey(PbxSettingsConstants::SSH_PASSWORD); - $hashString = PbxSettings::getValueByKey(PbxSettingsConstants::SSH_PASSWORD_HASH_STRING); - $disablePassLogin = PbxSettings::getValueByKey(PbxSettingsConstants::SSH_DISABLE_SSH_PASSWORD); + $password = PbxSettings::getValueByKey(PbxSettingsConstants::SSH_PASSWORD); + $hashString = PbxSettings::getValueByKey(PbxSettingsConstants::SSH_PASSWORD_HASH_STRING); + $disablePassLogin = PbxSettings::getValueByKey(PbxSettingsConstants::SSH_DISABLE_SSH_PASSWORD); - $echo = Util::which('echo'); + $echo = Util::which('echo'); $chpasswd = Util::which('chpasswd'); - $passwd = Util::which('passwd'); - Processes::mwExec("{$passwd} -l www"); + $passwd = Util::which('passwd'); + Processes::mwExec("$passwd -l www"); if ($disablePassLogin === '1') { Processes::mwExec("$passwd -l $sshLogin"); + Processes::mwExec("$passwd -l root"); + } elseif($sshLogin === 'root') { + Processes::mwExec("$echo '$sshLogin:$password' | $chpasswd"); } else { + Processes::mwExec("$passwd -l root"); Processes::mwExec("$echo '$sshLogin:$password' | $chpasswd"); } @@ -209,7 +209,7 @@ private function generateAuthorizedKeys(string $sshLogin = 'root'): void Util::mwMkdir($sshDir); $authorizedKeys = PbxSettings::getValueByKey(PbxSettingsConstants::SSH_AUTHORIZED_KEYS); - file_put_contents("{$sshDir}/authorized_keys", $authorizedKeys); + file_put_contents("$sshDir/authorized_keys", $authorizedKeys); } /** From bf3b00ac7da00b26b9a768609d8aa75c2fef2606 Mon Sep 17 00:00:00 2001 From: boffart <> Date: Thu, 25 Jul 2024 10:11:23 +0300 Subject: [PATCH 13/13] =?UTF-8?q?#727=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BB=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81?= =?UTF-8?q?=D1=81=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20/=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B4=D0=BB=D1=8F=20ssh.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Core/System/Configs/SSHConf.php | 8 ++++++++ src/Core/System/Notifications.php | 8 ++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Core/System/Configs/SSHConf.php b/src/Core/System/Configs/SSHConf.php index 49bf68e1f..ee22044ef 100644 --- a/src/Core/System/Configs/SSHConf.php +++ b/src/Core/System/Configs/SSHConf.php @@ -145,6 +145,14 @@ private function getCreateSshUser(): string shell_exec("$bbPath addgroup -S '$sshLogin' $sshLogin"); // Adding a user to the group 'root' shell_exec("$bbPath addgroup -S '$sshLogin' root"); + + $cat = Util::which('cat'); + $cut = Util::which('cut'); + $sed = Util::which('sed'); + $chown = Util::which('chown'); + $currentGroupId = trim(shell_exec("$cat /etc/passwd | grep '^$sshLogin:' | $cut -f 3 -d ':'")); + shell_exec("$sed -i 's/$sshLogin:x:$currentGroupId:/$sshLogin:x:0:/g' /etc/passwd"); + shell_exec("$chown -R $sshLogin:$sshLogin $homeDir"); } return $sshLogin; } diff --git a/src/Core/System/Notifications.php b/src/Core/System/Notifications.php index 4f819fd95..6a13112cc 100644 --- a/src/Core/System/Notifications.php +++ b/src/Core/System/Notifications.php @@ -86,6 +86,9 @@ public static function sendAdminNotification(string $subject, array $messages, b { // Prevent sending the same message twice. $di = Di::getDefault(); + if(!$di){ + return; + } $managedCache = $di->getShared(ManagedCacheProvider::SERVICE_NAME); $cacheKey = 'sendAdminNotification:' . md5($subject . implode('', $messages)); $cacheTime = 3600 * 24; // 1 day @@ -96,7 +99,7 @@ public static function sendAdminNotification(string $subject, array $messages, b } // Check if the notification system is available (e.g., PHP Mailer is configured and working). - if (!Notifications::checkConnection(Notifications::TYPE_PHP_MAILER)) { + if (!self::checkConnection(self::TYPE_PHP_MAILER)) { return; } @@ -106,7 +109,8 @@ public static function sendAdminNotification(string $subject, array $messages, b foreach ($messages as $message) { $text .= '
      ' . Util::translate($message, false); } - $text = $text . '

      ' . SystemMessages::getInfoMessage("The MikoPBX connection information"); + $text .= '

      ' . SystemMessages::getInfoMessage("The MikoPBX connection information"); + $text = str_replace(PHP_EOL, '
      ', $text); // Get the admin email address from PbxSettings. $adminMail = PbxSettings::getValueByKey(PbxSettingsConstants::SYSTEM_NOTIFICATIONS_EMAIL);