From f73b78f292abf8d3b694217157cd23b1dbddef15 Mon Sep 17 00:00:00 2001 From: Kode Date: Sun, 13 Mar 2022 19:30:24 +0000 Subject: [PATCH] Add search providers as an editable yaml file + allow searching tiles --- app/Search.php | 56 +- app/Setting.php | 6 + composer.json | 3 +- composer.lock | 81 +- config/app.php | 1 + public/css/app.css | 1891 ++++++++++++++++- public/js/app.js | 742 ++++++- public/mix-manifest.json | 4 +- resources/assets/js/app.js | 36 +- resources/views/item.blade.php | 2 +- storage/app/searchproviders.yaml | 37 + vendor/bin/yaml-lint | 1 + vendor/composer/ClassLoader.php | 2 +- vendor/composer/autoload_classmap.php | 321 +++ vendor/composer/autoload_files.php | 2 +- vendor/composer/autoload_psr4.php | 1 + vendor/composer/autoload_real.php | 9 +- vendor/composer/autoload_static.php | 328 ++- vendor/composer/installed.json | 78 + vendor/composer/installed.php | 13 +- vendor/symfony/yaml/CHANGELOG.md | 237 +++ vendor/symfony/yaml/Command/LintCommand.php | 289 +++ vendor/symfony/yaml/Dumper.php | 140 ++ vendor/symfony/yaml/Escaper.php | 95 + .../symfony/yaml/Exception/DumpException.php | 21 + .../yaml/Exception/ExceptionInterface.php | 21 + .../symfony/yaml/Exception/ParseException.php | 132 ++ .../yaml/Exception/RuntimeException.php | 21 + vendor/symfony/yaml/Inline.php | 812 +++++++ vendor/symfony/yaml/LICENSE | 19 + vendor/symfony/yaml/Parser.php | 1305 ++++++++++++ vendor/symfony/yaml/README.md | 13 + vendor/symfony/yaml/Resources/bin/yaml-lint | 45 + vendor/symfony/yaml/Tag/TaggedValue.php | 38 + vendor/symfony/yaml/Unescaper.php | 132 ++ vendor/symfony/yaml/Yaml.php | 100 + vendor/symfony/yaml/composer.json | 42 + 37 files changed, 7013 insertions(+), 63 deletions(-) create mode 100644 storage/app/searchproviders.yaml create mode 120000 vendor/bin/yaml-lint create mode 100644 vendor/symfony/yaml/CHANGELOG.md create mode 100644 vendor/symfony/yaml/Command/LintCommand.php create mode 100644 vendor/symfony/yaml/Dumper.php create mode 100644 vendor/symfony/yaml/Escaper.php create mode 100644 vendor/symfony/yaml/Exception/DumpException.php create mode 100644 vendor/symfony/yaml/Exception/ExceptionInterface.php create mode 100644 vendor/symfony/yaml/Exception/ParseException.php create mode 100644 vendor/symfony/yaml/Exception/RuntimeException.php create mode 100644 vendor/symfony/yaml/Inline.php create mode 100644 vendor/symfony/yaml/LICENSE create mode 100644 vendor/symfony/yaml/Parser.php create mode 100644 vendor/symfony/yaml/README.md create mode 100755 vendor/symfony/yaml/Resources/bin/yaml-lint create mode 100644 vendor/symfony/yaml/Tag/TaggedValue.php create mode 100644 vendor/symfony/yaml/Unescaper.php create mode 100644 vendor/symfony/yaml/Yaml.php create mode 100644 vendor/symfony/yaml/composer.json diff --git a/app/Search.php b/app/Search.php index 2d65413c..096a99f6 100644 --- a/app/Search.php +++ b/app/Search.php @@ -6,6 +6,7 @@ use App\Item; use App\Setting; use Form; use Cache; +use Yaml; abstract class Search { @@ -19,7 +20,7 @@ abstract class Search { $providers = self::standardProviders(); $providers = $providers + self::appProviders(); - return $providers; + return collect($providers); } /** @@ -41,38 +42,16 @@ abstract class Search */ public static function standardProviders() { - return [ - 'google' => [ - 'url' => 'https://www.google.com/search', - 'var' => 'q', - 'method' => 'get', - 'type' => 'standard', - ], - 'ddg' => [ - 'url' => 'https://duckduckgo.com/', - 'var' => 'q', - 'method' => 'get', - 'type' => 'standard', - ], - 'bing' => [ - 'url' => 'https://www.bing.com/search', - 'var' => 'q', - 'method' => 'get', - 'type' => 'standard', - ], - 'qwant' => [ - 'url' => 'https://www.qwant.com/', - 'var' => 'q', - 'method' => 'get', - 'type' => 'standard', - ], - 'startpage' => [ - 'url' => 'https://www.startpage.com/do/dsearch', - 'var' => 'query', - 'method' => 'get', - 'type' => 'standard', - ], - ]; + // $providers = json_decode(file_get_contents(storage_path('app/searchproviders.json'))); + // print_r($providers); + $providers = Yaml::parseFile(storage_path('app/searchproviders.yaml')); + $all = []; + foreach($providers as $key => $provider) { + $all[$key] = $provider; + $all[$key]['type'] = 'standard'; + } + + return $all; } /** @@ -90,10 +69,11 @@ abstract class Search if(($provider = Item::isSearchProvider($app->class)) !== false) { $name = Item::nameFromClass($app->class); $providers[$app->id] = [ + 'id' => $app->id, 'type' => $provider->type, 'class' => $app->class, 'url' => $app->url, - 'title' => $app->title, + 'name' => $app->title, 'colour' => $app->colour, 'icon' => $app->icon, 'description' => $app->description @@ -133,12 +113,8 @@ abstract class Search $output .= '
'; $output .= ''; $output .= Form::text('q', null, ['class' => 'homesearch', 'autofocus' => 'autofocus', 'placeholder' => __('app.settings.search').'...']); diff --git a/app/Setting.php b/app/Setting.php index 2df15b10..7264d367 100644 --- a/app/Setting.php +++ b/app/Setting.php @@ -74,6 +74,9 @@ class Setting extends Model case 'select': if(!empty($this->value) && $this->value !== 'none') { $options = (array)json_decode($this->options); + if($this->key === 'search_provider') { + $options = Search::providers()->pluck('name', 'id')->toArray(); + } $value = __($options[$this->value]); } else { $value = __('app.options.none'); @@ -122,6 +125,9 @@ class Setting extends Model break; case 'select': $options = json_decode($this->options); + if($this->key === 'search_provider') { + $options = Search::providers()->pluck('name', 'id'); + } foreach($options as $key => $opt) { $options->$key = __($opt); } diff --git a/composer.json b/composer.json index eea5e492..fafd8500 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,8 @@ "laravel/framework": "^7.0", "laravel/tinker": "^2.0", "laravel/ui": "^2.4", - "laravelcollective/html": "^6.0" + "laravelcollective/html": "^6.0", + "symfony/yaml": "^5.4" }, "require-dev": { "filp/whoops": "~2.0", diff --git a/composer.lock b/composer.lock index 9cf5f08f..43086ecf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7c2e9180811d1213f10aedcef74bf8dd", + "content-hash": "d613105a42b9bb713b2dbc3073bebdc8", "packages": [ { "name": "brick/math", @@ -5925,6 +5925,81 @@ ], "time": "2022-03-02T12:42:23+00:00" }, + { + "name": "symfony/yaml", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", + "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-26T16:32:32+00:00" + }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "2.2.4", @@ -8076,8 +8151,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.1.3" + "php": ">=7.2.5" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.1.0" } diff --git a/config/app.php b/config/app.php index cced8f1d..93611e0a 100644 --- a/config/app.php +++ b/config/app.php @@ -228,6 +228,7 @@ return [ 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, + 'Yaml' => Symfony\Component\Yaml\Yaml::class, 'SupportedApps' => App\SupportedApps::class, 'EnhancedApps' => App\EnhancedApps::class, diff --git a/public/css/app.css b/public/css/app.css index 0a5b9ccc..940060ef 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -1,4 +1,1891 @@ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}body{background:#cfd2d4}#switchuser{background:rgba(0,0,0,.5);position:absolute;padding:10px;color:#fff;text-align:center;bottom:0;left:0;display:flex;flex-direction:column;justify-content:center;align-items:center;border-top:2px solid hsla(0,0%,100%,.15);border-right:2px solid hsla(0,0%,100%,.15);box-shadow:0 0 10px 0 rgba(0,0,0,.4);border-radius:0 9px 0 0;line-height:1.5;font-size:14px}#switchuser img{width:50px;margin-bottom:5px;border-radius:50%}#switchuser .btn{font-size:13px;color:#fff;text-decoration:none;margin:8px -10px -10px;border-radius:0;width:calc(100% + 22px);background:hsla(0,0%,100%,.15);transition:all .35s ease-in-out}#switchuser .btn:hover{background:#d64d55}#app{min-height:100vh;background-image:url(../img/bg1.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom}#app,#app nav{display:flex;flex-direction:column}#app nav{height:100%;position:absolute;width:340px;left:-340px;transition:all .35s ease-in-out;background:rgba(0,0,0,.7);color:#fff;z-index:2}#app .content{flex-grow:1;display:flex;flex-direction:column}#app .content .appheader{background:rgba(0,0,0,.4);text-align:center;position:absolute;height:58px;width:100%;top:-58px;transition:all .35s ease-in-out;z-index:1}#app .content .appheader ul{display:inline-block;list-style:none;height:58px;border-left:1px solid rgba(0,0,0,.6);border-right:1px solid hsla(0,0%,100%,.1);margin:0;padding:0}#app .content .appheader li{display:inline-block;border-right:1px solid rgba(0,0,0,.6);border-left:1px solid hsla(0,0%,100%,.1)}#app .content .appheader a{display:inline-block;color:#fff;text-decoration:none;padding:20px}#app main{flex-direction:column}#app #sortable,#app main{padding:30px 10px;display:flex;justify-content:center;align-items:center;flex:1;position:relative;flex-wrap:wrap;align-content:center;list-style:none;margin:0}#config-buttons{position:fixed;bottom:0;right:0;display:flex;flex-direction:column}#config-buttons a{width:50px;height:50px;background:rgba(0,0,0,.8);text-align:center;line-height:50px;color:#fff;margin-top:1px}#config-buttons a img{width:26px;height:26px;margin-top:12px}.userlist,.userlist .user{display:flex;justify-content:center;align-items:center}.userlist .user{background:rgba(0,0,0,.5);padding:15px;flex-direction:column;margin:20px;color:#fff;text-decoration:none;border-radius:15px;border:5px solid hsla(0,0%,100%,.7);box-shadow:0 0 10px 0 rgba(0,0,0,.4)}.userlist .user-img{width:130px;height:130px;border-radius:50%;margin:10px 10px 15px}.userlist #password{color:#2f313a;width:100%;padding:5px 10px;margin:15px -5px}.userlist .btn{width:100%}.userlist .forgot{color:#fff;font-size:12px;margin-top:25px}.item-container{position:relative}.item-container .item-edit{color:#fff;position:absolute;bottom:20px;left:8px;width:30px;height:30px;background:rgba(0,0,0,.7);border-radius:50%;text-align:center;line-height:30px;display:none}.black{color:#000!important}.white{color:#fff!important}.message-container,.message-container2{width:100%;padding:10px 20px}.alert{margin:30px auto;text-align:center;max-width:800px;background:#f1f4f7;display:flex;justify-content:center;padding:5px 20px 5px 80px;box-shadow:0 0 15px 3px rgba(0,0,0,.3)}.alert.alert-danger,.alert.alert-success{position:relative}.alert.alert-danger:before,.alert.alert-success:before{content:"\F00C";font-family:Font Awesome\ 5 Pro;font-weight:900;position:absolute;top:0;left:0;bottom:0;width:60px;background:#0eb584;text-align:center;color:#fff;line-height:57px;font-size:24px;align-items:center;justify-content:center;display:flex}.alert.alert-danger:before{content:"\F00D";background:#d64d55}.alert a{color:#91a1b3}#app.header .add-item,#app.header .item{transform:scale(.9);opacity:.8;margin:20px 0}#app.sidebar nav{left:0}.add-item{width:280px;height:90px;margin:20px;flex:0 0 280px;border-radius:6px;padding:20px;border:4px dashed hsla(0,0%,100%,.7);box-shadow:0 0 20px 2px rgba(0,0,0,.3);color:#fff;overflow:hidden;position:relative;display:none;outline:1px solid transparent}.add-item.active,.add-item a{display:block}.add-item a{width:100%;text-align:center;line-height:40px;color:#fff;font-size:19px}.item{width:280px;height:90px;margin:20px;flex:0 0 280px;background-image:linear-gradient(90deg,hsla(0,0%,100%,0),hsla(0,0%,100%,.25));border-radius:6px;padding:15px 55px 15px 15px;color:#fff;overflow:hidden;position:relative;transition:all .35s ease-in-out;outline:1px solid transparent;display:flex;align-items:center;border:1px solid #4a4a4a;border:1px solid rgba(76,76,76,.4);-webkit-background-clip:padding-box;background-clip:padding-box}.item:after{content:"";width:90px;height:90px;border-radius:50%;position:absolute;right:-48px;top:0;background:hsla(0,0%,100%,.1);box-shadow:0 0 40px 0 rgba(0,0,0,.2)}.item .link{position:absolute;right:0;top:0;height:100%;width:100%;text-align:right;line-height:90px;color:#fff;font-size:24px;z-index:1;padding-right:10px}.item .title{font-size:16px}.item .details{width:100%}.text-center{text-align:center!important}.module-container{box-shadow:0 0 10px 0 rgba(0,0,0,.4);border:1px solid #cdced8;background:#f9fafd;max-width:1000px;width:100%;margin:10px 40px;border-radius:5px;overflow:hidden}.module-container footer,.module-container header{display:flex;justify-content:space-between;align-items:center;border-top:1px solid #fff;background:#f2f3f6;font-size:16px;border-bottom:1px solid #dbdce3;height:60px;position:relative}.module-container footer .section-title,.module-container header .section-title{font-size:18px;color:#5b5b5b;margin-left:25px}.module-container footer{border-top:1px solid #dbdce3}.module-container .table{width:100%;margin:0;background:#fff}.module-container .table thead th{background:#f2f3f6;color:#767d94;border-top:1px solid #fff;text-align:left;font-size:13px;text-transform:uppercase;padding:15px 25px}.module-container .table tbody tr:hover{background:#fefbf2}.module-container .table tbody tr:hover td:first-child{position:relative}.module-container .table tbody tr:hover td:first-child:before{content:"";position:absolute;top:0;left:0;bottom:0;width:5px;background:#0eb584}.module-container .table tbody td{padding:20px 25px;font-size:13px;color:#2f313a;max-width:500px;word-break:break-word}.module-container .table tbody td.form-error{background:#e69191;color:#fff;text-align:center}.module-container .table tbody a{color:#2f313a}.homesearch{height:51px}.toggleinput{display:flex;flex-direction:column-reverse;line-height:1;font-size:9px;font-weight:400;text-transform:uppercase;color:#ababab;padding:0 20px}.toggleinput label.name{margin-top:6px}.module-actions{display:flex;justify-content:space-between;align-items:center}.module-actions .button{font-size:18px;color:#515564;padding:0 10px;border:none;border-left:1px solid #cdced8;display:flex;line-height:1;position:relative;background:transparent;flex-direction:column;justify-content:center;align-items:center;min-width:65px;height:60px;text-decoration:none;box-sizing:border-box}.module-actions .button:after{position:absolute;content:"";top:0;left:0;bottom:0;border-right:1px solid #fff}.module-actions .button span{display:inline-block;line-height:1;font-size:9px;font-weight:400;text-transform:uppercase;color:#ababab;position:relative;top:4px;margin:0}div.create{padding:30px 15px;display:flex;flex-wrap:wrap}div.create .input{width:280px;margin:20px}div.create .input label:not(.switch){width:100%;font-size:13px;color:#9094a5;margin-bottom:15px;display:block;font-weight:300}div.create .input input,div.create .input select{width:100%;border:1px solid #dedfe2;padding:10px;border-radius:6px}.app-icon{max-width:60px;margin-right:15px}.sidenav{position:relative}.sidenav .close-sidenav{position:absolute;top:20px;right:20px;font-size:24px;color:#ccc}.sidenav h2{font-weight:300;padding:20px;margin:0}.sidenav ul{list-style:none;margin:0;padding:20px}.sidenav ul li{display:flex;justify-content:space-between;padding:5px}.sidenav ul li a{color:#2b3542}.sidenav ul li a.active{color:#46b0e6}.trashed{font-size:11px;color:#91a1b3;margin-left:20px}.switch{position:relative;display:inline-block;width:36px;height:20px}.switch input{display:none}.slider{cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#4a556b}.slider,.slider:before{position:absolute;transition:.4s}.slider:before{content:"";height:14px;width:14px;left:3px;bottom:3px;background-color:#fff}input:checked+.slider{background-color:#2196f3}input:focus+.slider{box-shadow:0 0 1px #2196f3}input:checked+.slider:before{transform:translateX(16px)}.slider.round{border-radius:20px}.slider.round:before{border-radius:50%}@-webkit-keyframes autofill{to{background:#f5f5f5;color:#2f313a;font-weight:700}}@keyframes autofill{to{background:#f5f5f5;color:#2f313a;font-weight:700}}input:-webkit-autofill{-webkit-animation-name:autofill;-webkit-animation-fill-mode:both}input:autofill{-webkit-animation-name:autofill;animation-name:autofill;-webkit-animation-fill-mode:both;animation-fill-mode:both}button.link{border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent}a.settinglink{color:#2f313a;font-size:13px;margin:15px 5px;display:inline-block;font-weight:700}.setting-view-image{margin-bottom:20px;display:inline-block}.setting-view-image img{max-width:330px}.searchform{display:flex;align-self:flex-start;text-align:center;margin:50px auto;padding:14px;background:rgba(0,0,0,.2);border-radius:14px;box-shadow:inset 0 1px 6px 0 rgba(0,0,0,.3);border-top:1px solid rgba(0,0,0,.5);border-bottom:1px solid hsla(0,0%,100%,.35);position:relative;width:100%;max-width:620px}.searchform form{width:100%}.searchform .input-container{background:#fff;border-radius:5px;box-shadow:0 0 5px 0 rgba(0,0,0,.4);overflow:hidden;position:relative;display:flex}.searchform input{padding:17px 15px;font-size:15px;border:0;width:100%;background:transparent}.searchform button{position:absolute;right:0;top:0;border:none;font-size:16px;padding:7px 15px;line-height:38px;font-weight:500;border-top-right-radius:5px;border-bottom-right-radius:5px;color:#fff;text-transform:uppercase;background:#d64d55}.searchform select{padding:0 10px;background:#f5f5f5;border:none;border-right:1px solid #ddd}.ui-autocomplete{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;padding:4px 0;margin:0 0 10px 25px;list-style:none;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:5px;box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px}.ui-menu-item{display:block;padding:3px 15px;clear:both;font-weight:400;line-height:18px;color:#555;white-space:nowrap;text-decoration:none}.ui-state-active,.ui-state-hover{font-weight:700}#appimage img{max-width:95px}#sapconfig,.newblock{display:none;width:100%}#sapconfig h2,.newblock h2{background:#f2f3f6;padding:2px 25px;height:60px;margin-left:-15px;width:calc(100% + 30px);border-top:1px solid #dbdce3;border-bottom:1px solid #dbdce3;font-size:18px;color:#5b5b5b;font-weight:500;display:flex;justify-content:space-between;align-items:center}#sapconfig .items,.newblock .items{display:flex}hr{margin:23px 0 18px;height:0;border-style:none;border-width:0;border-top:1px solid #eaeaea;border-bottom:1px solid #fff}.upload-btn-wrapper{position:relative;overflow:hidden;display:inline-block}.btn{border:none;background-color:#d64d55;padding:8px 12px;border-radius:8px}.btn,.btn.test{color:#fff;font-size:16px}.btn.test{font-weight:500;border-top-right-radius:5px;border-bottom-right-radius:5px;text-transform:uppercase;padding:8px 50px;background:#207774}.upload-btn-wrapper input[type=file]{font-size:100px;position:absolute;left:0;top:0;opacity:0}.icon-container{display:flex;align-items:center}.icon-container img{margin-right:15px}.ui-helper-hidden-accessible{display:none}.livestats-container .livestats{margin:5px 0 0;padding:0;display:flex;list-style:none;justify-content:space-between;width:100%}.livestats-container .livestats span{display:block;text-transform:uppercase;font-size:11px;font-weight:500;opacity:.5;line-height:1;display:flex;text-align:left}.livestats-container .livestats strong{display:block;line-height:1;display:flex;align-items:center;color:#fff;font-size:12px;line-height:1.2}.livestats-container .livestats strong span{margin-left:4px}.livestats-container .livestats li{text-align:center;margin:0;line-height:1}.livestats-container .livestats li.right{text-align:right}.livestats-container .livestats li.right span{justify-content:flex-end}.livestats-container .livestats.flexcolumn{flex-direction:column}.livestats-container.black .livestats strong{color:#000}input:-webkit-autofill,input:-webkit-autofill:focus input:-webkit-autofill,input:-webkit-autofill:hover,select:-webkit-autofill,select:-webkit-autofill:focus,select:-webkit-autofill:hover,textarea:-webkit-autofill,textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus{border:inherit;-webkit-text-fill-color:inherit;-webkit-box-shadow:inherit;transition:inherit;color:#2f313a!important}.title-marquee{width:125px;overflow:hidden;display:flex;align-items:flex-start;margin-top:2px}.title-marquee>span,.title-marquee>strong{white-space:nowrap;transform:translate(0);-webkit-animation:marquee 8s linear;animation:marquee 8s linear}.no-marquee .title,.title-marquee .title{margin-right:4px}@-webkit-keyframes marquee{0%{transform:translate(0)}20%{transform:translate(0)}95%{transform:translate(-200%)}to{transform:translate(-200%)}}@keyframes marquee{0%{transform:translate(0)}20%{transform:translate(0)}95%{transform:translate(-200%)}to{transform:translate(-200%)}} +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +a { + background-color: transparent; +} + +a:active, +a:hover { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +button { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html input[type=button], +input[type=reset], +input[type=submit] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +input { + line-height: normal; +} + +input[type=checkbox], +input[type=radio] { + box-sizing: border-box; + padding: 0; +} + +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + height: auto; +} + +input[type=search] { + -webkit-appearance: textfield; + box-sizing: content-box; +} + +input[type=search]::-webkit-search-cancel-button, +input[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +html { + box-sizing: border-box; +} + +*, *:before, *:after { + box-sizing: inherit; +} + +body { + background: #cfd2d4; +} + +#switchuser { + background: rgba(0, 0, 0, 0.5); + position: absolute; + padding: 10px; + color: white; + text-align: center; + bottom: 0; + left: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + border-top: 2px solid rgba(255, 255, 255, 0.15); + border-right: 2px solid rgba(255, 255, 255, 0.15); + box-shadow: 0 0 10px 0px rgba(0, 0, 0, 0.4); + border-radius: 0 9px 0 0; + line-height: 1.5; + font-size: 14px; +} +#switchuser img { + width: 50px; + margin-bottom: 5px; + border-radius: 50%; +} +#switchuser .btn { + font-size: 13px; + color: white; + text-decoration: none; + margin-left: -10px; + margin-right: -10px; + margin-bottom: -10px; + margin-top: 8px; + border-radius: 0; + width: calc(100% + 22px); + background: rgba(255, 255, 255, 0.15); + transition: all 0.35s ease-in-out; +} +#switchuser .btn:hover { + background: #d64d55; +} + +#app { + display: flex; + min-height: 100vh; + flex-direction: column; + background-image: url("../img/bg1.jpg"); + background-repeat: no-repeat; + background-size: cover; + background-position: bottom center; +} +#app nav { + display: flex; + flex-direction: column; + height: 100%; + position: absolute; + width: 340px; + left: -340px; + transition: all 0.35s ease-in-out; + background: rgba(0, 0, 0, 0.7); + color: white; + z-index: 2; +} +#app .content { + flex-grow: 1; + display: flex; + flex-direction: column; +} +#app .content .appheader { + background: rgba(0, 0, 0, 0.4); + text-align: center; + position: absolute; + height: 58px; + width: 100%; + top: -58px; + transition: all 0.35s ease-in-out; + z-index: 1; +} +#app .content .appheader ul { + display: inline-block; + list-style: none; + height: 58px; + border-left: 1px solid rgba(0, 0, 0, 0.6); + border-right: 1px solid rgba(255, 255, 255, 0.1); + margin: 0; + padding: 0; +} +#app .content .appheader li { + display: inline-block; + border-right: 1px solid rgba(0, 0, 0, 0.6); + border-left: 1px solid rgba(255, 255, 255, 0.1); +} +#app .content .appheader a { + display: inline-block; + color: white; + text-decoration: none; + padding: 20px; +} +#app main { + flex-direction: column; +} +#app main, #app #sortable { + padding: 30px 10px; + display: flex; + justify-content: center; + align-items: center; + flex: 1; + position: relative; + flex-wrap: wrap; + align-content: center; + list-style: none; + margin: 0; +} + +#config-buttons { + position: fixed; + bottom: 0; + right: 0; + display: flex; + flex-direction: column; +} +#config-buttons a { + width: 50px; + height: 50px; + background: rgba(0, 0, 0, 0.8); + text-align: center; + line-height: 50px; + color: white; + margin-top: 1px; +} +#config-buttons a img { + width: 26px; + height: 26px; + margin-top: 12px; +} + +.userlist { + display: flex; + justify-content: center; + align-items: center; +} +.userlist .user { + background: rgba(0, 0, 0, 0.5); + display: flex; + padding: 15px; + flex-direction: column; + justify-content: center; + align-items: center; + margin: 20px; + color: white; + text-decoration: none; + border-radius: 15px; + border: 5px solid rgba(255, 255, 255, 0.7); + box-shadow: 0 0 10px 0px rgba(0, 0, 0, 0.4); +} +.userlist .user-img { + width: 130px; + height: 130px; + margin-bottom: 20px; + border-radius: 50%; + margin: 10px 10px 15px; +} +.userlist #password { + color: #2f313a; + width: 100%; + padding: 5px 10px; + margin: 15px -5px; +} +.userlist .btn { + width: 100%; +} +.userlist .forgot { + color: white; + font-size: 12px; + margin-top: 25px; +} + +.item-container { + position: relative; +} +.item-container .item-edit { + color: white; + position: absolute; + bottom: 20px; + left: 8px; + width: 30px; + height: 30px; + background: rgba(0, 0, 0, 0.7); + border-radius: 50%; + text-align: center; + line-height: 30px; + display: none; +} + +.black { + color: #000 !important; +} + +.white { + color: #fff !important; +} + +.message-container { + width: 100%; + padding: 10px 20px; +} + +.message-container2 { + width: 100%; + padding: 10px 20px; +} + +.alert { + margin: 30px auto; + text-align: center; + max-width: 800px; + background: #f1f4f7; + padding: 5px 20px; + display: flex; + justify-content: center; + padding-left: 80px; + box-shadow: 0 0 15px 3px rgba(0, 0, 0, 0.3); +} +.alert.alert-success, .alert.alert-danger { + position: relative; +} +.alert.alert-success:before, .alert.alert-danger:before { + content: "\F00C"; + font-family: "Font Awesome 5 Pro"; + font-weight: 900; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 60px; + background: #0eb584; + text-align: center; + color: white; + line-height: 57px; + font-size: 24px; + align-items: center; + justify-content: center; + display: flex; +} +.alert.alert-danger:before { + content: "\F00D"; + background: #d64d55; +} +.alert a { + color: #91a1b3; +} + +#app.header .item, #app.header .add-item { + transform: scale(0.9); + opacity: 0.8; + margin: 20px 0; +} +#app.sidebar nav { + left: 0; +} + +.add-item { + width: 280px; + height: 90px; + margin: 20px; + flex: 0 0 280px; + border-radius: 6px; + padding: 20px; + border: 4px dashed rgba(255, 255, 255, 0.7); + box-shadow: 0 0 20px 2px rgba(0, 0, 0, 0.3); + color: white; + overflow: hidden; + position: relative; + display: none; + outline: 1px solid transparent; +} +.add-item.active { + display: block; +} +.add-item a { + display: block; + width: 100%; + text-align: center; + line-height: 40px; + color: white; + font-size: 19px; +} + +.item { + width: 280px; + height: 90px; + margin: 20px; + flex: 0 0 280px; + background-image: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.25)); + border-radius: 6px; + padding: 15px; + padding-right: 55px; + color: white; + overflow: hidden; + position: relative; + transition: all 0.35s ease-in-out; + outline: 1px solid transparent; + display: flex; + align-items: center; + border: 1px solid #333333; + border: 1px solid #4a4a4a; + border: 1px solid rgba(76, 76, 76, 0.4); + -webkit-background-clip: padding-box; + background-clip: padding-box; +} +.item:after { + content: ""; + position: absolute; + width: 90px; + height: 90px; + border-radius: 50%; + position: absolute; + right: -48px; + top: 0px; + background: rgba(255, 255, 255, 0.1); + box-shadow: 0 0 40px 0px rgba(0, 0, 0, 0.2); +} +.item .link { + position: absolute; + right: 0; + top: 0; + height: 100%; + width: 100%; + text-align: right; + line-height: 90px; + color: white; + font-size: 24px; + z-index: 1; + padding-right: 10px; +} +.item .title { + font-size: 16px; +} +.item .details { + width: 100%; +} + +.text-center { + text-align: center !important; +} + +.module-container { + box-shadow: 0 0 10px 0px rgba(0, 0, 0, 0.4); + border: 1px solid #cdced8; + background: #f9fafd; + max-width: 1000px; + width: 100%; + margin: 10px 40px; + border-radius: 5px; + overflow: hidden; +} +.module-container header, .module-container footer { + display: flex; + justify-content: space-between; + align-items: center; + border-top: 1px solid #fff; + background: #f2f3f6; + font-size: 16px; + border-bottom: 1px solid #dbdce3; + height: 60px; + position: relative; +} +.module-container header .section-title, .module-container footer .section-title { + font-size: 18px; + color: #5b5b5b; + margin-left: 25px; +} +.module-container footer { + border-top: 1px solid #dbdce3; +} +.module-container .table { + width: 100%; + margin: 0; + background: #fff; +} +.module-container .table thead th { + background: #f2f3f6; + color: #767d94; + border-top: 1px solid #fff; + text-align: left; + font-size: 13px; + text-transform: uppercase; + padding: 15px 25px; +} +.module-container .table tbody tr:hover { + background: #fefbf2; +} +.module-container .table tbody tr:hover td:first-child { + position: relative; +} +.module-container .table tbody tr:hover td:first-child:before { + content: ""; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 5px; + background: #0eb584; +} +.module-container .table tbody td { + padding: 20px 25px; + font-size: 13px; + color: #2f313a; + max-width: 500px; + word-break: break-word; +} +.module-container .table tbody td.form-error { + background: #e69191; + color: white; + text-align: center; +} +.module-container .table tbody a { + color: #2f313a; +} + +.homesearch { + height: 51px; +} + +.toggleinput { + display: flex; + flex-direction: column-reverse; + line-height: 1; + font-size: 9px; + font-weight: 400; + text-transform: uppercase; + color: #ababab; + padding: 0 20px; +} +.toggleinput label.name { + margin-top: 6px; +} + +.module-actions { + display: flex; + justify-content: space-between; + align-items: center; +} +.module-actions .button { + font-size: 18px; + color: #515564; + padding: 0 10px; + border: none; + border-left: 1px solid #cdced8; + display: flex; + line-height: 1; + position: relative; + background: transparent; + flex-direction: column; + justify-content: center; + align-items: center; + min-width: 65px; + height: 60px; + text-decoration: none; + box-sizing: border-box; +} +.module-actions .button:after { + position: absolute; + content: ""; + top: 0; + left: 0; + bottom: 0; + border-right: 1px solid #fff; +} +.module-actions .button span { + display: inline-block; + line-height: 1; + font-size: 9px; + font-weight: 400; + text-transform: uppercase; + color: #ababab; + position: relative; + top: 4px; + margin: 0; +} + +div.create { + padding: 30px 15px; + display: flex; + flex-wrap: wrap; +} +div.create .input { + width: 280px; + margin: 20px; +} +div.create .input label:not(.switch) { + width: 100%; + font-size: 13px; + color: #9094a5; + margin-bottom: 15px; + display: block; + font-weight: 300; +} +div.create .input input, div.create .input select { + width: 100%; + border: 1px solid #dedfe2; + padding: 10px; + border-radius: 6px; +} + +.app-icon { + max-width: 60px; + margin-right: 15px; +} + +.sidenav { + position: relative; +} +.sidenav .close-sidenav { + position: absolute; + top: 20px; + right: 20px; + font-size: 24px; + color: #ccc; +} +.sidenav h2 { + font-weight: 300; + padding: 20px; + margin: 0; +} +.sidenav ul { + list-style: none; + margin: 0; + padding: 20px; +} +.sidenav ul li { + display: flex; + justify-content: space-between; + padding: 5px; +} +.sidenav ul li a { + color: #2b3542; +} +.sidenav ul li a.active { + color: #46b0e6; +} + +.trashed { + font-size: 11px; + color: #91a1b3; + margin-left: 20px; +} + +.switch { + position: relative; + display: inline-block; + width: 36px; + height: 20px; +} + +/* Hide default HTML checkbox */ +.switch input { + display: none; +} + +/* The slider */ +.slider { + position: absolute; + cursor: pointer; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #4a556b; + transition: 0.4s; +} + +.slider:before { + position: absolute; + content: ""; + height: 14px; + width: 14px; + left: 3px; + bottom: 3px; + background-color: white; + transition: 0.4s; +} + +input:checked + .slider { + background-color: #2196F3; +} + +input:focus + .slider { + box-shadow: 0 0 1px #2196F3; +} + +input:checked + .slider:before { + transform: translateX(16px); +} + +/* Rounded sliders */ +.slider.round { + border-radius: 20px; +} + +.slider.round:before { + border-radius: 50%; +} + +@-webkit-keyframes autofill { + to { + background: #f5f5f5; + color: #2f313a; + font-weight: bold; + } +} +@keyframes autofill { + to { + background: #f5f5f5; + color: #2f313a; + font-weight: bold; + } +} +input:-webkit-autofill { + -webkit-animation-name: autofill; + -webkit-animation-fill-mode: both; +} + +input:autofill { + -webkit-animation-name: autofill; + animation-name: autofill; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +button.link { + border: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background: transparent; +} + +a.settinglink { + color: #2f313a; + font-size: 13px; + margin: 15px 5px; + display: inline-block; + font-weight: 700; +} + +.setting-view-image { + margin-bottom: 20px; + display: inline-block; +} +.setting-view-image img { + max-width: 330px; +} + +.searchform { + display: flex; + align-self: flex-start; + text-align: center; + margin: 50px auto; + padding: 14px; + background: rgba(0, 0, 0, 0.2); + border-radius: 14px; + box-shadow: inset 0px 1px 6px 0 rgba(0, 0, 0, 0.3); + border-top: 1px solid rgba(0, 0, 0, 0.5); + border-bottom: 1px solid rgba(255, 255, 255, 0.35); + position: relative; + width: 100%; + max-width: 620px; +} +.searchform form { + width: 100%; +} +.searchform .input-container { + background: white; + border-radius: 5px; + box-shadow: 0px 0px 5px 0 rgba(0, 0, 0, 0.4); + overflow: hidden; + position: relative; + display: flex; +} +.searchform input { + padding: 17px 15px; + font-size: 15px; + border: 0 none; + width: 100%; + background: transparent; +} +.searchform button { + position: absolute; + right: 0px; + top: 0px; + border: none; + font-size: 16px; + padding: 7px 15px; + line-height: 38px; + font-weight: 500; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + color: white; + text-transform: uppercase; + background: #d64d55; +} +.searchform select { + padding: 0 10px; + background: #f5f5f5; + border: none; + border-right: 1px solid #ddd; +} + +.ui-autocomplete { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + float: left; + display: none; + min-width: 160px; + padding: 4px 0; + margin: 0 0 10px 25px; + list-style: none; + background-color: #ffffff; + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.2); + border-style: solid; + border-width: 1px; + border-radius: 5px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + *border-right-width: 2px; + *border-bottom-width: 2px; +} + +.ui-menu-item { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #555555; + white-space: nowrap; + text-decoration: none; +} + +.ui-state-hover, .ui-state-active { + font-weight: 700; +} + +#appimage img { + max-width: 95px; +} + +#sapconfig, .newblock { + display: none; + width: 100%; +} +#sapconfig h2, .newblock h2 { + background: #f2f3f6; + padding: 2px 25px; + height: 60px; + margin-left: -15px; + width: calc(100% + 30px); + /* margin-right: -30px; */ + border-top: 1px solid #dbdce3; + border-bottom: 1px solid #dbdce3; + font-size: 18px; + color: #5b5b5b; + font-weight: 500; + display: flex; + justify-content: space-between; + align-items: center; +} +#sapconfig .items, .newblock .items { + display: flex; +} + +hr { + margin: 23px 0 18px; + height: 0; + border-style: none; + border-width: 0; + border-top: 1px solid #eaeaea; + border-bottom: 1px solid #fff; +} + +.upload-btn-wrapper { + position: relative; + overflow: hidden; + display: inline-block; +} + +.btn { + border: none; + color: white; + background-color: #d64d55; + padding: 8px 12px; + border-radius: 8px; + font-size: 16px; +} +.btn.test { + font-size: 16px; + font-weight: 500; + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; + color: white; + text-transform: uppercase; + padding: 8px 50px; + background: #207774; +} + +.upload-btn-wrapper input[type=file] { + font-size: 100px; + position: absolute; + left: 0; + top: 0; + opacity: 0; +} + +.icon-container { + display: flex; + align-items: center; +} +.icon-container img { + margin-right: 15px; +} + +.ui-helper-hidden-accessible { + display: none; +} + +.livestats-container .livestats { + margin: 5px 0px 0px; + padding: 0; + display: flex; + list-style: none; + justify-content: space-between; + width: 100%; +} +.livestats-container .livestats span { + display: block; + text-transform: uppercase; + font-size: 11px; + font-weight: 500; + opacity: 0.5; + line-height: 1; + display: flex; + text-align: left; +} +.livestats-container .livestats strong { + display: block; + line-height: 1; + display: flex; + align-items: center; + color: white; + font-size: 12px; + line-height: 1.2; +} +.livestats-container .livestats strong span { + margin-left: 4px; +} +.livestats-container .livestats li { + text-align: center; + margin: 0; + line-height: 1; +} +.livestats-container .livestats li.right { + text-align: right; +} +.livestats-container .livestats li.right span { + justify-content: flex-end; +} +.livestats-container .livestats.flexcolumn { + flex-direction: column; +} +.livestats-container.black .livestats strong { + color: #000; +} + +input:-webkit-autofill, +input:-webkit-autofill:hover, +input:-webkit-autofill:focus input:-webkit-autofill, +textarea:-webkit-autofill, +textarea:-webkit-autofill:hover textarea:-webkit-autofill:focus, +select:-webkit-autofill, +select:-webkit-autofill:hover, +select:-webkit-autofill:focus { + border: inherit; + -webkit-text-fill-color: inherit; + -webkit-box-shadow: inherit; + transition: inherit; + color: #2f313a !important; +} + +.title-marquee { + width: 125px; + overflow: hidden; + display: flex; + align-items: flex-start; + margin-top: 2px; +} +.title-marquee > span, .title-marquee > strong { + white-space: nowrap; + transform: translate(0, 0); + -webkit-animation: marquee 8s linear; + animation: marquee 8s linear; +} +.title-marquee .title { + margin-right: 4px; +} + +.no-marquee .title { + margin-right: 4px; +} + +@-webkit-keyframes marquee { + 0% { + transform: translate(0, 0); + } + 20% { + transform: translate(0, 0); + } + 95% { + transform: translate(-200%, 0); + } + 100% { + transform: translate(-200%, 0); + } +} + +@keyframes marquee { + 0% { + transform: translate(0, 0); + } + 20% { + transform: translate(0, 0); + } + 95% { + transform: translate(-200%, 0); + } + 100% { + transform: translate(-200%, 0); + } +} /*! Huebee v2.0.0 http://huebee.buzz ----------------------------------------------- */.huebee{position:absolute;z-index:1;transform:translateY(0);transition:opacity .15s,transform .15s}.huebee.is-hidden{opacity:0;transform:translateY(10px)}.huebee.is-static-open{position:relative;z-index:auto}.huebee__container{position:absolute;left:0;top:5px;padding:10px;background:#eee;border-radius:5px;box-shadow:0 5px 10px rgba(0,0,0,.3)}.huebee.is-static-open .huebee__container{position:relative;display:inline-block;left:auto;top:auto;box-shadow:none}.huebee__canvas{display:block;cursor:pointer}.huebee__cursor{width:15px;height:15px;position:absolute;left:0;top:0;box-sizing:content-box;border:3px solid #fff;border-radius:5px;pointer-events:none}.huebee__cursor.is-hidden{opacity:0}.huebee__close-button{display:block;position:absolute;width:24px;height:24px;top:-9px;right:-9px;border-radius:12px;background:#222}.huebee__close-button__x{stroke:#fff;stroke-width:3;stroke-linecap:round}.huebee__close-button:hover{background:#fff;cursor:pointer}.huebee__close-button:hover .huebee__close-button__x{stroke:#222}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:39px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent;border-style:solid;border-width:5px 4px 0;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888;border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #dedfe2;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#f2f3f6;border:1px solid #dedfe2;border-radius:4px;cursor:default;float:left;margin-right:5px;font-size:13px;font-weight:300;margin-top:5px;padding:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:1px solid #dedfe2;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:linear-gradient(180deg,#fff 50%,#eee);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFFFF",endColorstr="#FFEEEEEE",GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:linear-gradient(180deg,#eee 50%,#ccc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEEEEEE",endColorstr="#FFCCCCCC",GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent;border-style:solid;border-width:5px 4px 0;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888;border-width:0 4px 5px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:linear-gradient(180deg,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFFFF",endColorstr="#FFEEEEEE",GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:linear-gradient(180deg,#eee 50%,#fff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEEEEEE",endColorstr="#FFFFFFFF",GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} \ No newline at end of file +---------------------------------------------- */ +.huebee { + position: absolute; + z-index: 1; + transform: translateY(0px); + transition: opacity 0.15s, transform 0.15s; +} + +.huebee.is-hidden { + opacity: 0; + transform: translateY(10px); +} + +.huebee.is-static-open { + position: relative; + z-index: auto; +} + +.huebee__container { + position: absolute; + left: 0; + top: 5px; + padding: 10px; + background: #EEE; + border-radius: 5px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); +} + +.huebee.is-static-open .huebee__container { + position: relative; + display: inline-block; + left: auto; + top: auto; + box-shadow: none; +} + +.huebee__canvas { + display: block; + cursor: pointer; +} + +.huebee__cursor { + width: 15px; + height: 15px; + position: absolute; + left: 0px; + top: 0px; + box-sizing: content-box; + border: 3px solid white; + border-radius: 5px; + pointer-events: none; +} + +.huebee__cursor.is-hidden { + opacity: 0; +} + +.huebee__close-button { + display: block; + position: absolute; + width: 24px; + height: 24px; + top: -9px; + right: -9px; + border-radius: 12px; + background: #222; +} + +.huebee__close-button__x { + stroke: white; + stroke-width: 3; + stroke-linecap: round; +} + +.huebee__close-button:hover { + background: white; + cursor: pointer; +} + +.huebee__close-button:hover .huebee__close-button__x { + stroke: #222; +} + +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; +} + +.select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} + +.select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.select2-container .select2-selection--single .select2-selection__clear { + position: relative; +} + +.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; +} + +.select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 39px; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} + +.select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.select2-container .select2-search--inline { + float: left; +} + +.select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; + padding: 0; +} + +.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; +} + +.select2-results { + display: block; +} + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; +} + +.select2-results__option { + padding: 6px; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-user-select: none; +} + +.select2-results__option[aria-selected] { + cursor: pointer; +} + +.select2-container--open .select2-dropdown { + left: 0; +} + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-search--dropdown { + display: block; + padding: 4px; +} + +.select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; +} + +.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +.select2-search--dropdown.select2-search--hide { + display: none; +} + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); +} + +.select2-hidden-accessible { + border: 0 !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + width: 1px !important; + white-space: nowrap !important; +} + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; +} + +.select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; +} + +.select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #dedfe2; + border-radius: 4px; + cursor: text; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered li { + list-style: none; +} + +.select2-container--default .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; +} + +.select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #f2f3f6; + border: 1px solid #dedfe2; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + font-size: 13px; + font-weight: 300; + margin-top: 5px; + padding: 5px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline { + float: right; +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid #dedfe2 1px; + outline: 0; +} + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; +} + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; +} + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--default .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} + +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; +} + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; +} + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} + +.select2-container--classic .select2-selection--single { + background-color: #f7f7f7; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFFFF", endColorstr="#FFEEEEEE", GradientType=0); +} + +.select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; +} + +.select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; +} + +.select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; +} + +.select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEEEEEE", endColorstr="#FFCCCCCC", GradientType=0); +} + +.select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; +} + +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; +} + +.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; +} + +.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFFFFFFF", endColorstr="#FFEEEEEE", GradientType=0); +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#FFEEEEEE", endColorstr="#FFFFFFFF", GradientType=0); +} + +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; +} + +.select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; +} + +.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; +} + +.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice { + float: right; + margin-left: 5px; + margin-right: auto; +} + +.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; +} + +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; +} + +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; +} + +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; + box-shadow: none; +} + +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; +} + +.select2-container--classic .select2-dropdown--above { + border-bottom: none; +} + +.select2-container--classic .select2-dropdown--below { + border-top: none; +} + +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--classic .select2-results__option[role=group] { + padding: 0; +} + +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; +} + +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; +} + +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} + +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; +} \ No newline at end of file diff --git a/public/js/app.js b/public/js/app.js index d8ae8c80..33042837 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -1 +1,741 @@ -function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}!function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==("undefined"==typeof module?"undefined":_typeof(module))&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var n=this._events=this._events||{},i=n[t]=n[t]||[];return-1==i.indexOf(e)&&i.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var n=this._onceEvents=this._onceEvents||{};return(n[t]=n[t]||{})[e]=!0,this}},e.off=function(t,e){var n=this._events&&this._events[t];if(n&&n.length){var i=n.indexOf(e);return-1!=i&&n.splice(i,1),this}},e.emitEvent=function(t,e){var n=this._events&&this._events[t];if(n&&n.length){var i=0,o=n[i];e=e||[];for(var s=this._onceEvents&&this._onceEvents[t];o;){var r=s&&s[o];r&&(this.off(t,o),delete s[o]),o.apply(this,e),o=n[i+=r?0:1]}return this}},t}),function(t,e){"function"==typeof define&&define.amd?define("unipointer/unipointer",["ev-emitter/ev-emitter"],function(n){return e(t,n)}):"object"==("undefined"==typeof module?"undefined":_typeof(module))&&module.exports?module.exports=e(t,require("ev-emitter")):t.Unipointer=e(t,t.EvEmitter)}(window,function(t,e){function n(){}var i=n.prototype=Object.create(e.prototype);i.bindStartEvent=function(t){this._bindStartEvent(t,!0)},i.unbindStartEvent=function(t){this._bindStartEvent(t,!1)},i._bindStartEvent=function(e,n){var i=(n=void 0===n||!!n)?"addEventListener":"removeEventListener";t.navigator.pointerEnabled?e[i]("pointerdown",this):t.navigator.msPointerEnabled?e[i]("MSPointerDown",this):(e[i]("mousedown",this),e[i]("touchstart",this))},i.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},i.getTouch=function(t){for(var e=0;e.5;var o=this.colorGrid[e.toUpperCase()];this.updateCursor(o),this.setTexts(),this.setBackgrounds(),n||this.emitEvent("change",[e,t.hue,t.sat,t.lum])}},h.setTexts=function(){if(this.setTextElems)for(var t=0;t0&&(void 0===document.addEventListener||void 0===t?console.log("This browser does not support visibilityChange"):document.addEventListener(e,function(){document[t]?function(){for(var t=0,e=i;t .5; + var o = this.colorGrid[e.toUpperCase()]; + this.updateCursor(o), this.setTexts(), this.setBackgrounds(), n || this.emitEvent("change", [e, t.hue, t.sat, t.lum]); + } + }, f.setTexts = function () { + if (this.setTextElems) for (var t = 0; t < this.setTextElems.length; t++) { + var e = this.setTextElems[t], + n = "INPUT" == e.nodeName ? "value" : "textContent"; + e[n] = this.color; + } + }, f.setBackgrounds = function () { + if (this.setBGElems) for (var t = this.isLight ? "#222" : "white", e = 0; e < this.setBGElems.length; e++) { + var n = this.setBGElems[e]; + n.style.backgroundColor = this.color, n.style.color = t; + } + }, f.updateCursor = function (t) { + if (this.isOpen) { + var e = t ? "remove" : "add"; + + if (this.cursor.classList[e]("is-hidden"), t) { + var n = this.gridSize, + i = this.canvasOffset, + o = this.cursorBorder; + this.cursor.style.left = t.x * n + i.x - o + "px", this.cursor.style.top = t.y * n + i.y - o + "px"; + } + } + }; + var C = t.console, + S = document.readyState; + "complete" == S || "interactive" == S ? o() : document.addEventListener("DOMContentLoaded", o), i.data = function (t) { + t = h(t); + var e = t && t.huebeeGUID; + return e && l[e]; + }; + var y = document.createElement("canvas"); + y.width = y.height = 1; + + var _ = y.getContext("2d"); + + return i; +}); +$.when($.ready).then(function () { + var base = (document.querySelector('base') || {}).href; + + if ($('.message-container').length) { + setTimeout(function () { + $('.message-container').fadeOut(); + }, 3500); + } // from https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API + // Set the name of the hidden property and the change event for visibility + + + var hidden, visibilityChange; + + if (typeof document.hidden !== "undefined") { + // Opera 12.10 and Firefox 18 and later support + hidden = "hidden"; + visibilityChange = "visibilitychange"; + } else if (typeof document.msHidden !== "undefined") { + hidden = "msHidden"; + visibilityChange = "msvisibilitychange"; + } else if (typeof document.webkitHidden !== "undefined") { + hidden = "webkitHidden"; + visibilityChange = "webkitvisibilitychange"; + } + + var livestatsRefreshTimeouts = []; + var livestatsFuncs = []; + var livestatsContainers = $('.livestats-container'); + + function stopLivestatsRefresh() { + for (var _i = 0, _livestatsRefreshTime = livestatsRefreshTimeouts; _i < _livestatsRefreshTime.length; _i++) { + var timeoutId = _livestatsRefreshTime[_i]; + window.clearTimeout(timeoutId); + } + } + + function startLivestatsRefresh() { + for (var _i2 = 0, _livestatsFuncs = livestatsFuncs; _i2 < _livestatsFuncs.length; _i2++) { + var fun = _livestatsFuncs[_i2]; + fun(); + } + } + + if (livestatsContainers.length > 0) { + if (typeof document.addEventListener === "undefined" || hidden === undefined) { + console.log("This browser does not support visibilityChange"); + } else { + document.addEventListener(visibilityChange, function () { + if (document[hidden]) { + stopLivestatsRefresh(); + } else { + startLivestatsRefresh(); + } + }, false); + } + + livestatsContainers.each(function (index) { + var id = $(this).data('id'); + var dataonly = $(this).data('dataonly'); + var increaseby = dataonly == 1 ? 20000 : 1000; + var container = $(this); + var max_timer = 30000; + var timer = 5000; + + var fun = function worker() { + $.ajax({ + url: base + 'get_stats/' + id, + dataType: 'json', + success: function success(data) { + container.html(data.html); + if (data.status == 'active') timer = increaseby;else { + if (timer < max_timer) timer += 2000; + } + }, + complete: function complete() { + // Schedule the next request when the current one's complete + livestatsRefreshTimeouts[index] = window.setTimeout(worker, timer); + } + }); + }; + + livestatsFuncs[index] = fun; + fun(); + }); + } + + function readURL(input) { + if (input.files && input.files[0]) { + var reader = new FileReader(); + + reader.onload = function (e) { + $('#appimage img').attr('src', e.target.result); + }; + + reader.readAsDataURL(input.files[0]); + } + } + + $('#upload').change(function () { + readURL(this); + }); + /*$(".droppable").droppable({ + tolerance: "intersect", + drop: function( event, ui ) { + var tag = $( this ).data('id'); + var item = $( ui.draggable ).data('id'); + $.get('tag/add/'+tag+'/'+item, function(data) { + if(data == 1) { + $( ui.draggable ).remove(); + } else { + alert('not added'); + } + }); + } + });*/ + + $('#sortable').sortable({ + stop: function stop(event, ui) { + var idsInOrder = $('#sortable').sortable('toArray', { + attribute: 'data-id' + }); + $.post(base + 'order', { + order: idsInOrder + }); + } + }); + $('#sortable').sortable('disable'); + $('#search-container').on('input', 'input[name=q]', function () { + var search = this.value; + var items = $('#sortable').children('.item-container'); + + if ($('#search-container select[name=provider]').val() === 'tiles') { + if (search.length > 0) { + items.hide(); + items.filter(function () { + var name = $(this).data('name').toLowerCase(); + return name.includes(search.toLowerCase()); + }).show(); + } else { + items.show(); + } + } else { + items.show(); + } + }).on('change', 'select[name=provider]', function () { + var items = $('#sortable').children('.item-container'); + + if ($(this).val() === 'tiles') { + $('#search-container button').hide(); + var search = $('#search-container input[name=q]').val(); + + if (search.length > 0) { + items.hide(); + items.filter(function () { + var name = $(this).data('name').toLowerCase(); + return name.includes(search.toLowerCase()); + }).show(); + } else { + items.show(); + } + } else { + $('#search-container button').show(); + items.show(); + } + }); + $('#app').on('click', '#config-button', function (e) { + e.preventDefault(); + var app = $('#app'); + var active = app.hasClass('header'); + app.toggleClass('header'); + + if (active) { + $('.add-item').hide(); + $('.item-edit').hide(); + $('#app').removeClass('sidebar'); + $('#sortable').sortable('disable'); + } else { + $('#sortable').sortable('enable'); + setTimeout(function () { + $('.add-item').fadeIn(); + $('.item-edit').fadeIn(); + }, 350); + } + }).on('click', '#add-item, #pin-item', function (e) { + e.preventDefault(); + var app = $('#app'); + var active = app.hasClass('sidebar'); + app.toggleClass('sidebar'); + }).on('click', '.close-sidenav', function (e) { + e.preventDefault(); + var app = $('#app'); + app.removeClass('sidebar'); + }).on('click', '#test_config', function (e) { + e.preventDefault(); + var apiurl = $('#create input[name=url]').val(); + var override_url = $('#create input[name="config[override_url]"]').val(); + + if (override_url.length && override_url != '') { + apiurl = override_url; + } + + var data = {}; + data['url'] = apiurl; + $('.config-item').each(function (index) { + var config = $(this).data('config'); + data[config] = $(this).val(); + }); + $.post(base + 'test_config', { + data: data + }, function (data) { + alert(data); + }); + }); + $('#pinlist').on('click', 'a', function (e) { + e.preventDefault(); + var current = $(this); + var id = current.data('id'); + var tag = current.data('tag'); + $.get(base + 'items/pintoggle/' + id + '/true/' + tag, function (data) { + var inner = $(data).filter('#sortable').html(); + $('#sortable').html(inner); + current.toggleClass('active'); + }); + }); +}); diff --git a/public/mix-manifest.json b/public/mix-manifest.json index fc52f9e7..82b7e59d 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,4 +1,4 @@ { - "/css/app.css": "/css/app.css?id=62b46d36567ec0e3418f", - "/js/app.js": "/js/app.js?id=fd29fe4c923023023da6" + "/css/app.css": "/css/app.css?id=bafda2139c75830558d2", + "/js/app.js": "/js/app.js?id=0ff185efa8c02e94999e" } diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js index 4a41a3d4..683309ba 100644 --- a/resources/assets/js/app.js +++ b/resources/assets/js/app.js @@ -128,7 +128,41 @@ $.when( $.ready ).then(function() { }); $('#sortable').sortable('disable'); - + $('#search-container').on('input', 'input[name=q]', function () { + const search = this.value + const items = $('#sortable').children('.item-container') + if($('#search-container select[name=provider]').val() === 'tiles') { + if(search.length > 0) { + items.hide() + items.filter(function () { + const name = $(this).data('name').toLowerCase(); + return name.includes(search.toLowerCase()) + }).show() + } else { + items.show() + } + } else { + items.show() + } + }).on('change', 'select[name=provider]', function () { + const items = $('#sortable').children('.item-container') + if($(this).val() === 'tiles') { + $('#search-container button').hide() + const search = $('#search-container input[name=q]').val() + if(search.length > 0) { + items.hide() + items.filter(function () { + const name = $(this).data('name').toLowerCase(); + return name.includes(search.toLowerCase()) + }).show() + } else { + items.show() + } + } else { + $('#search-container button').show() + items.show() + } + }) $('#app').on('click', '#config-button', function(e) { e.preventDefault(); diff --git a/resources/views/item.blade.php b/resources/views/item.blade.php index 738dbe96..c29e1590 100644 --- a/resources/views/item.blade.php +++ b/resources/views/item.blade.php @@ -1,4 +1,4 @@ -
+
@if($app->icon) diff --git a/storage/app/searchproviders.yaml b/storage/app/searchproviders.yaml new file mode 100644 index 00000000..6c5ab5e5 --- /dev/null +++ b/storage/app/searchproviders.yaml @@ -0,0 +1,37 @@ +tiles: + id: tiles + name: Tiles + target: _blank + +google: + id: google + url: https://www.google.com/search + name: Google + method: get + target: _blank + query: q + +bing: + id: bing + url: https://www.bing.com/search + name: Bing + method: get + target: _blank + query: q + +ddg: + id: ddg + url: https://duckduckgo.com/ + name: DuckDuckGo + method: get + target: _blank + query: q + +startpage: + id: startpage + url: https://www.startpage.com/do/dsearch + name: Startpage + method: get + target: _blank + query: query + diff --git a/vendor/bin/yaml-lint b/vendor/bin/yaml-lint new file mode 120000 index 00000000..1c1bbf3c --- /dev/null +++ b/vendor/bin/yaml-lint @@ -0,0 +1 @@ +../symfony/yaml/Resources/bin/yaml-lint \ No newline at end of file diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php index afef3fa2..0cd6055d 100644 --- a/vendor/composer/ClassLoader.php +++ b/vendor/composer/ClassLoader.php @@ -149,7 +149,7 @@ class ClassLoader /** * @return string[] Array of classname => path - * @psalm-return array + * @psalm-var array */ public function getClassMap() { diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index b3fa634d..984ba951 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -43,6 +43,315 @@ return array( 'App\\SettingGroup' => $baseDir . '/app/SettingGroup.php', 'App\\SettingUser' => $baseDir . '/app/SettingUser.php', 'App\\SupportedApps' => $baseDir . '/app/SupportedApps.php', + 'App\\SupportedApps\\AMP\\AMP' => $baseDir . '/app/SupportedApps/AMP/AMP.php', + 'App\\SupportedApps\\AVMFritzbox\\AVMFritzbox' => $baseDir . '/app/SupportedApps/AVMFritzbox/AVMFritzbox.php', + 'App\\SupportedApps\\AWX\\AWX' => $baseDir . '/app/SupportedApps/AWX/AWX.php', + 'App\\SupportedApps\\AdGuardHome\\AdGuardHome' => $baseDir . '/app/SupportedApps/AdGuardHome/AdGuardHome.php', + 'App\\SupportedApps\\Adminer\\Adminer' => $baseDir . '/app/SupportedApps/Adminer/Adminer.php', + 'App\\SupportedApps\\Airsonic\\Airsonic' => $baseDir . '/app/SupportedApps/Airsonic/Airsonic.php', + 'App\\SupportedApps\\AlarmPI\\AlarmPI' => $baseDir . '/app/SupportedApps/AlarmPI/AlarmPI.php', + 'App\\SupportedApps\\Alertmanager\\Alertmanager' => $baseDir . '/app/SupportedApps/Alertmanager/Alertmanager.php', + 'App\\SupportedApps\\ArchiSteamFarm\\ArchiSteamFarm' => $baseDir . '/app/SupportedApps/ArchiSteamFarm/ArchiSteamFarm.php', + 'App\\SupportedApps\\ArchiveBox\\ArchiveBox' => $baseDir . '/app/SupportedApps/ArchiveBox/ArchiveBox.php', + 'App\\SupportedApps\\ArchiveTeamWarrior\\ArchiveTeamWarrior' => $baseDir . '/app/SupportedApps/ArchiveTeamWarrior/ArchiveTeamWarrior.php', + 'App\\SupportedApps\\AriaNg\\AriaNg' => $baseDir . '/app/SupportedApps/AriaNg/AriaNg.php', + 'App\\SupportedApps\\Artifactory\\Artifactory' => $baseDir . '/app/SupportedApps/Artifactory/Artifactory.php', + 'App\\SupportedApps\\AsrockRackIPMI\\AsrockRackIPMI' => $baseDir . '/app/SupportedApps/AsrockRackIPMI/AsrockRackIPMI.php', + 'App\\SupportedApps\\Bacula\\Bacula' => $baseDir . '/app/SupportedApps/Bacula/Bacula.php', + 'App\\SupportedApps\\Baikal\\Baikal' => $baseDir . '/app/SupportedApps/Baikal/Baikal.php', + 'App\\SupportedApps\\Bastillion\\Bastillion' => $baseDir . '/app/SupportedApps/Bastillion/Bastillion.php', + 'App\\SupportedApps\\Bazarr\\Bazarr' => $baseDir . '/app/SupportedApps/Bazarr/Bazarr.php', + 'App\\SupportedApps\\Bitwarden\\Bitwarden' => $baseDir . '/app/SupportedApps/Bitwarden/Bitwarden.php', + 'App\\SupportedApps\\Booksonic\\Booksonic' => $baseDir . '/app/SupportedApps/Booksonic/Booksonic.php', + 'App\\SupportedApps\\Bookstack\\Bookstack' => $baseDir . '/app/SupportedApps/Bookstack/Bookstack.php', + 'App\\SupportedApps\\Box\\Box' => $baseDir . '/app/SupportedApps/Box/Box.php', + 'App\\SupportedApps\\Cabot\\Cabot' => $baseDir . '/app/SupportedApps/Cabot/Cabot.php', + 'App\\SupportedApps\\CalibreWeb\\CalibreWeb' => $baseDir . '/app/SupportedApps/CalibreWeb/CalibreWeb.php', + 'App\\SupportedApps\\Cardigann\\Cardigann' => $baseDir . '/app/SupportedApps/Cardigann/Cardigann.php', + 'App\\SupportedApps\\ChangeDetectionio\\ChangeDetectionio' => $baseDir . '/app/SupportedApps/ChangeDetectionio/ChangeDetectionio.php', + 'App\\SupportedApps\\CheckMK\\CheckMK' => $baseDir . '/app/SupportedApps/CheckMK/CheckMK.php', + 'App\\SupportedApps\\Chevereto\\Chevereto' => $baseDir . '/app/SupportedApps/Chevereto/Chevereto.php', + 'App\\SupportedApps\\Chronograf\\Chronograf' => $baseDir . '/app/SupportedApps/Chronograf/Chronograf.php', + 'App\\SupportedApps\\Clarkson\\Clarkson' => $baseDir . '/app/SupportedApps/Clarkson/Clarkson.php', + 'App\\SupportedApps\\CloudCMD\\CloudCMD' => $baseDir . '/app/SupportedApps/CloudCMD/CloudCMD.php', + 'App\\SupportedApps\\CockpitCMS\\CockpitCMS' => $baseDir . '/app/SupportedApps/CockpitCMS/CockpitCMS.php', + 'App\\SupportedApps\\Cockpit\\Cockpit' => $baseDir . '/app/SupportedApps/Cockpit/Cockpit.php', + 'App\\SupportedApps\\Codeserver\\Codeserver' => $baseDir . '/app/SupportedApps/Codeserver/Codeserver.php', + 'App\\SupportedApps\\CodiMD\\CodiMD' => $baseDir . '/app/SupportedApps/CodiMD/CodiMD.php', + 'App\\SupportedApps\\Concourse\\Concourse' => $baseDir . '/app/SupportedApps/Concourse/Concourse.php', + 'App\\SupportedApps\\Confluence\\Confluence' => $baseDir . '/app/SupportedApps/Confluence/Confluence.php', + 'App\\SupportedApps\\CouchPotato\\CouchPotato' => $baseDir . '/app/SupportedApps/CouchPotato/CouchPotato.php', + 'App\\SupportedApps\\CryptPad\\CryptPad' => $baseDir . '/app/SupportedApps/CryptPad/CryptPad.php', + 'App\\SupportedApps\\Deluge\\Deluge' => $baseDir . '/app/SupportedApps/Deluge/Deluge.php', + 'App\\SupportedApps\\Dillinger\\Dillinger' => $baseDir . '/app/SupportedApps/Dillinger/Dillinger.php', + 'App\\SupportedApps\\Directus\\Directus' => $baseDir . '/app/SupportedApps/Directus/Directus.php', + 'App\\SupportedApps\\DokuWiki\\DokuWiki' => $baseDir . '/app/SupportedApps/DokuWiki/DokuWiki.php', + 'App\\SupportedApps\\Domoticz\\Domoticz' => $baseDir . '/app/SupportedApps/Domoticz/Domoticz.php', + 'App\\SupportedApps\\Dozzle\\Dozzle' => $baseDir . '/app/SupportedApps/Dozzle/Dozzle.php', + 'App\\SupportedApps\\Drone\\Drone' => $baseDir . '/app/SupportedApps/Drone/Drone.php', + 'App\\SupportedApps\\Droppy\\Droppy' => $baseDir . '/app/SupportedApps/Droppy/Droppy.php', + 'App\\SupportedApps\\Duplicacy\\Duplicacy' => $baseDir . '/app/SupportedApps/Duplicacy/Duplicacy.php', + 'App\\SupportedApps\\Duplicati\\Duplicati' => $baseDir . '/app/SupportedApps/Duplicati/Duplicati.php', + 'App\\SupportedApps\\ESPHome\\ESPHome' => $baseDir . '/app/SupportedApps/ESPHome/ESPHome.php', + 'App\\SupportedApps\\Element\\Element' => $baseDir . '/app/SupportedApps/Element/Element.php', + 'App\\SupportedApps\\EmbyStat\\EmbyStat' => $baseDir . '/app/SupportedApps/EmbyStat/EmbyStat.php', + 'App\\SupportedApps\\Emby\\Emby' => $baseDir . '/app/SupportedApps/Emby/Emby.php', + 'App\\SupportedApps\\FileBrowser\\FileBrowser' => $baseDir . '/app/SupportedApps/FileBrowser/FileBrowser.php', + 'App\\SupportedApps\\FileFlows\\FileFlows' => $baseDir . '/app/SupportedApps/FileFlows/FileFlows.php', + 'App\\SupportedApps\\FileRun\\FileRun' => $baseDir . '/app/SupportedApps/FileRun/FileRun.php', + 'App\\SupportedApps\\Firefly\\Firefly' => $baseDir . '/app/SupportedApps/Firefly/Firefly.php', + 'App\\SupportedApps\\FirefoxSend\\FirefoxSend' => $baseDir . '/app/SupportedApps/FirefoxSend/FirefoxSend.php', + 'App\\SupportedApps\\FlexGet\\FlexGet' => $baseDir . '/app/SupportedApps/FlexGet/FlexGet.php', + 'App\\SupportedApps\\Flood\\Flood' => $baseDir . '/app/SupportedApps/Flood/Flood.php', + 'App\\SupportedApps\\Focalboard\\Focalboard' => $baseDir . '/app/SupportedApps/Focalboard/Focalboard.php', + 'App\\SupportedApps\\FoldingHome\\FoldingHome' => $baseDir . '/app/SupportedApps/FoldingHome/FoldingHome.php', + 'App\\SupportedApps\\FortinetFortiMonitor\\FortinetFortiMonitor' => $baseDir . '/app/SupportedApps/FortinetFortiMonitor/FortinetFortiMonitor.php', + 'App\\SupportedApps\\Freenas\\Freenas' => $baseDir . '/app/SupportedApps/Freenas/Freenas.php', + 'App\\SupportedApps\\FreshRSS\\FreshRSS' => $baseDir . '/app/SupportedApps/FreshRSS/FreshRSS.php', + 'App\\SupportedApps\\Fronius\\Fronius' => $baseDir . '/app/SupportedApps/Fronius/Fronius.php', + 'App\\SupportedApps\\Funkwhale\\Funkwhale' => $baseDir . '/app/SupportedApps/Funkwhale/Funkwhale.php', + 'App\\SupportedApps\\Ghost\\Ghost' => $baseDir . '/app/SupportedApps/Ghost/Ghost.php', + 'App\\SupportedApps\\GitHub\\GitHub' => $baseDir . '/app/SupportedApps/GitHub/GitHub.php', + 'App\\SupportedApps\\GitLab\\GitLab' => $baseDir . '/app/SupportedApps/GitLab/GitLab.php', + 'App\\SupportedApps\\Gitea\\Gitea' => $baseDir . '/app/SupportedApps/Gitea/Gitea.php', + 'App\\SupportedApps\\Glances\\Glances' => $baseDir . '/app/SupportedApps/Glances/Glances.php', + 'App\\SupportedApps\\Gogs\\Gogs' => $baseDir . '/app/SupportedApps/Gogs/Gogs.php', + 'App\\SupportedApps\\Gotify\\Gotify' => $baseDir . '/app/SupportedApps/Gotify/Gotify.php', + 'App\\SupportedApps\\Grafana\\Grafana' => $baseDir . '/app/SupportedApps/Grafana/Grafana.php', + 'App\\SupportedApps\\Grav\\Grav' => $baseDir . '/app/SupportedApps/Grav/Grav.php', + 'App\\SupportedApps\\Graylog\\Graylog' => $baseDir . '/app/SupportedApps/Graylog/Graylog.php', + 'App\\SupportedApps\\Grocy\\Grocy' => $baseDir . '/app/SupportedApps/Grocy/Grocy.php', + 'App\\SupportedApps\\Guacamole\\Guacamole' => $baseDir . '/app/SupportedApps/Guacamole/Guacamole.php', + 'App\\SupportedApps\\HAProxy\\HAProxy' => $baseDir . '/app/SupportedApps/HAProxy/HAProxy.php', + 'App\\SupportedApps\\HDHomeRun\\HDHomeRun' => $baseDir . '/app/SupportedApps/HDHomeRun/HDHomeRun.php', + 'App\\SupportedApps\\Handbrake\\Handbrake' => $baseDir . '/app/SupportedApps/Handbrake/Handbrake.php', + 'App\\SupportedApps\\Hasura\\Hasura' => $baseDir . '/app/SupportedApps/Hasura/Hasura.php', + 'App\\SupportedApps\\Headphones\\Headphones' => $baseDir . '/app/SupportedApps/Headphones/Headphones.php', + 'App\\SupportedApps\\Healthchecks\\Healthchecks' => $baseDir . '/app/SupportedApps/Healthchecks/Healthchecks.php', + 'App\\SupportedApps\\HomeAssistant\\HomeAssistant' => $baseDir . '/app/SupportedApps/HomeAssistant/HomeAssistant.php', + 'App\\SupportedApps\\Homebridge\\Homebridge' => $baseDir . '/app/SupportedApps/Homebridge/Homebridge.php', + 'App\\SupportedApps\\Homer\\Homer' => $baseDir . '/app/SupportedApps/Homer/Homer.php', + 'App\\SupportedApps\\Hubitat\\Hubitat' => $baseDir . '/app/SupportedApps/Hubitat/Hubitat.php', + 'App\\SupportedApps\\Huginn\\Huginn' => $baseDir . '/app/SupportedApps/Huginn/Huginn.php', + 'App\\SupportedApps\\Icecast\\Icecast' => $baseDir . '/app/SupportedApps/Icecast/Icecast.php', + 'App\\SupportedApps\\IcingaWeb\\IcingaWeb' => $baseDir . '/app/SupportedApps/IcingaWeb/IcingaWeb.php', + 'App\\SupportedApps\\InfluxDB\\InfluxDB' => $baseDir . '/app/SupportedApps/InfluxDB/InfluxDB.php', + 'App\\SupportedApps\\Infoblox\\Infoblox' => $baseDir . '/app/SupportedApps/Infoblox/Infoblox.php', + 'App\\SupportedApps\\Invidious\\Invidious' => $baseDir . '/app/SupportedApps/Invidious/Invidious.php', + 'App\\SupportedApps\\InvoiceNinja\\InvoiceNinja' => $baseDir . '/app/SupportedApps/InvoiceNinja/InvoiceNinja.php', + 'App\\SupportedApps\\JDownloader\\JDownloader' => $baseDir . '/app/SupportedApps/JDownloader/JDownloader.php', + 'App\\SupportedApps\\Jackett\\Jackett' => $baseDir . '/app/SupportedApps/Jackett/Jackett.php', + 'App\\SupportedApps\\Jaeger\\Jaeger' => $baseDir . '/app/SupportedApps/Jaeger/Jaeger.php', + 'App\\SupportedApps\\Jeedom\\Jeedom' => $baseDir . '/app/SupportedApps/Jeedom/Jeedom.php', + 'App\\SupportedApps\\Jellyfin\\Jellyfin' => $baseDir . '/app/SupportedApps/Jellyfin/Jellyfin.php', + 'App\\SupportedApps\\Jenkins\\Jenkins' => $baseDir . '/app/SupportedApps/Jenkins/Jenkins.php', + 'App\\SupportedApps\\Jira\\Jira' => $baseDir . '/app/SupportedApps/Jira/Jira.php', + 'App\\SupportedApps\\Jitsi\\Jitsi' => $baseDir . '/app/SupportedApps/Jitsi/Jitsi.php', + 'App\\SupportedApps\\Joomla\\Joomla' => $baseDir . '/app/SupportedApps/Joomla/Joomla.php', + 'App\\SupportedApps\\Jupyter\\Jupyter' => $baseDir . '/app/SupportedApps/Jupyter/Jupyter.php', + 'App\\SupportedApps\\Kanboard\\Kanboard' => $baseDir . '/app/SupportedApps/Kanboard/Kanboard.php', + 'App\\SupportedApps\\Keycloak\\Keycloak' => $baseDir . '/app/SupportedApps/Keycloak/Keycloak.php', + 'App\\SupportedApps\\Kibana\\Kibana' => $baseDir . '/app/SupportedApps/Kibana/Kibana.php', + 'App\\SupportedApps\\Kimai\\Kimai' => $baseDir . '/app/SupportedApps/Kimai/Kimai.php', + 'App\\SupportedApps\\Kitana\\Kitana' => $baseDir . '/app/SupportedApps/Kitana/Kitana.php', + 'App\\SupportedApps\\Kodi\\Kodi' => $baseDir . '/app/SupportedApps/Kodi/Kodi.php', + 'App\\SupportedApps\\Komga\\Komga' => $baseDir . '/app/SupportedApps/Komga/Komga.php', + 'App\\SupportedApps\\Kopia\\Kopia' => $baseDir . '/app/SupportedApps/Kopia/Kopia.php', + 'App\\SupportedApps\\Krusader\\Krusader' => $baseDir . '/app/SupportedApps/Krusader/Krusader.php', + 'App\\SupportedApps\\KubernetesDashboard\\KubernetesDashboard' => $baseDir . '/app/SupportedApps/KubernetesDashboard/KubernetesDashboard.php', + 'App\\SupportedApps\\LazyLibrarian\\LazyLibrarian' => $baseDir . '/app/SupportedApps/LazyLibrarian/LazyLibrarian.php', + 'App\\SupportedApps\\LemonLDAPNG\\LemonLDAPNG' => $baseDir . '/app/SupportedApps/LemonLDAPNG/LemonLDAPNG.php', + 'App\\SupportedApps\\LibreNMS\\LibreNMS' => $baseDir . '/app/SupportedApps/LibreNMS/LibreNMS.php', + 'App\\SupportedApps\\LibreSpeed\\LibreSpeed' => $baseDir . '/app/SupportedApps/LibreSpeed/LibreSpeed.php', + 'App\\SupportedApps\\Lidarr\\Lidarr' => $baseDir . '/app/SupportedApps/Lidarr/Lidarr.php', + 'App\\SupportedApps\\LinkAce\\LinkAce' => $baseDir . '/app/SupportedApps/LinkAce/LinkAce.php', + 'App\\SupportedApps\\Lychee\\Lychee' => $baseDir . '/app/SupportedApps/Lychee/Lychee.php', + 'App\\SupportedApps\\MailcowSOGo\\MailcowSOGo' => $baseDir . '/app/SupportedApps/MailcowSOGo/MailcowSOGo.php', + 'App\\SupportedApps\\Mailcow\\Mailcow' => $baseDir . '/app/SupportedApps/Mailcow/Mailcow.php', + 'App\\SupportedApps\\Mailhog\\Mailhog' => $baseDir . '/app/SupportedApps/Mailhog/Mailhog.php', + 'App\\SupportedApps\\Mainsail\\Mainsail' => $baseDir . '/app/SupportedApps/Mainsail/Mainsail.php', + 'App\\SupportedApps\\Mastodon\\Mastodon' => $baseDir . '/app/SupportedApps/Mastodon/Mastodon.php', + 'App\\SupportedApps\\Mattermost\\Mattermost' => $baseDir . '/app/SupportedApps/Mattermost/Mattermost.php', + 'App\\SupportedApps\\MayanEDMS\\MayanEDMS' => $baseDir . '/app/SupportedApps/MayanEDMS/MayanEDMS.php', + 'App\\SupportedApps\\McMyAdmin\\McMyAdmin' => $baseDir . '/app/SupportedApps/McMyAdmin/McMyAdmin.php', + 'App\\SupportedApps\\Mealie\\Mealie' => $baseDir . '/app/SupportedApps/Mealie/Mealie.php', + 'App\\SupportedApps\\MediaWiki\\MediaWiki' => $baseDir . '/app/SupportedApps/MediaWiki/MediaWiki.php', + 'App\\SupportedApps\\Medusa\\Medusa' => $baseDir . '/app/SupportedApps/Medusa/Medusa.php', + 'App\\SupportedApps\\Meraki\\Meraki' => $baseDir . '/app/SupportedApps/Meraki/Meraki.php', + 'App\\SupportedApps\\MineOS\\MineOS' => $baseDir . '/app/SupportedApps/MineOS/MineOS.php', + 'App\\SupportedApps\\Miniflux\\Miniflux' => $baseDir . '/app/SupportedApps/Miniflux/Miniflux.php', + 'App\\SupportedApps\\Minio\\Minio' => $baseDir . '/app/SupportedApps/Minio/Minio.php', + 'App\\SupportedApps\\Monica\\Monica' => $baseDir . '/app/SupportedApps/Monica/Monica.php', + 'App\\SupportedApps\\Monit\\Monit' => $baseDir . '/app/SupportedApps/Monit/Monit.php', + 'App\\SupportedApps\\MotionEye\\MotionEye' => $baseDir . '/app/SupportedApps/MotionEye/MotionEye.php', + 'App\\SupportedApps\\MusicBrainz\\MusicBrainz' => $baseDir . '/app/SupportedApps/MusicBrainz/MusicBrainz.php', + 'App\\SupportedApps\\Mylar\\Mylar' => $baseDir . '/app/SupportedApps/Mylar/Mylar.php', + 'App\\SupportedApps\\NZBHydra\\NZBHydra' => $baseDir . '/app/SupportedApps/NZBHydra/NZBHydra.php', + 'App\\SupportedApps\\Navidrome\\Navidrome' => $baseDir . '/app/SupportedApps/Navidrome/Navidrome.php', + 'App\\SupportedApps\\Nessus\\Nessus' => $baseDir . '/app/SupportedApps/Nessus/Nessus.php', + 'App\\SupportedApps\\NetBox\\NetBox' => $baseDir . '/app/SupportedApps/NetBox/NetBox.php', + 'App\\SupportedApps\\Netatmo\\Netatmo' => $baseDir . '/app/SupportedApps/Netatmo/Netatmo.php', + 'App\\SupportedApps\\Netboot\\Netboot' => $baseDir . '/app/SupportedApps/Netboot/Netboot.php', + 'App\\SupportedApps\\Netdata\\Netdata' => $baseDir . '/app/SupportedApps/Netdata/Netdata.php', + 'App\\SupportedApps\\Nextcloud\\Nextcloud' => $baseDir . '/app/SupportedApps/Nextcloud/Nextcloud.php', + 'App\\SupportedApps\\NginxProxyManager\\NginxProxyManager' => $baseDir . '/app/SupportedApps/NginxProxyManager/NginxProxyManager.php', + 'App\\SupportedApps\\Nitter\\Nitter' => $baseDir . '/app/SupportedApps/Nitter/Nitter.php', + 'App\\SupportedApps\\NodeRed\\NodeRed' => $baseDir . '/app/SupportedApps/NodeRed/NodeRed.php', + 'App\\SupportedApps\\NowShowing\\NowShowing' => $baseDir . '/app/SupportedApps/NowShowing/NowShowing.php', + 'App\\SupportedApps\\NxFilter\\NxFilter' => $baseDir . '/app/SupportedApps/NxFilter/NxFilter.php', + 'App\\SupportedApps\\Nzbget\\Nzbget' => $baseDir . '/app/SupportedApps/Nzbget/Nzbget.php', + 'App\\SupportedApps\\OPNsense\\OPNsense' => $baseDir . '/app/SupportedApps/OPNsense/OPNsense.php', + 'App\\SupportedApps\\Octoprint\\Octoprint' => $baseDir . '/app/SupportedApps/Octoprint/Octoprint.php', + 'App\\SupportedApps\\Ombi\\Ombi' => $baseDir . '/app/SupportedApps/Ombi/Ombi.php', + 'App\\SupportedApps\\OmniDB\\OmniDB' => $baseDir . '/app/SupportedApps/OmniDB/OmniDB.php', + 'App\\SupportedApps\\OnlyOffice\\OnlyOffice' => $baseDir . '/app/SupportedApps/OnlyOffice/OnlyOffice.php', + 'App\\SupportedApps\\OpenMapTiler\\OpenMapTiler' => $baseDir . '/app/SupportedApps/OpenMapTiler/OpenMapTiler.php', + 'App\\SupportedApps\\OpenSpeedTest\\OpenSpeedTest' => $baseDir . '/app/SupportedApps/OpenSpeedTest/OpenSpeedTest.php', + 'App\\SupportedApps\\OpenSprinkler\\OpenSprinkler' => $baseDir . '/app/SupportedApps/OpenSprinkler/OpenSprinkler.php', + 'App\\SupportedApps\\OpenWrt\\OpenWrt' => $baseDir . '/app/SupportedApps/OpenWrt/OpenWrt.php', + 'App\\SupportedApps\\Oscarr\\Oscarr' => $baseDir . '/app/SupportedApps/Oscarr/Oscarr.php', + 'App\\SupportedApps\\Overseerr\\Overseerr' => $baseDir . '/app/SupportedApps/Overseerr/Overseerr.php', + 'App\\SupportedApps\\OwnPhotos\\OwnPhotos' => $baseDir . '/app/SupportedApps/OwnPhotos/OwnPhotos.php', + 'App\\SupportedApps\\PRTG\\PRTG' => $baseDir . '/app/SupportedApps/PRTG/PRTG.php', + 'App\\SupportedApps\\PaloAltoNetworks\\PaloAltoNetworks' => $baseDir . '/app/SupportedApps/PaloAltoNetworks/PaloAltoNetworks.php', + 'App\\SupportedApps\\Paperless\\Paperless' => $baseDir . '/app/SupportedApps/Paperless/Paperless.php', + 'App\\SupportedApps\\PartKeepr\\PartKeepr' => $baseDir . '/app/SupportedApps/PartKeepr/PartKeepr.php', + 'App\\SupportedApps\\PeerTube\\PeerTube' => $baseDir . '/app/SupportedApps/PeerTube/PeerTube.php', + 'App\\SupportedApps\\PhotoPrism\\PhotoPrism' => $baseDir . '/app/SupportedApps/PhotoPrism/PhotoPrism.php', + 'App\\SupportedApps\\Photonix\\Photonix' => $baseDir . '/app/SupportedApps/Photonix/Photonix.php', + 'App\\SupportedApps\\PiAware\\PiAware' => $baseDir . '/app/SupportedApps/PiAware/PiAware.php', + 'App\\SupportedApps\\PiVPN\\PiVPN' => $baseDir . '/app/SupportedApps/PiVPN/PiVPN.php', + 'App\\SupportedApps\\Pihole\\Pihole' => $baseDir . '/app/SupportedApps/Pihole/Pihole.php', + 'App\\SupportedApps\\Piwigo\\Piwigo' => $baseDir . '/app/SupportedApps/Piwigo/Piwigo.php', + 'App\\SupportedApps\\Pleroma\\Pleroma' => $baseDir . '/app/SupportedApps/Pleroma/Pleroma.php', + 'App\\SupportedApps\\Plesk\\Plesk' => $baseDir . '/app/SupportedApps/Plesk/Plesk.php', + 'App\\SupportedApps\\PlexRequests\\PlexRequests' => $baseDir . '/app/SupportedApps/PlexRequests/PlexRequests.php', + 'App\\SupportedApps\\Plex\\Plex' => $baseDir . '/app/SupportedApps/Plex/Plex.php', + 'App\\SupportedApps\\Plume\\Plume' => $baseDir . '/app/SupportedApps/Plume/Plume.php', + 'App\\SupportedApps\\Portainer\\Portainer' => $baseDir . '/app/SupportedApps/Portainer/Portainer.php', + 'App\\SupportedApps\\Poste\\Poste' => $baseDir . '/app/SupportedApps/Poste/Poste.php', + 'App\\SupportedApps\\Printer\\Printer' => $baseDir . '/app/SupportedApps/Printer/Printer.php', + 'App\\SupportedApps\\Privatebin\\Privatebin' => $baseDir . '/app/SupportedApps/Privatebin/Privatebin.php', + 'App\\SupportedApps\\ProjectSend\\ProjectSend' => $baseDir . '/app/SupportedApps/ProjectSend/ProjectSend.php', + 'App\\SupportedApps\\Prometheus\\Prometheus' => $baseDir . '/app/SupportedApps/Prometheus/Prometheus.php', + 'App\\SupportedApps\\Prowlarr\\Prowlarr' => $baseDir . '/app/SupportedApps/Prowlarr/Prowlarr.php', + 'App\\SupportedApps\\Proxmox\\Proxmox' => $baseDir . '/app/SupportedApps/Proxmox/Proxmox.php', + 'App\\SupportedApps\\PsiTransfer\\PsiTransfer' => $baseDir . '/app/SupportedApps/PsiTransfer/PsiTransfer.php', + 'App\\SupportedApps\\Pterodactyl\\Pterodactyl' => $baseDir . '/app/SupportedApps/Pterodactyl/Pterodactyl.php', + 'App\\SupportedApps\\QNAP\\QNAP' => $baseDir . '/app/SupportedApps/QNAP/QNAP.php', + 'App\\SupportedApps\\RStudioServer\\RStudioServer' => $baseDir . '/app/SupportedApps/RStudioServer/RStudioServer.php', + 'App\\SupportedApps\\Radarr\\Radarr' => $baseDir . '/app/SupportedApps/Radarr/Radarr.php', + 'App\\SupportedApps\\Rainloop\\Rainloop' => $baseDir . '/app/SupportedApps/Rainloop/Rainloop.php', + 'App\\SupportedApps\\Rancher\\Rancher' => $baseDir . '/app/SupportedApps/Rancher/Rancher.php', + 'App\\SupportedApps\\Raneto\\Raneto' => $baseDir . '/app/SupportedApps/Raneto/Raneto.php', + 'App\\SupportedApps\\Rclone\\Rclone' => $baseDir . '/app/SupportedApps/Rclone/Rclone.php', + 'App\\SupportedApps\\Readarr\\Readarr' => $baseDir . '/app/SupportedApps/Readarr/Readarr.php', + 'App\\SupportedApps\\Recalbox\\Recalbox' => $baseDir . '/app/SupportedApps/Recalbox/Recalbox.php', + 'App\\SupportedApps\\Requestrr\\Requestrr' => $baseDir . '/app/SupportedApps/Requestrr/Requestrr.php', + 'App\\SupportedApps\\ResilioSync\\ResilioSync' => $baseDir . '/app/SupportedApps/ResilioSync/ResilioSync.php', + 'App\\SupportedApps\\RiotWeb\\RiotWeb' => $baseDir . '/app/SupportedApps/RiotWeb/RiotWeb.php', + 'App\\SupportedApps\\RocketChat\\RocketChat' => $baseDir . '/app/SupportedApps/RocketChat/RocketChat.php', + 'App\\SupportedApps\\RompЯ\\RompЯ' => $baseDir . '/app/SupportedApps/RompЯ/RompЯ.php', + 'App\\SupportedApps\\Roundcube\\Roundcube' => $baseDir . '/app/SupportedApps/Roundcube/Roundcube.php', + 'App\\SupportedApps\\Router\\Router' => $baseDir . '/app/SupportedApps/Router/Router.php', + 'App\\SupportedApps\\Rspamd\\Rspamd' => $baseDir . '/app/SupportedApps/Rspamd/Rspamd.php', + 'App\\SupportedApps\\Rundeck\\Rundeck' => $baseDir . '/app/SupportedApps/Rundeck/Rundeck.php', + 'App\\SupportedApps\\RuneAudio\\RuneAudio' => $baseDir . '/app/SupportedApps/RuneAudio/RuneAudio.php', + 'App\\SupportedApps\\SABnzbd\\SABnzbd' => $baseDir . '/app/SupportedApps/SABnzbd/SABnzbd.php', + 'App\\SupportedApps\\SOGo\\SOGo' => $baseDir . '/app/SupportedApps/SOGo/SOGo.php', + 'App\\SupportedApps\\Seafile\\Seafile' => $baseDir . '/app/SupportedApps/Seafile/Seafile.php', + 'App\\SupportedApps\\SearxMetasearchEngine\\SearxMetasearchEngine' => $baseDir . '/app/SupportedApps/SearxMetasearchEngine/SearxMetasearchEngine.php', + 'App\\SupportedApps\\Serviio\\Serviio' => $baseDir . '/app/SupportedApps/Serviio/Serviio.php', + 'App\\SupportedApps\\Shaarli\\Shaarli' => $baseDir . '/app/SupportedApps/Shaarli/Shaarli.php', + 'App\\SupportedApps\\Shinobi\\Shinobi' => $baseDir . '/app/SupportedApps/Shinobi/Shinobi.php', + 'App\\SupportedApps\\SickBeard\\SickBeard' => $baseDir . '/app/SupportedApps/SickBeard/SickBeard.php', + 'App\\SupportedApps\\SickGear\\SickGear' => $baseDir . '/app/SupportedApps/SickGear/SickGear.php', + 'App\\SupportedApps\\Sickchill\\Sickchill' => $baseDir . '/app/SupportedApps/Sickchill/Sickchill.php', + 'App\\SupportedApps\\Slack\\Slack' => $baseDir . '/app/SupportedApps/Slack/Slack.php', + 'App\\SupportedApps\\Snibox\\Snibox' => $baseDir . '/app/SupportedApps/Snibox/Snibox.php', + 'App\\SupportedApps\\SonarQube\\SonarQube' => $baseDir . '/app/SupportedApps/SonarQube/SonarQube.php', + 'App\\SupportedApps\\Sonarr\\Sonarr' => $baseDir . '/app/SupportedApps/Sonarr/Sonarr.php', + 'App\\SupportedApps\\Sourcegraph\\Sourcegraph' => $baseDir . '/app/SupportedApps/Sourcegraph/Sourcegraph.php', + 'App\\SupportedApps\\Splunk\\Splunk' => $baseDir . '/app/SupportedApps/Splunk/Splunk.php', + 'App\\SupportedApps\\Spotweb\\Spotweb' => $baseDir . '/app/SupportedApps/Spotweb/Spotweb.php', + 'App\\SupportedApps\\Squidex\\Squidex' => $baseDir . '/app/SupportedApps/Squidex/Squidex.php', + 'App\\SupportedApps\\Stash\\Stash' => $baseDir . '/app/SupportedApps/Stash/Stash.php', + 'App\\SupportedApps\\Statping\\Statping' => $baseDir . '/app/SupportedApps/Statping/Statping.php', + 'App\\SupportedApps\\Strapi\\Strapi' => $baseDir . '/app/SupportedApps/Strapi/Strapi.php', + 'App\\SupportedApps\\Streama\\Streama' => $baseDir . '/app/SupportedApps/Streama/Streama.php', + 'App\\SupportedApps\\Sympa\\Sympa' => $baseDir . '/app/SupportedApps/Sympa/Sympa.php', + 'App\\SupportedApps\\Synclounge\\Synclounge' => $baseDir . '/app/SupportedApps/Synclounge/Synclounge.php', + 'App\\SupportedApps\\Syncthing\\Syncthing' => $baseDir . '/app/SupportedApps/Syncthing/Syncthing.php', + 'App\\SupportedApps\\Synology\\Synology' => $baseDir . '/app/SupportedApps/Synology/Synology.php', + 'App\\SupportedApps\\TVHeadend\\TVHeadend' => $baseDir . '/app/SupportedApps/TVHeadend/TVHeadend.php', + 'App\\SupportedApps\\TYPO\\TYPO' => $baseDir . '/app/SupportedApps/TYPO/TYPO.php', + 'App\\SupportedApps\\Taiga\\Taiga' => $baseDir . '/app/SupportedApps/Taiga/Taiga.php', + 'App\\SupportedApps\\TandoorRecipes\\TandoorRecipes' => $baseDir . '/app/SupportedApps/TandoorRecipes/TandoorRecipes.php', + 'App\\SupportedApps\\TarTenNinety\\TarTenNinety' => $baseDir . '/app/SupportedApps/TarTenNinety/TarTenNinety.php', + 'App\\SupportedApps\\TasmoAdmin\\TasmoAdmin' => $baseDir . '/app/SupportedApps/TasmoAdmin/TasmoAdmin.php', + 'App\\SupportedApps\\Tasmota\\Tasmota' => $baseDir . '/app/SupportedApps/Tasmota/Tasmota.php', + 'App\\SupportedApps\\Tautulli\\Tautulli' => $baseDir . '/app/SupportedApps/Tautulli/Tautulli.php', + 'App\\SupportedApps\\Tdarr\\Tdarr' => $baseDir . '/app/SupportedApps/Tdarr/Tdarr.php', + 'App\\SupportedApps\\Teedy\\Teedy' => $baseDir . '/app/SupportedApps/Teedy/Teedy.php', + 'App\\SupportedApps\\TheLounge\\TheLounge' => $baseDir . '/app/SupportedApps/TheLounge/TheLounge.php', + 'App\\SupportedApps\\TinyTinyRSS\\TinyTinyRSS' => $baseDir . '/app/SupportedApps/TinyTinyRSS/TinyTinyRSS.php', + 'App\\SupportedApps\\Traccar\\Traccar' => $baseDir . '/app/SupportedApps/Traccar/Traccar.php', + 'App\\SupportedApps\\Traefik\\Traefik' => $baseDir . '/app/SupportedApps/Traefik/Traefik.php', + 'App\\SupportedApps\\Transmission\\Transmission' => $baseDir . '/app/SupportedApps/Transmission/Transmission.php', + 'App\\SupportedApps\\Trilium\\Trilium' => $baseDir . '/app/SupportedApps/Trilium/Trilium.php', + 'App\\SupportedApps\\TrueNASCORE\\TrueNASCORE' => $baseDir . '/app/SupportedApps/TrueNASCORE/TrueNASCORE.php', + 'App\\SupportedApps\\TrueNAS\\TrueNAS' => $baseDir . '/app/SupportedApps/TrueNAS/TrueNAS.php', + 'App\\SupportedApps\\Ubooquity\\Ubooquity' => $baseDir . '/app/SupportedApps/Ubooquity/Ubooquity.php', + 'App\\SupportedApps\\UniFi\\UniFi' => $baseDir . '/app/SupportedApps/UniFi/UniFi.php', + 'App\\SupportedApps\\Unraid\\Unraid' => $baseDir . '/app/SupportedApps/Unraid/Unraid.php', + 'App\\SupportedApps\\UrBackup\\UrBackup' => $baseDir . '/app/SupportedApps/UrBackup/UrBackup.php', + 'App\\SupportedApps\\VMwareESXi\\VMwareESXi' => $baseDir . '/app/SupportedApps/VMwareESXi/VMwareESXi.php', + 'App\\SupportedApps\\VMwarevCenter\\VMwarevCenter' => $baseDir . '/app/SupportedApps/VMwarevCenter/VMwarevCenter.php', + 'App\\SupportedApps\\ViMbAdmin\\ViMbAdmin' => $baseDir . '/app/SupportedApps/ViMbAdmin/ViMbAdmin.php', + 'App\\SupportedApps\\VirtualRadarServer\\VirtualRadarServer' => $baseDir . '/app/SupportedApps/VirtualRadarServer/VirtualRadarServer.php', + 'App\\SupportedApps\\Virtualmin\\Virtualmin' => $baseDir . '/app/SupportedApps/Virtualmin/Virtualmin.php', + 'App\\SupportedApps\\Volumio\\Volumio' => $baseDir . '/app/SupportedApps/Volumio/Volumio.php', + 'App\\SupportedApps\\VuPlus\\VuPlus' => $baseDir . '/app/SupportedApps/VuPlus/VuPlus.php', + 'App\\SupportedApps\\Wallabag\\Wallabag' => $baseDir . '/app/SupportedApps/Wallabag/Wallabag.php', + 'App\\SupportedApps\\WaniKani\\WaniKani' => $baseDir . '/app/SupportedApps/WaniKani/WaniKani.php', + 'App\\SupportedApps\\Watcher\\Watcher' => $baseDir . '/app/SupportedApps/Watcher/Watcher.php', + 'App\\SupportedApps\\WebTools\\WebTools' => $baseDir . '/app/SupportedApps/WebTools/WebTools.php', + 'App\\SupportedApps\\Webmin\\Webmin' => $baseDir . '/app/SupportedApps/Webmin/Webmin.php', + 'App\\SupportedApps\\Wekan\\Wekan' => $baseDir . '/app/SupportedApps/Wekan/Wekan.php', + 'App\\SupportedApps\\Wetty\\Wetty' => $baseDir . '/app/SupportedApps/Wetty/Wetty.php', + 'App\\SupportedApps\\WgGenWeb\\WgGenWeb' => $baseDir . '/app/SupportedApps/WgGenWeb/WgGenWeb.php', + 'App\\SupportedApps\\Wikijs\\Wikijs' => $baseDir . '/app/SupportedApps/Wikijs/Wikijs.php', + 'App\\SupportedApps\\WireGuard\\WireGuard' => $baseDir . '/app/SupportedApps/WireGuard/WireGuard.php', + 'App\\SupportedApps\\Wordpress\\Wordpress' => $baseDir . '/app/SupportedApps/Wordpress/Wordpress.php', + 'App\\SupportedApps\\XWiki\\XWiki' => $baseDir . '/app/SupportedApps/XWiki/XWiki.php', + 'App\\SupportedApps\\XenOrchestra\\XenOrchestra' => $baseDir . '/app/SupportedApps/XenOrchestra/XenOrchestra.php', + 'App\\SupportedApps\\Xigmanas\\Xigmanas' => $baseDir . '/app/SupportedApps/Xigmanas/Xigmanas.php', + 'App\\SupportedApps\\YNAB\\YNAB' => $baseDir . '/app/SupportedApps/YNAB/YNAB.php', + 'App\\SupportedApps\\ZNC\\ZNC' => $baseDir . '/app/SupportedApps/ZNC/ZNC.php', + 'App\\SupportedApps\\Zabbix\\Zabbix' => $baseDir . '/app/SupportedApps/Zabbix/Zabbix.php', + 'App\\SupportedApps\\Zammad\\Zammad' => $baseDir . '/app/SupportedApps/Zammad/Zammad.php', + 'App\\SupportedApps\\ZoneMinder\\ZoneMinder' => $baseDir . '/app/SupportedApps/ZoneMinder/ZoneMinder.php', + 'App\\SupportedApps\\Zulip\\Zulip' => $baseDir . '/app/SupportedApps/Zulip/Zulip.php', + 'App\\SupportedApps\\cPanel\\cPanel' => $baseDir . '/app/SupportedApps/cPanel/cPanel.php', + 'App\\SupportedApps\\iDRAC\\iDRAC' => $baseDir . '/app/SupportedApps/iDRAC/iDRAC.php', + 'App\\SupportedApps\\iLO\\iLO' => $baseDir . '/app/SupportedApps/iLO/iLO.php', + 'App\\SupportedApps\\ioBroker\\ioBroker' => $baseDir . '/app/SupportedApps/ioBroker/ioBroker.php', + 'App\\SupportedApps\\neightn\\neightn' => $baseDir . '/app/SupportedApps/neightn/neightn.php', + 'App\\SupportedApps\\openHAB\\openHAB' => $baseDir . '/app/SupportedApps/openHAB/openHAB.php', + 'App\\SupportedApps\\openmediavault\\openmediavault' => $baseDir . '/app/SupportedApps/openmediavault/openmediavault.php', + 'App\\SupportedApps\\osTicket\\osTicket' => $baseDir . '/app/SupportedApps/osTicket/osTicket.php', + 'App\\SupportedApps\\ownCloud\\ownCloud' => $baseDir . '/app/SupportedApps/ownCloud/ownCloud.php', + 'App\\SupportedApps\\pfSense\\pfSense' => $baseDir . '/app/SupportedApps/pfSense/pfSense.php', + 'App\\SupportedApps\\pgAdmin\\pgAdmin' => $baseDir . '/app/SupportedApps/pgAdmin/pgAdmin.php', + 'App\\SupportedApps\\phpIPAM\\phpIPAM' => $baseDir . '/app/SupportedApps/phpIPAM/phpIPAM.php', + 'App\\SupportedApps\\phpLDAPadmin\\phpLDAPadmin' => $baseDir . '/app/SupportedApps/phpLDAPadmin/phpLDAPadmin.php', + 'App\\SupportedApps\\phpMyAdmin\\phpMyAdmin' => $baseDir . '/app/SupportedApps/phpMyAdmin/phpMyAdmin.php', + 'App\\SupportedApps\\pyLoad\\pyLoad' => $baseDir . '/app/SupportedApps/pyLoad/pyLoad.php', + 'App\\SupportedApps\\qBittorrent\\qBittorrent' => $baseDir . '/app/SupportedApps/qBittorrent/qBittorrent.php', + 'App\\SupportedApps\\ruTorrent\\ruTorrent' => $baseDir . '/app/SupportedApps/ruTorrent/ruTorrent.php', + 'App\\SupportedApps\\vmwarehorizon\\vmwarehorizon' => $baseDir . '/app/SupportedApps/vmwarehorizon/vmwarehorizon.php', + 'App\\SupportedApps\\xTeVe\\xTeVe' => $baseDir . '/app/SupportedApps/xTeVe/xTeVe.php', + 'App\\SupportedApps\\youtubedl\\youtubedl' => $baseDir . '/app/SupportedApps/youtubedl/youtubedl.php', 'App\\User' => $baseDir . '/app/User.php', 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Brick\\Math\\BigDecimal' => $vendorDir . '/brick/math/src/BigDecimal.php', @@ -4618,6 +4927,18 @@ return array( 'Symfony\\Component\\VarExporter\\Internal\\Registry' => $vendorDir . '/symfony/var-exporter/Internal/Registry.php', 'Symfony\\Component\\VarExporter\\Internal\\Values' => $vendorDir . '/symfony/var-exporter/Internal/Values.php', 'Symfony\\Component\\VarExporter\\VarExporter' => $vendorDir . '/symfony/var-exporter/VarExporter.php', + 'Symfony\\Component\\Yaml\\Command\\LintCommand' => $vendorDir . '/symfony/yaml/Command/LintCommand.php', + 'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Dumper.php', + 'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Escaper.php', + 'Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Exception/DumpException.php', + 'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Exception/ParseException.php', + 'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Exception/RuntimeException.php', + 'Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Inline.php', + 'Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Parser.php', + 'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => $vendorDir . '/symfony/yaml/Tag/TaggedValue.php', + 'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Unescaper.php', + 'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Yaml.php', 'Symfony\\Contracts\\Cache\\CacheInterface' => $vendorDir . '/symfony/cache-contracts/CacheInterface.php', 'Symfony\\Contracts\\Cache\\CacheTrait' => $vendorDir . '/symfony/cache-contracts/CacheTrait.php', 'Symfony\\Contracts\\Cache\\CallbackInterface' => $vendorDir . '/symfony/cache-contracts/CallbackInterface.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 00b4b5fb..7ff7522c 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -6,8 +6,8 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( - 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', + 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 0e0a7d32..2b84fcc1 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -27,6 +27,7 @@ return array( 'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'), 'Symfony\\Contracts\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher-contracts'), 'Symfony\\Contracts\\Cache\\' => array($vendorDir . '/symfony/cache-contracts'), + 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), 'Symfony\\Component\\VarExporter\\' => array($vendorDir . '/symfony/var-exporter'), 'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'), 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'), diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 8309daae..03275c82 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -65,16 +65,11 @@ class ComposerAutoloaderInit4b6fb9210a1ea37c2db27b8ff53a1ecf } } -/** - * @param string $fileIdentifier - * @param string $file - * @return void - */ function composerRequire4b6fb9210a1ea37c2db27b8ff53a1ecf($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { - $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; - require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; } } diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index a76c6f54..249a8530 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -7,8 +7,8 @@ namespace Composer\Autoload; class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf { public static $files = array ( - 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', + 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', @@ -73,6 +73,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Symfony\\Contracts\\Service\\' => 26, 'Symfony\\Contracts\\EventDispatcher\\' => 34, 'Symfony\\Contracts\\Cache\\' => 24, + 'Symfony\\Component\\Yaml\\' => 23, 'Symfony\\Component\\VarExporter\\' => 30, 'Symfony\\Component\\VarDumper\\' => 28, 'Symfony\\Component\\Translation\\' => 30, @@ -271,6 +272,10 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf array ( 0 => __DIR__ . '/..' . '/symfony/cache-contracts', ), + 'Symfony\\Component\\Yaml\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/yaml', + ), 'Symfony\\Component\\VarExporter\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-exporter', @@ -587,6 +592,315 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'App\\SettingGroup' => __DIR__ . '/../..' . '/app/SettingGroup.php', 'App\\SettingUser' => __DIR__ . '/../..' . '/app/SettingUser.php', 'App\\SupportedApps' => __DIR__ . '/../..' . '/app/SupportedApps.php', + 'App\\SupportedApps\\AMP\\AMP' => __DIR__ . '/../..' . '/app/SupportedApps/AMP/AMP.php', + 'App\\SupportedApps\\AVMFritzbox\\AVMFritzbox' => __DIR__ . '/../..' . '/app/SupportedApps/AVMFritzbox/AVMFritzbox.php', + 'App\\SupportedApps\\AWX\\AWX' => __DIR__ . '/../..' . '/app/SupportedApps/AWX/AWX.php', + 'App\\SupportedApps\\AdGuardHome\\AdGuardHome' => __DIR__ . '/../..' . '/app/SupportedApps/AdGuardHome/AdGuardHome.php', + 'App\\SupportedApps\\Adminer\\Adminer' => __DIR__ . '/../..' . '/app/SupportedApps/Adminer/Adminer.php', + 'App\\SupportedApps\\Airsonic\\Airsonic' => __DIR__ . '/../..' . '/app/SupportedApps/Airsonic/Airsonic.php', + 'App\\SupportedApps\\AlarmPI\\AlarmPI' => __DIR__ . '/../..' . '/app/SupportedApps/AlarmPI/AlarmPI.php', + 'App\\SupportedApps\\Alertmanager\\Alertmanager' => __DIR__ . '/../..' . '/app/SupportedApps/Alertmanager/Alertmanager.php', + 'App\\SupportedApps\\ArchiSteamFarm\\ArchiSteamFarm' => __DIR__ . '/../..' . '/app/SupportedApps/ArchiSteamFarm/ArchiSteamFarm.php', + 'App\\SupportedApps\\ArchiveBox\\ArchiveBox' => __DIR__ . '/../..' . '/app/SupportedApps/ArchiveBox/ArchiveBox.php', + 'App\\SupportedApps\\ArchiveTeamWarrior\\ArchiveTeamWarrior' => __DIR__ . '/../..' . '/app/SupportedApps/ArchiveTeamWarrior/ArchiveTeamWarrior.php', + 'App\\SupportedApps\\AriaNg\\AriaNg' => __DIR__ . '/../..' . '/app/SupportedApps/AriaNg/AriaNg.php', + 'App\\SupportedApps\\Artifactory\\Artifactory' => __DIR__ . '/../..' . '/app/SupportedApps/Artifactory/Artifactory.php', + 'App\\SupportedApps\\AsrockRackIPMI\\AsrockRackIPMI' => __DIR__ . '/../..' . '/app/SupportedApps/AsrockRackIPMI/AsrockRackIPMI.php', + 'App\\SupportedApps\\Bacula\\Bacula' => __DIR__ . '/../..' . '/app/SupportedApps/Bacula/Bacula.php', + 'App\\SupportedApps\\Baikal\\Baikal' => __DIR__ . '/../..' . '/app/SupportedApps/Baikal/Baikal.php', + 'App\\SupportedApps\\Bastillion\\Bastillion' => __DIR__ . '/../..' . '/app/SupportedApps/Bastillion/Bastillion.php', + 'App\\SupportedApps\\Bazarr\\Bazarr' => __DIR__ . '/../..' . '/app/SupportedApps/Bazarr/Bazarr.php', + 'App\\SupportedApps\\Bitwarden\\Bitwarden' => __DIR__ . '/../..' . '/app/SupportedApps/Bitwarden/Bitwarden.php', + 'App\\SupportedApps\\Booksonic\\Booksonic' => __DIR__ . '/../..' . '/app/SupportedApps/Booksonic/Booksonic.php', + 'App\\SupportedApps\\Bookstack\\Bookstack' => __DIR__ . '/../..' . '/app/SupportedApps/Bookstack/Bookstack.php', + 'App\\SupportedApps\\Box\\Box' => __DIR__ . '/../..' . '/app/SupportedApps/Box/Box.php', + 'App\\SupportedApps\\Cabot\\Cabot' => __DIR__ . '/../..' . '/app/SupportedApps/Cabot/Cabot.php', + 'App\\SupportedApps\\CalibreWeb\\CalibreWeb' => __DIR__ . '/../..' . '/app/SupportedApps/CalibreWeb/CalibreWeb.php', + 'App\\SupportedApps\\Cardigann\\Cardigann' => __DIR__ . '/../..' . '/app/SupportedApps/Cardigann/Cardigann.php', + 'App\\SupportedApps\\ChangeDetectionio\\ChangeDetectionio' => __DIR__ . '/../..' . '/app/SupportedApps/ChangeDetectionio/ChangeDetectionio.php', + 'App\\SupportedApps\\CheckMK\\CheckMK' => __DIR__ . '/../..' . '/app/SupportedApps/CheckMK/CheckMK.php', + 'App\\SupportedApps\\Chevereto\\Chevereto' => __DIR__ . '/../..' . '/app/SupportedApps/Chevereto/Chevereto.php', + 'App\\SupportedApps\\Chronograf\\Chronograf' => __DIR__ . '/../..' . '/app/SupportedApps/Chronograf/Chronograf.php', + 'App\\SupportedApps\\Clarkson\\Clarkson' => __DIR__ . '/../..' . '/app/SupportedApps/Clarkson/Clarkson.php', + 'App\\SupportedApps\\CloudCMD\\CloudCMD' => __DIR__ . '/../..' . '/app/SupportedApps/CloudCMD/CloudCMD.php', + 'App\\SupportedApps\\CockpitCMS\\CockpitCMS' => __DIR__ . '/../..' . '/app/SupportedApps/CockpitCMS/CockpitCMS.php', + 'App\\SupportedApps\\Cockpit\\Cockpit' => __DIR__ . '/../..' . '/app/SupportedApps/Cockpit/Cockpit.php', + 'App\\SupportedApps\\Codeserver\\Codeserver' => __DIR__ . '/../..' . '/app/SupportedApps/Codeserver/Codeserver.php', + 'App\\SupportedApps\\CodiMD\\CodiMD' => __DIR__ . '/../..' . '/app/SupportedApps/CodiMD/CodiMD.php', + 'App\\SupportedApps\\Concourse\\Concourse' => __DIR__ . '/../..' . '/app/SupportedApps/Concourse/Concourse.php', + 'App\\SupportedApps\\Confluence\\Confluence' => __DIR__ . '/../..' . '/app/SupportedApps/Confluence/Confluence.php', + 'App\\SupportedApps\\CouchPotato\\CouchPotato' => __DIR__ . '/../..' . '/app/SupportedApps/CouchPotato/CouchPotato.php', + 'App\\SupportedApps\\CryptPad\\CryptPad' => __DIR__ . '/../..' . '/app/SupportedApps/CryptPad/CryptPad.php', + 'App\\SupportedApps\\Deluge\\Deluge' => __DIR__ . '/../..' . '/app/SupportedApps/Deluge/Deluge.php', + 'App\\SupportedApps\\Dillinger\\Dillinger' => __DIR__ . '/../..' . '/app/SupportedApps/Dillinger/Dillinger.php', + 'App\\SupportedApps\\Directus\\Directus' => __DIR__ . '/../..' . '/app/SupportedApps/Directus/Directus.php', + 'App\\SupportedApps\\DokuWiki\\DokuWiki' => __DIR__ . '/../..' . '/app/SupportedApps/DokuWiki/DokuWiki.php', + 'App\\SupportedApps\\Domoticz\\Domoticz' => __DIR__ . '/../..' . '/app/SupportedApps/Domoticz/Domoticz.php', + 'App\\SupportedApps\\Dozzle\\Dozzle' => __DIR__ . '/../..' . '/app/SupportedApps/Dozzle/Dozzle.php', + 'App\\SupportedApps\\Drone\\Drone' => __DIR__ . '/../..' . '/app/SupportedApps/Drone/Drone.php', + 'App\\SupportedApps\\Droppy\\Droppy' => __DIR__ . '/../..' . '/app/SupportedApps/Droppy/Droppy.php', + 'App\\SupportedApps\\Duplicacy\\Duplicacy' => __DIR__ . '/../..' . '/app/SupportedApps/Duplicacy/Duplicacy.php', + 'App\\SupportedApps\\Duplicati\\Duplicati' => __DIR__ . '/../..' . '/app/SupportedApps/Duplicati/Duplicati.php', + 'App\\SupportedApps\\ESPHome\\ESPHome' => __DIR__ . '/../..' . '/app/SupportedApps/ESPHome/ESPHome.php', + 'App\\SupportedApps\\Element\\Element' => __DIR__ . '/../..' . '/app/SupportedApps/Element/Element.php', + 'App\\SupportedApps\\EmbyStat\\EmbyStat' => __DIR__ . '/../..' . '/app/SupportedApps/EmbyStat/EmbyStat.php', + 'App\\SupportedApps\\Emby\\Emby' => __DIR__ . '/../..' . '/app/SupportedApps/Emby/Emby.php', + 'App\\SupportedApps\\FileBrowser\\FileBrowser' => __DIR__ . '/../..' . '/app/SupportedApps/FileBrowser/FileBrowser.php', + 'App\\SupportedApps\\FileFlows\\FileFlows' => __DIR__ . '/../..' . '/app/SupportedApps/FileFlows/FileFlows.php', + 'App\\SupportedApps\\FileRun\\FileRun' => __DIR__ . '/../..' . '/app/SupportedApps/FileRun/FileRun.php', + 'App\\SupportedApps\\Firefly\\Firefly' => __DIR__ . '/../..' . '/app/SupportedApps/Firefly/Firefly.php', + 'App\\SupportedApps\\FirefoxSend\\FirefoxSend' => __DIR__ . '/../..' . '/app/SupportedApps/FirefoxSend/FirefoxSend.php', + 'App\\SupportedApps\\FlexGet\\FlexGet' => __DIR__ . '/../..' . '/app/SupportedApps/FlexGet/FlexGet.php', + 'App\\SupportedApps\\Flood\\Flood' => __DIR__ . '/../..' . '/app/SupportedApps/Flood/Flood.php', + 'App\\SupportedApps\\Focalboard\\Focalboard' => __DIR__ . '/../..' . '/app/SupportedApps/Focalboard/Focalboard.php', + 'App\\SupportedApps\\FoldingHome\\FoldingHome' => __DIR__ . '/../..' . '/app/SupportedApps/FoldingHome/FoldingHome.php', + 'App\\SupportedApps\\FortinetFortiMonitor\\FortinetFortiMonitor' => __DIR__ . '/../..' . '/app/SupportedApps/FortinetFortiMonitor/FortinetFortiMonitor.php', + 'App\\SupportedApps\\Freenas\\Freenas' => __DIR__ . '/../..' . '/app/SupportedApps/Freenas/Freenas.php', + 'App\\SupportedApps\\FreshRSS\\FreshRSS' => __DIR__ . '/../..' . '/app/SupportedApps/FreshRSS/FreshRSS.php', + 'App\\SupportedApps\\Fronius\\Fronius' => __DIR__ . '/../..' . '/app/SupportedApps/Fronius/Fronius.php', + 'App\\SupportedApps\\Funkwhale\\Funkwhale' => __DIR__ . '/../..' . '/app/SupportedApps/Funkwhale/Funkwhale.php', + 'App\\SupportedApps\\Ghost\\Ghost' => __DIR__ . '/../..' . '/app/SupportedApps/Ghost/Ghost.php', + 'App\\SupportedApps\\GitHub\\GitHub' => __DIR__ . '/../..' . '/app/SupportedApps/GitHub/GitHub.php', + 'App\\SupportedApps\\GitLab\\GitLab' => __DIR__ . '/../..' . '/app/SupportedApps/GitLab/GitLab.php', + 'App\\SupportedApps\\Gitea\\Gitea' => __DIR__ . '/../..' . '/app/SupportedApps/Gitea/Gitea.php', + 'App\\SupportedApps\\Glances\\Glances' => __DIR__ . '/../..' . '/app/SupportedApps/Glances/Glances.php', + 'App\\SupportedApps\\Gogs\\Gogs' => __DIR__ . '/../..' . '/app/SupportedApps/Gogs/Gogs.php', + 'App\\SupportedApps\\Gotify\\Gotify' => __DIR__ . '/../..' . '/app/SupportedApps/Gotify/Gotify.php', + 'App\\SupportedApps\\Grafana\\Grafana' => __DIR__ . '/../..' . '/app/SupportedApps/Grafana/Grafana.php', + 'App\\SupportedApps\\Grav\\Grav' => __DIR__ . '/../..' . '/app/SupportedApps/Grav/Grav.php', + 'App\\SupportedApps\\Graylog\\Graylog' => __DIR__ . '/../..' . '/app/SupportedApps/Graylog/Graylog.php', + 'App\\SupportedApps\\Grocy\\Grocy' => __DIR__ . '/../..' . '/app/SupportedApps/Grocy/Grocy.php', + 'App\\SupportedApps\\Guacamole\\Guacamole' => __DIR__ . '/../..' . '/app/SupportedApps/Guacamole/Guacamole.php', + 'App\\SupportedApps\\HAProxy\\HAProxy' => __DIR__ . '/../..' . '/app/SupportedApps/HAProxy/HAProxy.php', + 'App\\SupportedApps\\HDHomeRun\\HDHomeRun' => __DIR__ . '/../..' . '/app/SupportedApps/HDHomeRun/HDHomeRun.php', + 'App\\SupportedApps\\Handbrake\\Handbrake' => __DIR__ . '/../..' . '/app/SupportedApps/Handbrake/Handbrake.php', + 'App\\SupportedApps\\Hasura\\Hasura' => __DIR__ . '/../..' . '/app/SupportedApps/Hasura/Hasura.php', + 'App\\SupportedApps\\Headphones\\Headphones' => __DIR__ . '/../..' . '/app/SupportedApps/Headphones/Headphones.php', + 'App\\SupportedApps\\Healthchecks\\Healthchecks' => __DIR__ . '/../..' . '/app/SupportedApps/Healthchecks/Healthchecks.php', + 'App\\SupportedApps\\HomeAssistant\\HomeAssistant' => __DIR__ . '/../..' . '/app/SupportedApps/HomeAssistant/HomeAssistant.php', + 'App\\SupportedApps\\Homebridge\\Homebridge' => __DIR__ . '/../..' . '/app/SupportedApps/Homebridge/Homebridge.php', + 'App\\SupportedApps\\Homer\\Homer' => __DIR__ . '/../..' . '/app/SupportedApps/Homer/Homer.php', + 'App\\SupportedApps\\Hubitat\\Hubitat' => __DIR__ . '/../..' . '/app/SupportedApps/Hubitat/Hubitat.php', + 'App\\SupportedApps\\Huginn\\Huginn' => __DIR__ . '/../..' . '/app/SupportedApps/Huginn/Huginn.php', + 'App\\SupportedApps\\Icecast\\Icecast' => __DIR__ . '/../..' . '/app/SupportedApps/Icecast/Icecast.php', + 'App\\SupportedApps\\IcingaWeb\\IcingaWeb' => __DIR__ . '/../..' . '/app/SupportedApps/IcingaWeb/IcingaWeb.php', + 'App\\SupportedApps\\InfluxDB\\InfluxDB' => __DIR__ . '/../..' . '/app/SupportedApps/InfluxDB/InfluxDB.php', + 'App\\SupportedApps\\Infoblox\\Infoblox' => __DIR__ . '/../..' . '/app/SupportedApps/Infoblox/Infoblox.php', + 'App\\SupportedApps\\Invidious\\Invidious' => __DIR__ . '/../..' . '/app/SupportedApps/Invidious/Invidious.php', + 'App\\SupportedApps\\InvoiceNinja\\InvoiceNinja' => __DIR__ . '/../..' . '/app/SupportedApps/InvoiceNinja/InvoiceNinja.php', + 'App\\SupportedApps\\JDownloader\\JDownloader' => __DIR__ . '/../..' . '/app/SupportedApps/JDownloader/JDownloader.php', + 'App\\SupportedApps\\Jackett\\Jackett' => __DIR__ . '/../..' . '/app/SupportedApps/Jackett/Jackett.php', + 'App\\SupportedApps\\Jaeger\\Jaeger' => __DIR__ . '/../..' . '/app/SupportedApps/Jaeger/Jaeger.php', + 'App\\SupportedApps\\Jeedom\\Jeedom' => __DIR__ . '/../..' . '/app/SupportedApps/Jeedom/Jeedom.php', + 'App\\SupportedApps\\Jellyfin\\Jellyfin' => __DIR__ . '/../..' . '/app/SupportedApps/Jellyfin/Jellyfin.php', + 'App\\SupportedApps\\Jenkins\\Jenkins' => __DIR__ . '/../..' . '/app/SupportedApps/Jenkins/Jenkins.php', + 'App\\SupportedApps\\Jira\\Jira' => __DIR__ . '/../..' . '/app/SupportedApps/Jira/Jira.php', + 'App\\SupportedApps\\Jitsi\\Jitsi' => __DIR__ . '/../..' . '/app/SupportedApps/Jitsi/Jitsi.php', + 'App\\SupportedApps\\Joomla\\Joomla' => __DIR__ . '/../..' . '/app/SupportedApps/Joomla/Joomla.php', + 'App\\SupportedApps\\Jupyter\\Jupyter' => __DIR__ . '/../..' . '/app/SupportedApps/Jupyter/Jupyter.php', + 'App\\SupportedApps\\Kanboard\\Kanboard' => __DIR__ . '/../..' . '/app/SupportedApps/Kanboard/Kanboard.php', + 'App\\SupportedApps\\Keycloak\\Keycloak' => __DIR__ . '/../..' . '/app/SupportedApps/Keycloak/Keycloak.php', + 'App\\SupportedApps\\Kibana\\Kibana' => __DIR__ . '/../..' . '/app/SupportedApps/Kibana/Kibana.php', + 'App\\SupportedApps\\Kimai\\Kimai' => __DIR__ . '/../..' . '/app/SupportedApps/Kimai/Kimai.php', + 'App\\SupportedApps\\Kitana\\Kitana' => __DIR__ . '/../..' . '/app/SupportedApps/Kitana/Kitana.php', + 'App\\SupportedApps\\Kodi\\Kodi' => __DIR__ . '/../..' . '/app/SupportedApps/Kodi/Kodi.php', + 'App\\SupportedApps\\Komga\\Komga' => __DIR__ . '/../..' . '/app/SupportedApps/Komga/Komga.php', + 'App\\SupportedApps\\Kopia\\Kopia' => __DIR__ . '/../..' . '/app/SupportedApps/Kopia/Kopia.php', + 'App\\SupportedApps\\Krusader\\Krusader' => __DIR__ . '/../..' . '/app/SupportedApps/Krusader/Krusader.php', + 'App\\SupportedApps\\KubernetesDashboard\\KubernetesDashboard' => __DIR__ . '/../..' . '/app/SupportedApps/KubernetesDashboard/KubernetesDashboard.php', + 'App\\SupportedApps\\LazyLibrarian\\LazyLibrarian' => __DIR__ . '/../..' . '/app/SupportedApps/LazyLibrarian/LazyLibrarian.php', + 'App\\SupportedApps\\LemonLDAPNG\\LemonLDAPNG' => __DIR__ . '/../..' . '/app/SupportedApps/LemonLDAPNG/LemonLDAPNG.php', + 'App\\SupportedApps\\LibreNMS\\LibreNMS' => __DIR__ . '/../..' . '/app/SupportedApps/LibreNMS/LibreNMS.php', + 'App\\SupportedApps\\LibreSpeed\\LibreSpeed' => __DIR__ . '/../..' . '/app/SupportedApps/LibreSpeed/LibreSpeed.php', + 'App\\SupportedApps\\Lidarr\\Lidarr' => __DIR__ . '/../..' . '/app/SupportedApps/Lidarr/Lidarr.php', + 'App\\SupportedApps\\LinkAce\\LinkAce' => __DIR__ . '/../..' . '/app/SupportedApps/LinkAce/LinkAce.php', + 'App\\SupportedApps\\Lychee\\Lychee' => __DIR__ . '/../..' . '/app/SupportedApps/Lychee/Lychee.php', + 'App\\SupportedApps\\MailcowSOGo\\MailcowSOGo' => __DIR__ . '/../..' . '/app/SupportedApps/MailcowSOGo/MailcowSOGo.php', + 'App\\SupportedApps\\Mailcow\\Mailcow' => __DIR__ . '/../..' . '/app/SupportedApps/Mailcow/Mailcow.php', + 'App\\SupportedApps\\Mailhog\\Mailhog' => __DIR__ . '/../..' . '/app/SupportedApps/Mailhog/Mailhog.php', + 'App\\SupportedApps\\Mainsail\\Mainsail' => __DIR__ . '/../..' . '/app/SupportedApps/Mainsail/Mainsail.php', + 'App\\SupportedApps\\Mastodon\\Mastodon' => __DIR__ . '/../..' . '/app/SupportedApps/Mastodon/Mastodon.php', + 'App\\SupportedApps\\Mattermost\\Mattermost' => __DIR__ . '/../..' . '/app/SupportedApps/Mattermost/Mattermost.php', + 'App\\SupportedApps\\MayanEDMS\\MayanEDMS' => __DIR__ . '/../..' . '/app/SupportedApps/MayanEDMS/MayanEDMS.php', + 'App\\SupportedApps\\McMyAdmin\\McMyAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/McMyAdmin/McMyAdmin.php', + 'App\\SupportedApps\\Mealie\\Mealie' => __DIR__ . '/../..' . '/app/SupportedApps/Mealie/Mealie.php', + 'App\\SupportedApps\\MediaWiki\\MediaWiki' => __DIR__ . '/../..' . '/app/SupportedApps/MediaWiki/MediaWiki.php', + 'App\\SupportedApps\\Medusa\\Medusa' => __DIR__ . '/../..' . '/app/SupportedApps/Medusa/Medusa.php', + 'App\\SupportedApps\\Meraki\\Meraki' => __DIR__ . '/../..' . '/app/SupportedApps/Meraki/Meraki.php', + 'App\\SupportedApps\\MineOS\\MineOS' => __DIR__ . '/../..' . '/app/SupportedApps/MineOS/MineOS.php', + 'App\\SupportedApps\\Miniflux\\Miniflux' => __DIR__ . '/../..' . '/app/SupportedApps/Miniflux/Miniflux.php', + 'App\\SupportedApps\\Minio\\Minio' => __DIR__ . '/../..' . '/app/SupportedApps/Minio/Minio.php', + 'App\\SupportedApps\\Monica\\Monica' => __DIR__ . '/../..' . '/app/SupportedApps/Monica/Monica.php', + 'App\\SupportedApps\\Monit\\Monit' => __DIR__ . '/../..' . '/app/SupportedApps/Monit/Monit.php', + 'App\\SupportedApps\\MotionEye\\MotionEye' => __DIR__ . '/../..' . '/app/SupportedApps/MotionEye/MotionEye.php', + 'App\\SupportedApps\\MusicBrainz\\MusicBrainz' => __DIR__ . '/../..' . '/app/SupportedApps/MusicBrainz/MusicBrainz.php', + 'App\\SupportedApps\\Mylar\\Mylar' => __DIR__ . '/../..' . '/app/SupportedApps/Mylar/Mylar.php', + 'App\\SupportedApps\\NZBHydra\\NZBHydra' => __DIR__ . '/../..' . '/app/SupportedApps/NZBHydra/NZBHydra.php', + 'App\\SupportedApps\\Navidrome\\Navidrome' => __DIR__ . '/../..' . '/app/SupportedApps/Navidrome/Navidrome.php', + 'App\\SupportedApps\\Nessus\\Nessus' => __DIR__ . '/../..' . '/app/SupportedApps/Nessus/Nessus.php', + 'App\\SupportedApps\\NetBox\\NetBox' => __DIR__ . '/../..' . '/app/SupportedApps/NetBox/NetBox.php', + 'App\\SupportedApps\\Netatmo\\Netatmo' => __DIR__ . '/../..' . '/app/SupportedApps/Netatmo/Netatmo.php', + 'App\\SupportedApps\\Netboot\\Netboot' => __DIR__ . '/../..' . '/app/SupportedApps/Netboot/Netboot.php', + 'App\\SupportedApps\\Netdata\\Netdata' => __DIR__ . '/../..' . '/app/SupportedApps/Netdata/Netdata.php', + 'App\\SupportedApps\\Nextcloud\\Nextcloud' => __DIR__ . '/../..' . '/app/SupportedApps/Nextcloud/Nextcloud.php', + 'App\\SupportedApps\\NginxProxyManager\\NginxProxyManager' => __DIR__ . '/../..' . '/app/SupportedApps/NginxProxyManager/NginxProxyManager.php', + 'App\\SupportedApps\\Nitter\\Nitter' => __DIR__ . '/../..' . '/app/SupportedApps/Nitter/Nitter.php', + 'App\\SupportedApps\\NodeRed\\NodeRed' => __DIR__ . '/../..' . '/app/SupportedApps/NodeRed/NodeRed.php', + 'App\\SupportedApps\\NowShowing\\NowShowing' => __DIR__ . '/../..' . '/app/SupportedApps/NowShowing/NowShowing.php', + 'App\\SupportedApps\\NxFilter\\NxFilter' => __DIR__ . '/../..' . '/app/SupportedApps/NxFilter/NxFilter.php', + 'App\\SupportedApps\\Nzbget\\Nzbget' => __DIR__ . '/../..' . '/app/SupportedApps/Nzbget/Nzbget.php', + 'App\\SupportedApps\\OPNsense\\OPNsense' => __DIR__ . '/../..' . '/app/SupportedApps/OPNsense/OPNsense.php', + 'App\\SupportedApps\\Octoprint\\Octoprint' => __DIR__ . '/../..' . '/app/SupportedApps/Octoprint/Octoprint.php', + 'App\\SupportedApps\\Ombi\\Ombi' => __DIR__ . '/../..' . '/app/SupportedApps/Ombi/Ombi.php', + 'App\\SupportedApps\\OmniDB\\OmniDB' => __DIR__ . '/../..' . '/app/SupportedApps/OmniDB/OmniDB.php', + 'App\\SupportedApps\\OnlyOffice\\OnlyOffice' => __DIR__ . '/../..' . '/app/SupportedApps/OnlyOffice/OnlyOffice.php', + 'App\\SupportedApps\\OpenMapTiler\\OpenMapTiler' => __DIR__ . '/../..' . '/app/SupportedApps/OpenMapTiler/OpenMapTiler.php', + 'App\\SupportedApps\\OpenSpeedTest\\OpenSpeedTest' => __DIR__ . '/../..' . '/app/SupportedApps/OpenSpeedTest/OpenSpeedTest.php', + 'App\\SupportedApps\\OpenSprinkler\\OpenSprinkler' => __DIR__ . '/../..' . '/app/SupportedApps/OpenSprinkler/OpenSprinkler.php', + 'App\\SupportedApps\\OpenWrt\\OpenWrt' => __DIR__ . '/../..' . '/app/SupportedApps/OpenWrt/OpenWrt.php', + 'App\\SupportedApps\\Oscarr\\Oscarr' => __DIR__ . '/../..' . '/app/SupportedApps/Oscarr/Oscarr.php', + 'App\\SupportedApps\\Overseerr\\Overseerr' => __DIR__ . '/../..' . '/app/SupportedApps/Overseerr/Overseerr.php', + 'App\\SupportedApps\\OwnPhotos\\OwnPhotos' => __DIR__ . '/../..' . '/app/SupportedApps/OwnPhotos/OwnPhotos.php', + 'App\\SupportedApps\\PRTG\\PRTG' => __DIR__ . '/../..' . '/app/SupportedApps/PRTG/PRTG.php', + 'App\\SupportedApps\\PaloAltoNetworks\\PaloAltoNetworks' => __DIR__ . '/../..' . '/app/SupportedApps/PaloAltoNetworks/PaloAltoNetworks.php', + 'App\\SupportedApps\\Paperless\\Paperless' => __DIR__ . '/../..' . '/app/SupportedApps/Paperless/Paperless.php', + 'App\\SupportedApps\\PartKeepr\\PartKeepr' => __DIR__ . '/../..' . '/app/SupportedApps/PartKeepr/PartKeepr.php', + 'App\\SupportedApps\\PeerTube\\PeerTube' => __DIR__ . '/../..' . '/app/SupportedApps/PeerTube/PeerTube.php', + 'App\\SupportedApps\\PhotoPrism\\PhotoPrism' => __DIR__ . '/../..' . '/app/SupportedApps/PhotoPrism/PhotoPrism.php', + 'App\\SupportedApps\\Photonix\\Photonix' => __DIR__ . '/../..' . '/app/SupportedApps/Photonix/Photonix.php', + 'App\\SupportedApps\\PiAware\\PiAware' => __DIR__ . '/../..' . '/app/SupportedApps/PiAware/PiAware.php', + 'App\\SupportedApps\\PiVPN\\PiVPN' => __DIR__ . '/../..' . '/app/SupportedApps/PiVPN/PiVPN.php', + 'App\\SupportedApps\\Pihole\\Pihole' => __DIR__ . '/../..' . '/app/SupportedApps/Pihole/Pihole.php', + 'App\\SupportedApps\\Piwigo\\Piwigo' => __DIR__ . '/../..' . '/app/SupportedApps/Piwigo/Piwigo.php', + 'App\\SupportedApps\\Pleroma\\Pleroma' => __DIR__ . '/../..' . '/app/SupportedApps/Pleroma/Pleroma.php', + 'App\\SupportedApps\\Plesk\\Plesk' => __DIR__ . '/../..' . '/app/SupportedApps/Plesk/Plesk.php', + 'App\\SupportedApps\\PlexRequests\\PlexRequests' => __DIR__ . '/../..' . '/app/SupportedApps/PlexRequests/PlexRequests.php', + 'App\\SupportedApps\\Plex\\Plex' => __DIR__ . '/../..' . '/app/SupportedApps/Plex/Plex.php', + 'App\\SupportedApps\\Plume\\Plume' => __DIR__ . '/../..' . '/app/SupportedApps/Plume/Plume.php', + 'App\\SupportedApps\\Portainer\\Portainer' => __DIR__ . '/../..' . '/app/SupportedApps/Portainer/Portainer.php', + 'App\\SupportedApps\\Poste\\Poste' => __DIR__ . '/../..' . '/app/SupportedApps/Poste/Poste.php', + 'App\\SupportedApps\\Printer\\Printer' => __DIR__ . '/../..' . '/app/SupportedApps/Printer/Printer.php', + 'App\\SupportedApps\\Privatebin\\Privatebin' => __DIR__ . '/../..' . '/app/SupportedApps/Privatebin/Privatebin.php', + 'App\\SupportedApps\\ProjectSend\\ProjectSend' => __DIR__ . '/../..' . '/app/SupportedApps/ProjectSend/ProjectSend.php', + 'App\\SupportedApps\\Prometheus\\Prometheus' => __DIR__ . '/../..' . '/app/SupportedApps/Prometheus/Prometheus.php', + 'App\\SupportedApps\\Prowlarr\\Prowlarr' => __DIR__ . '/../..' . '/app/SupportedApps/Prowlarr/Prowlarr.php', + 'App\\SupportedApps\\Proxmox\\Proxmox' => __DIR__ . '/../..' . '/app/SupportedApps/Proxmox/Proxmox.php', + 'App\\SupportedApps\\PsiTransfer\\PsiTransfer' => __DIR__ . '/../..' . '/app/SupportedApps/PsiTransfer/PsiTransfer.php', + 'App\\SupportedApps\\Pterodactyl\\Pterodactyl' => __DIR__ . '/../..' . '/app/SupportedApps/Pterodactyl/Pterodactyl.php', + 'App\\SupportedApps\\QNAP\\QNAP' => __DIR__ . '/../..' . '/app/SupportedApps/QNAP/QNAP.php', + 'App\\SupportedApps\\RStudioServer\\RStudioServer' => __DIR__ . '/../..' . '/app/SupportedApps/RStudioServer/RStudioServer.php', + 'App\\SupportedApps\\Radarr\\Radarr' => __DIR__ . '/../..' . '/app/SupportedApps/Radarr/Radarr.php', + 'App\\SupportedApps\\Rainloop\\Rainloop' => __DIR__ . '/../..' . '/app/SupportedApps/Rainloop/Rainloop.php', + 'App\\SupportedApps\\Rancher\\Rancher' => __DIR__ . '/../..' . '/app/SupportedApps/Rancher/Rancher.php', + 'App\\SupportedApps\\Raneto\\Raneto' => __DIR__ . '/../..' . '/app/SupportedApps/Raneto/Raneto.php', + 'App\\SupportedApps\\Rclone\\Rclone' => __DIR__ . '/../..' . '/app/SupportedApps/Rclone/Rclone.php', + 'App\\SupportedApps\\Readarr\\Readarr' => __DIR__ . '/../..' . '/app/SupportedApps/Readarr/Readarr.php', + 'App\\SupportedApps\\Recalbox\\Recalbox' => __DIR__ . '/../..' . '/app/SupportedApps/Recalbox/Recalbox.php', + 'App\\SupportedApps\\Requestrr\\Requestrr' => __DIR__ . '/../..' . '/app/SupportedApps/Requestrr/Requestrr.php', + 'App\\SupportedApps\\ResilioSync\\ResilioSync' => __DIR__ . '/../..' . '/app/SupportedApps/ResilioSync/ResilioSync.php', + 'App\\SupportedApps\\RiotWeb\\RiotWeb' => __DIR__ . '/../..' . '/app/SupportedApps/RiotWeb/RiotWeb.php', + 'App\\SupportedApps\\RocketChat\\RocketChat' => __DIR__ . '/../..' . '/app/SupportedApps/RocketChat/RocketChat.php', + 'App\\SupportedApps\\RompЯ\\RompЯ' => __DIR__ . '/../..' . '/app/SupportedApps/RompЯ/RompЯ.php', + 'App\\SupportedApps\\Roundcube\\Roundcube' => __DIR__ . '/../..' . '/app/SupportedApps/Roundcube/Roundcube.php', + 'App\\SupportedApps\\Router\\Router' => __DIR__ . '/../..' . '/app/SupportedApps/Router/Router.php', + 'App\\SupportedApps\\Rspamd\\Rspamd' => __DIR__ . '/../..' . '/app/SupportedApps/Rspamd/Rspamd.php', + 'App\\SupportedApps\\Rundeck\\Rundeck' => __DIR__ . '/../..' . '/app/SupportedApps/Rundeck/Rundeck.php', + 'App\\SupportedApps\\RuneAudio\\RuneAudio' => __DIR__ . '/../..' . '/app/SupportedApps/RuneAudio/RuneAudio.php', + 'App\\SupportedApps\\SABnzbd\\SABnzbd' => __DIR__ . '/../..' . '/app/SupportedApps/SABnzbd/SABnzbd.php', + 'App\\SupportedApps\\SOGo\\SOGo' => __DIR__ . '/../..' . '/app/SupportedApps/SOGo/SOGo.php', + 'App\\SupportedApps\\Seafile\\Seafile' => __DIR__ . '/../..' . '/app/SupportedApps/Seafile/Seafile.php', + 'App\\SupportedApps\\SearxMetasearchEngine\\SearxMetasearchEngine' => __DIR__ . '/../..' . '/app/SupportedApps/SearxMetasearchEngine/SearxMetasearchEngine.php', + 'App\\SupportedApps\\Serviio\\Serviio' => __DIR__ . '/../..' . '/app/SupportedApps/Serviio/Serviio.php', + 'App\\SupportedApps\\Shaarli\\Shaarli' => __DIR__ . '/../..' . '/app/SupportedApps/Shaarli/Shaarli.php', + 'App\\SupportedApps\\Shinobi\\Shinobi' => __DIR__ . '/../..' . '/app/SupportedApps/Shinobi/Shinobi.php', + 'App\\SupportedApps\\SickBeard\\SickBeard' => __DIR__ . '/../..' . '/app/SupportedApps/SickBeard/SickBeard.php', + 'App\\SupportedApps\\SickGear\\SickGear' => __DIR__ . '/../..' . '/app/SupportedApps/SickGear/SickGear.php', + 'App\\SupportedApps\\Sickchill\\Sickchill' => __DIR__ . '/../..' . '/app/SupportedApps/Sickchill/Sickchill.php', + 'App\\SupportedApps\\Slack\\Slack' => __DIR__ . '/../..' . '/app/SupportedApps/Slack/Slack.php', + 'App\\SupportedApps\\Snibox\\Snibox' => __DIR__ . '/../..' . '/app/SupportedApps/Snibox/Snibox.php', + 'App\\SupportedApps\\SonarQube\\SonarQube' => __DIR__ . '/../..' . '/app/SupportedApps/SonarQube/SonarQube.php', + 'App\\SupportedApps\\Sonarr\\Sonarr' => __DIR__ . '/../..' . '/app/SupportedApps/Sonarr/Sonarr.php', + 'App\\SupportedApps\\Sourcegraph\\Sourcegraph' => __DIR__ . '/../..' . '/app/SupportedApps/Sourcegraph/Sourcegraph.php', + 'App\\SupportedApps\\Splunk\\Splunk' => __DIR__ . '/../..' . '/app/SupportedApps/Splunk/Splunk.php', + 'App\\SupportedApps\\Spotweb\\Spotweb' => __DIR__ . '/../..' . '/app/SupportedApps/Spotweb/Spotweb.php', + 'App\\SupportedApps\\Squidex\\Squidex' => __DIR__ . '/../..' . '/app/SupportedApps/Squidex/Squidex.php', + 'App\\SupportedApps\\Stash\\Stash' => __DIR__ . '/../..' . '/app/SupportedApps/Stash/Stash.php', + 'App\\SupportedApps\\Statping\\Statping' => __DIR__ . '/../..' . '/app/SupportedApps/Statping/Statping.php', + 'App\\SupportedApps\\Strapi\\Strapi' => __DIR__ . '/../..' . '/app/SupportedApps/Strapi/Strapi.php', + 'App\\SupportedApps\\Streama\\Streama' => __DIR__ . '/../..' . '/app/SupportedApps/Streama/Streama.php', + 'App\\SupportedApps\\Sympa\\Sympa' => __DIR__ . '/../..' . '/app/SupportedApps/Sympa/Sympa.php', + 'App\\SupportedApps\\Synclounge\\Synclounge' => __DIR__ . '/../..' . '/app/SupportedApps/Synclounge/Synclounge.php', + 'App\\SupportedApps\\Syncthing\\Syncthing' => __DIR__ . '/../..' . '/app/SupportedApps/Syncthing/Syncthing.php', + 'App\\SupportedApps\\Synology\\Synology' => __DIR__ . '/../..' . '/app/SupportedApps/Synology/Synology.php', + 'App\\SupportedApps\\TVHeadend\\TVHeadend' => __DIR__ . '/../..' . '/app/SupportedApps/TVHeadend/TVHeadend.php', + 'App\\SupportedApps\\TYPO\\TYPO' => __DIR__ . '/../..' . '/app/SupportedApps/TYPO/TYPO.php', + 'App\\SupportedApps\\Taiga\\Taiga' => __DIR__ . '/../..' . '/app/SupportedApps/Taiga/Taiga.php', + 'App\\SupportedApps\\TandoorRecipes\\TandoorRecipes' => __DIR__ . '/../..' . '/app/SupportedApps/TandoorRecipes/TandoorRecipes.php', + 'App\\SupportedApps\\TarTenNinety\\TarTenNinety' => __DIR__ . '/../..' . '/app/SupportedApps/TarTenNinety/TarTenNinety.php', + 'App\\SupportedApps\\TasmoAdmin\\TasmoAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/TasmoAdmin/TasmoAdmin.php', + 'App\\SupportedApps\\Tasmota\\Tasmota' => __DIR__ . '/../..' . '/app/SupportedApps/Tasmota/Tasmota.php', + 'App\\SupportedApps\\Tautulli\\Tautulli' => __DIR__ . '/../..' . '/app/SupportedApps/Tautulli/Tautulli.php', + 'App\\SupportedApps\\Tdarr\\Tdarr' => __DIR__ . '/../..' . '/app/SupportedApps/Tdarr/Tdarr.php', + 'App\\SupportedApps\\Teedy\\Teedy' => __DIR__ . '/../..' . '/app/SupportedApps/Teedy/Teedy.php', + 'App\\SupportedApps\\TheLounge\\TheLounge' => __DIR__ . '/../..' . '/app/SupportedApps/TheLounge/TheLounge.php', + 'App\\SupportedApps\\TinyTinyRSS\\TinyTinyRSS' => __DIR__ . '/../..' . '/app/SupportedApps/TinyTinyRSS/TinyTinyRSS.php', + 'App\\SupportedApps\\Traccar\\Traccar' => __DIR__ . '/../..' . '/app/SupportedApps/Traccar/Traccar.php', + 'App\\SupportedApps\\Traefik\\Traefik' => __DIR__ . '/../..' . '/app/SupportedApps/Traefik/Traefik.php', + 'App\\SupportedApps\\Transmission\\Transmission' => __DIR__ . '/../..' . '/app/SupportedApps/Transmission/Transmission.php', + 'App\\SupportedApps\\Trilium\\Trilium' => __DIR__ . '/../..' . '/app/SupportedApps/Trilium/Trilium.php', + 'App\\SupportedApps\\TrueNASCORE\\TrueNASCORE' => __DIR__ . '/../..' . '/app/SupportedApps/TrueNASCORE/TrueNASCORE.php', + 'App\\SupportedApps\\TrueNAS\\TrueNAS' => __DIR__ . '/../..' . '/app/SupportedApps/TrueNAS/TrueNAS.php', + 'App\\SupportedApps\\Ubooquity\\Ubooquity' => __DIR__ . '/../..' . '/app/SupportedApps/Ubooquity/Ubooquity.php', + 'App\\SupportedApps\\UniFi\\UniFi' => __DIR__ . '/../..' . '/app/SupportedApps/UniFi/UniFi.php', + 'App\\SupportedApps\\Unraid\\Unraid' => __DIR__ . '/../..' . '/app/SupportedApps/Unraid/Unraid.php', + 'App\\SupportedApps\\UrBackup\\UrBackup' => __DIR__ . '/../..' . '/app/SupportedApps/UrBackup/UrBackup.php', + 'App\\SupportedApps\\VMwareESXi\\VMwareESXi' => __DIR__ . '/../..' . '/app/SupportedApps/VMwareESXi/VMwareESXi.php', + 'App\\SupportedApps\\VMwarevCenter\\VMwarevCenter' => __DIR__ . '/../..' . '/app/SupportedApps/VMwarevCenter/VMwarevCenter.php', + 'App\\SupportedApps\\ViMbAdmin\\ViMbAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/ViMbAdmin/ViMbAdmin.php', + 'App\\SupportedApps\\VirtualRadarServer\\VirtualRadarServer' => __DIR__ . '/../..' . '/app/SupportedApps/VirtualRadarServer/VirtualRadarServer.php', + 'App\\SupportedApps\\Virtualmin\\Virtualmin' => __DIR__ . '/../..' . '/app/SupportedApps/Virtualmin/Virtualmin.php', + 'App\\SupportedApps\\Volumio\\Volumio' => __DIR__ . '/../..' . '/app/SupportedApps/Volumio/Volumio.php', + 'App\\SupportedApps\\VuPlus\\VuPlus' => __DIR__ . '/../..' . '/app/SupportedApps/VuPlus/VuPlus.php', + 'App\\SupportedApps\\Wallabag\\Wallabag' => __DIR__ . '/../..' . '/app/SupportedApps/Wallabag/Wallabag.php', + 'App\\SupportedApps\\WaniKani\\WaniKani' => __DIR__ . '/../..' . '/app/SupportedApps/WaniKani/WaniKani.php', + 'App\\SupportedApps\\Watcher\\Watcher' => __DIR__ . '/../..' . '/app/SupportedApps/Watcher/Watcher.php', + 'App\\SupportedApps\\WebTools\\WebTools' => __DIR__ . '/../..' . '/app/SupportedApps/WebTools/WebTools.php', + 'App\\SupportedApps\\Webmin\\Webmin' => __DIR__ . '/../..' . '/app/SupportedApps/Webmin/Webmin.php', + 'App\\SupportedApps\\Wekan\\Wekan' => __DIR__ . '/../..' . '/app/SupportedApps/Wekan/Wekan.php', + 'App\\SupportedApps\\Wetty\\Wetty' => __DIR__ . '/../..' . '/app/SupportedApps/Wetty/Wetty.php', + 'App\\SupportedApps\\WgGenWeb\\WgGenWeb' => __DIR__ . '/../..' . '/app/SupportedApps/WgGenWeb/WgGenWeb.php', + 'App\\SupportedApps\\Wikijs\\Wikijs' => __DIR__ . '/../..' . '/app/SupportedApps/Wikijs/Wikijs.php', + 'App\\SupportedApps\\WireGuard\\WireGuard' => __DIR__ . '/../..' . '/app/SupportedApps/WireGuard/WireGuard.php', + 'App\\SupportedApps\\Wordpress\\Wordpress' => __DIR__ . '/../..' . '/app/SupportedApps/Wordpress/Wordpress.php', + 'App\\SupportedApps\\XWiki\\XWiki' => __DIR__ . '/../..' . '/app/SupportedApps/XWiki/XWiki.php', + 'App\\SupportedApps\\XenOrchestra\\XenOrchestra' => __DIR__ . '/../..' . '/app/SupportedApps/XenOrchestra/XenOrchestra.php', + 'App\\SupportedApps\\Xigmanas\\Xigmanas' => __DIR__ . '/../..' . '/app/SupportedApps/Xigmanas/Xigmanas.php', + 'App\\SupportedApps\\YNAB\\YNAB' => __DIR__ . '/../..' . '/app/SupportedApps/YNAB/YNAB.php', + 'App\\SupportedApps\\ZNC\\ZNC' => __DIR__ . '/../..' . '/app/SupportedApps/ZNC/ZNC.php', + 'App\\SupportedApps\\Zabbix\\Zabbix' => __DIR__ . '/../..' . '/app/SupportedApps/Zabbix/Zabbix.php', + 'App\\SupportedApps\\Zammad\\Zammad' => __DIR__ . '/../..' . '/app/SupportedApps/Zammad/Zammad.php', + 'App\\SupportedApps\\ZoneMinder\\ZoneMinder' => __DIR__ . '/../..' . '/app/SupportedApps/ZoneMinder/ZoneMinder.php', + 'App\\SupportedApps\\Zulip\\Zulip' => __DIR__ . '/../..' . '/app/SupportedApps/Zulip/Zulip.php', + 'App\\SupportedApps\\cPanel\\cPanel' => __DIR__ . '/../..' . '/app/SupportedApps/cPanel/cPanel.php', + 'App\\SupportedApps\\iDRAC\\iDRAC' => __DIR__ . '/../..' . '/app/SupportedApps/iDRAC/iDRAC.php', + 'App\\SupportedApps\\iLO\\iLO' => __DIR__ . '/../..' . '/app/SupportedApps/iLO/iLO.php', + 'App\\SupportedApps\\ioBroker\\ioBroker' => __DIR__ . '/../..' . '/app/SupportedApps/ioBroker/ioBroker.php', + 'App\\SupportedApps\\neightn\\neightn' => __DIR__ . '/../..' . '/app/SupportedApps/neightn/neightn.php', + 'App\\SupportedApps\\openHAB\\openHAB' => __DIR__ . '/../..' . '/app/SupportedApps/openHAB/openHAB.php', + 'App\\SupportedApps\\openmediavault\\openmediavault' => __DIR__ . '/../..' . '/app/SupportedApps/openmediavault/openmediavault.php', + 'App\\SupportedApps\\osTicket\\osTicket' => __DIR__ . '/../..' . '/app/SupportedApps/osTicket/osTicket.php', + 'App\\SupportedApps\\ownCloud\\ownCloud' => __DIR__ . '/../..' . '/app/SupportedApps/ownCloud/ownCloud.php', + 'App\\SupportedApps\\pfSense\\pfSense' => __DIR__ . '/../..' . '/app/SupportedApps/pfSense/pfSense.php', + 'App\\SupportedApps\\pgAdmin\\pgAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/pgAdmin/pgAdmin.php', + 'App\\SupportedApps\\phpIPAM\\phpIPAM' => __DIR__ . '/../..' . '/app/SupportedApps/phpIPAM/phpIPAM.php', + 'App\\SupportedApps\\phpLDAPadmin\\phpLDAPadmin' => __DIR__ . '/../..' . '/app/SupportedApps/phpLDAPadmin/phpLDAPadmin.php', + 'App\\SupportedApps\\phpMyAdmin\\phpMyAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/phpMyAdmin/phpMyAdmin.php', + 'App\\SupportedApps\\pyLoad\\pyLoad' => __DIR__ . '/../..' . '/app/SupportedApps/pyLoad/pyLoad.php', + 'App\\SupportedApps\\qBittorrent\\qBittorrent' => __DIR__ . '/../..' . '/app/SupportedApps/qBittorrent/qBittorrent.php', + 'App\\SupportedApps\\ruTorrent\\ruTorrent' => __DIR__ . '/../..' . '/app/SupportedApps/ruTorrent/ruTorrent.php', + 'App\\SupportedApps\\vmwarehorizon\\vmwarehorizon' => __DIR__ . '/../..' . '/app/SupportedApps/vmwarehorizon/vmwarehorizon.php', + 'App\\SupportedApps\\xTeVe\\xTeVe' => __DIR__ . '/../..' . '/app/SupportedApps/xTeVe/xTeVe.php', + 'App\\SupportedApps\\youtubedl\\youtubedl' => __DIR__ . '/../..' . '/app/SupportedApps/youtubedl/youtubedl.php', 'App\\User' => __DIR__ . '/../..' . '/app/User.php', 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Brick\\Math\\BigDecimal' => __DIR__ . '/..' . '/brick/math/src/BigDecimal.php', @@ -5162,6 +5476,18 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Symfony\\Component\\VarExporter\\Internal\\Registry' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Registry.php', 'Symfony\\Component\\VarExporter\\Internal\\Values' => __DIR__ . '/..' . '/symfony/var-exporter/Internal/Values.php', 'Symfony\\Component\\VarExporter\\VarExporter' => __DIR__ . '/..' . '/symfony/var-exporter/VarExporter.php', + 'Symfony\\Component\\Yaml\\Command\\LintCommand' => __DIR__ . '/..' . '/symfony/yaml/Command/LintCommand.php', + 'Symfony\\Component\\Yaml\\Dumper' => __DIR__ . '/..' . '/symfony/yaml/Dumper.php', + 'Symfony\\Component\\Yaml\\Escaper' => __DIR__ . '/..' . '/symfony/yaml/Escaper.php', + 'Symfony\\Component\\Yaml\\Exception\\DumpException' => __DIR__ . '/..' . '/symfony/yaml/Exception/DumpException.php', + 'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/symfony/yaml/Exception/ExceptionInterface.php', + 'Symfony\\Component\\Yaml\\Exception\\ParseException' => __DIR__ . '/..' . '/symfony/yaml/Exception/ParseException.php', + 'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => __DIR__ . '/..' . '/symfony/yaml/Exception/RuntimeException.php', + 'Symfony\\Component\\Yaml\\Inline' => __DIR__ . '/..' . '/symfony/yaml/Inline.php', + 'Symfony\\Component\\Yaml\\Parser' => __DIR__ . '/..' . '/symfony/yaml/Parser.php', + 'Symfony\\Component\\Yaml\\Tag\\TaggedValue' => __DIR__ . '/..' . '/symfony/yaml/Tag/TaggedValue.php', + 'Symfony\\Component\\Yaml\\Unescaper' => __DIR__ . '/..' . '/symfony/yaml/Unescaper.php', + 'Symfony\\Component\\Yaml\\Yaml' => __DIR__ . '/..' . '/symfony/yaml/Yaml.php', 'Symfony\\Contracts\\Cache\\CacheInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheInterface.php', 'Symfony\\Contracts\\Cache\\CacheTrait' => __DIR__ . '/..' . '/symfony/cache-contracts/CacheTrait.php', 'Symfony\\Contracts\\Cache\\CallbackInterface' => __DIR__ . '/..' . '/symfony/cache-contracts/CallbackInterface.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 9a071bde..b4bf6a53 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -8000,6 +8000,84 @@ ], "install-path": "../symfony/var-exporter" }, + { + "name": "symfony/yaml", + "version": "v5.4.3", + "version_normalized": "5.4.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", + "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "time": "2022-01-26T16:32:32+00:00", + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "install-path": "../symfony/yaml" + }, { "name": "theseer/tokenizer", "version": "1.2.1", diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index de1f5c57..22ebde03 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -5,7 +5,7 @@ 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => 'f9a19fce91446a34aa433bb1426491fbb2005611', + 'reference' => '96ec1e0b08d37ac3a4beea6d9d9076b6e3f6d58e', 'name' => 'laravel/laravel', 'dev' => true, ), @@ -379,7 +379,7 @@ 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => 'f9a19fce91446a34aa433bb1426491fbb2005611', + 'reference' => '96ec1e0b08d37ac3a4beea6d9d9076b6e3f6d58e', 'dev_requirement' => false, ), 'laravel/tinker' => array( @@ -1271,6 +1271,15 @@ 'reference' => '49e2355fe6f59ea30c18ebb68edf13b7e20582e5', 'dev_requirement' => false, ), + 'symfony/yaml' => array( + 'pretty_version' => 'v5.4.3', + 'version' => '5.4.3.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../symfony/yaml', + 'aliases' => array(), + 'reference' => 'e80f87d2c9495966768310fc531b487ce64237a2', + 'dev_requirement' => false, + ), 'theseer/tokenizer' => array( 'pretty_version' => '1.2.1', 'version' => '1.2.1.0', diff --git a/vendor/symfony/yaml/CHANGELOG.md b/vendor/symfony/yaml/CHANGELOG.md new file mode 100644 index 00000000..b9561b2a --- /dev/null +++ b/vendor/symfony/yaml/CHANGELOG.md @@ -0,0 +1,237 @@ +CHANGELOG +========= + +5.4 +--- + + * Add new `lint:yaml dirname --exclude=/dirname/foo.yaml --exclude=/dirname/bar.yaml` + option to exclude one or more specific files from multiple file list + * Allow negatable for the parse tags option with `--no-parse-tags` + +5.3 +--- + + * Added `github` format support & autodetection to render errors as annotations + when running the YAML linter command in a Github Action environment. + +5.1.0 +----- + + * Added support for parsing numbers prefixed with `0o` as octal numbers. + * Deprecated support for parsing numbers starting with `0` as octal numbers. They will be parsed as strings as of Symfony 6.0. Prefix numbers with `0o` + so that they are parsed as octal numbers. + + Before: + + ```yaml + Yaml::parse('072'); + ``` + + After: + + ```yaml + Yaml::parse('0o72'); + ``` + + * Added `yaml-lint` binary. + * Deprecated using the `!php/object` and `!php/const` tags without a value. + +5.0.0 +----- + + * Removed support for mappings inside multi-line strings. + * removed support for implicit STDIN usage in the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit. + +4.4.0 +----- + + * Added support for parsing the inline notation spanning multiple lines. + * Added support to dump `null` as `~` by using the `Yaml::DUMP_NULL_AS_TILDE` flag. + * deprecated accepting STDIN implicitly when using the `lint:yaml` command, use `lint:yaml -` (append a dash) instead to make it explicit. + +4.3.0 +----- + + * Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0. + +4.2.0 +----- + + * added support for multiple files or directories in `LintCommand` + +4.0.0 +----- + + * The behavior of the non-specific tag `!` is changed and now forces + non-evaluating your values. + * complex mappings will throw a `ParseException` + * support for the comma as a group separator for floats has been dropped, use + the underscore instead + * support for the `!!php/object` tag has been dropped, use the `!php/object` + tag instead + * duplicate mapping keys throw a `ParseException` + * non-string mapping keys throw a `ParseException`, use the `Yaml::PARSE_KEYS_AS_STRINGS` + flag to cast them to strings + * `%` at the beginning of an unquoted string throw a `ParseException` + * mappings with a colon (`:`) that is not followed by a whitespace throw a + `ParseException` + * the `Dumper::setIndentation()` method has been removed + * being able to pass boolean options to the `Yaml::parse()`, `Yaml::dump()`, + `Parser::parse()`, and `Dumper::dump()` methods to configure the behavior of + the parser and dumper is no longer supported, pass bitmask flags instead + * the constructor arguments of the `Parser` class have been removed + * the `Inline` class is internal and no longer part of the BC promise + * removed support for the `!str` tag, use the `!!str` tag instead + * added support for tagged scalars. + + ```yml + Yaml::parse('!foo bar', Yaml::PARSE_CUSTOM_TAGS); + // returns TaggedValue('foo', 'bar'); + ``` + +3.4.0 +----- + + * added support for parsing YAML files using the `Yaml::parseFile()` or `Parser::parseFile()` method + + * the `Dumper`, `Parser`, and `Yaml` classes are marked as final + + * Deprecated the `!php/object:` tag which will be replaced by the + `!php/object` tag (without the colon) in 4.0. + + * Deprecated the `!php/const:` tag which will be replaced by the + `!php/const` tag (without the colon) in 4.0. + + * Support for the `!str` tag is deprecated, use the `!!str` tag instead. + + * Deprecated using the non-specific tag `!` as its behavior will change in 4.0. + It will force non-evaluating your values in 4.0. Use plain integers or `!!float` instead. + +3.3.0 +----- + + * Starting an unquoted string with a question mark followed by a space is + deprecated and will throw a `ParseException` in Symfony 4.0. + + * Deprecated support for implicitly parsing non-string mapping keys as strings. + Mapping keys that are no strings will lead to a `ParseException` in Symfony + 4.0. Use quotes to opt-in for keys to be parsed as strings. + + Before: + + ```php + $yaml = << new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE | Yaml::DUMP_OBJECT); + ``` + +3.0.0 +----- + + * Yaml::parse() now throws an exception when a blackslash is not escaped + in double-quoted strings + +2.8.0 +----- + + * Deprecated usage of a colon in an unquoted mapping value + * Deprecated usage of @, \`, | and > at the beginning of an unquoted string + * When surrounding strings with double-quotes, you must now escape `\` characters. Not + escaping those characters (when surrounded by double-quotes) is deprecated. + + Before: + + ```yml + class: "Foo\Var" + ``` + + After: + + ```yml + class: "Foo\\Var" + ``` + +2.1.0 +----- + + * Yaml::parse() does not evaluate loaded files as PHP files by default + anymore (call Yaml::enablePhpParsing() to get back the old behavior) diff --git a/vendor/symfony/yaml/Command/LintCommand.php b/vendor/symfony/yaml/Command/LintCommand.php new file mode 100644 index 00000000..3ebd570e --- /dev/null +++ b/vendor/symfony/yaml/Command/LintCommand.php @@ -0,0 +1,289 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Command; + +use Symfony\Component\Console\CI\GithubActionReporter; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Completion\CompletionInput; +use Symfony\Component\Console\Completion\CompletionSuggestions; +use Symfony\Component\Console\Exception\InvalidArgumentException; +use Symfony\Component\Console\Exception\RuntimeException; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Yaml\Exception\ParseException; +use Symfony\Component\Yaml\Parser; +use Symfony\Component\Yaml\Yaml; + +/** + * Validates YAML files syntax and outputs encountered errors. + * + * @author Grégoire Pineau + * @author Robin Chalas + */ +class LintCommand extends Command +{ + protected static $defaultName = 'lint:yaml'; + protected static $defaultDescription = 'Lint a YAML file and outputs encountered errors'; + + private $parser; + private $format; + private $displayCorrectFiles; + private $directoryIteratorProvider; + private $isReadableProvider; + + public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null) + { + parent::__construct($name); + + $this->directoryIteratorProvider = $directoryIteratorProvider; + $this->isReadableProvider = $isReadableProvider; + } + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + ->setDescription(self::$defaultDescription) + ->addArgument('filename', InputArgument::IS_ARRAY, 'A file, a directory or "-" for reading from STDIN') + ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format') + ->addOption('exclude', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Path(s) to exclude') + ->addOption('parse-tags', null, InputOption::VALUE_NEGATABLE, 'Parse custom tags', null) + ->setHelp(<<%command.name% command lints a YAML file and outputs to STDOUT +the first encountered syntax error. + +You can validates YAML contents passed from STDIN: + + cat filename | php %command.full_name% - + +You can also validate the syntax of a file: + + php %command.full_name% filename + +Or of a whole directory: + + php %command.full_name% dirname + php %command.full_name% dirname --format=json + +You can also exclude one or more specific files: + + php %command.full_name% dirname --exclude="dirname/foo.yaml" --exclude="dirname/bar.yaml" + +EOF + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $io = new SymfonyStyle($input, $output); + $filenames = (array) $input->getArgument('filename'); + $excludes = $input->getOption('exclude'); + $this->format = $input->getOption('format'); + $flags = $input->getOption('parse-tags'); + + if ('github' === $this->format && !class_exists(GithubActionReporter::class)) { + throw new \InvalidArgumentException('The "github" format is only available since "symfony/console" >= 5.3.'); + } + + if (null === $this->format) { + // Autodetect format according to CI environment + $this->format = class_exists(GithubActionReporter::class) && GithubActionReporter::isGithubActionEnvironment() ? 'github' : 'txt'; + } + + $flags = $flags ? Yaml::PARSE_CUSTOM_TAGS : 0; + + $this->displayCorrectFiles = $output->isVerbose(); + + if (['-'] === $filenames) { + return $this->display($io, [$this->validate(file_get_contents('php://stdin'), $flags)]); + } + + if (!$filenames) { + throw new RuntimeException('Please provide a filename or pipe file content to STDIN.'); + } + + $filesInfo = []; + foreach ($filenames as $filename) { + if (!$this->isReadable($filename)) { + throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename)); + } + + foreach ($this->getFiles($filename) as $file) { + if (!\in_array($file->getPathname(), $excludes, true)) { + $filesInfo[] = $this->validate(file_get_contents($file), $flags, $file); + } + } + } + + return $this->display($io, $filesInfo); + } + + private function validate(string $content, int $flags, string $file = null) + { + $prevErrorHandler = set_error_handler(function ($level, $message, $file, $line) use (&$prevErrorHandler) { + if (\E_USER_DEPRECATED === $level) { + throw new ParseException($message, $this->getParser()->getRealCurrentLineNb() + 1); + } + + return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : false; + }); + + try { + $this->getParser()->parse($content, Yaml::PARSE_CONSTANT | $flags); + } catch (ParseException $e) { + return ['file' => $file, 'line' => $e->getParsedLine(), 'valid' => false, 'message' => $e->getMessage()]; + } finally { + restore_error_handler(); + } + + return ['file' => $file, 'valid' => true]; + } + + private function display(SymfonyStyle $io, array $files): int + { + switch ($this->format) { + case 'txt': + return $this->displayTxt($io, $files); + case 'json': + return $this->displayJson($io, $files); + case 'github': + return $this->displayTxt($io, $files, true); + default: + throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format)); + } + } + + private function displayTxt(SymfonyStyle $io, array $filesInfo, bool $errorAsGithubAnnotations = false): int + { + $countFiles = \count($filesInfo); + $erroredFiles = 0; + $suggestTagOption = false; + + if ($errorAsGithubAnnotations) { + $githubReporter = new GithubActionReporter($io); + } + + foreach ($filesInfo as $info) { + if ($info['valid'] && $this->displayCorrectFiles) { + $io->comment('OK'.($info['file'] ? sprintf(' in %s', $info['file']) : '')); + } elseif (!$info['valid']) { + ++$erroredFiles; + $io->text(' ERROR '.($info['file'] ? sprintf(' in %s', $info['file']) : '')); + $io->text(sprintf(' >> %s', $info['message'])); + + if (false !== strpos($info['message'], 'PARSE_CUSTOM_TAGS')) { + $suggestTagOption = true; + } + + if ($errorAsGithubAnnotations) { + $githubReporter->error($info['message'], $info['file'] ?? 'php://stdin', $info['line']); + } + } + } + + if (0 === $erroredFiles) { + $io->success(sprintf('All %d YAML files contain valid syntax.', $countFiles)); + } else { + $io->warning(sprintf('%d YAML files have valid syntax and %d contain errors.%s', $countFiles - $erroredFiles, $erroredFiles, $suggestTagOption ? ' Use the --parse-tags option if you want parse custom tags.' : '')); + } + + return min($erroredFiles, 1); + } + + private function displayJson(SymfonyStyle $io, array $filesInfo): int + { + $errors = 0; + + array_walk($filesInfo, function (&$v) use (&$errors) { + $v['file'] = (string) $v['file']; + if (!$v['valid']) { + ++$errors; + } + + if (isset($v['message']) && false !== strpos($v['message'], 'PARSE_CUSTOM_TAGS')) { + $v['message'] .= ' Use the --parse-tags option if you want parse custom tags.'; + } + }); + + $io->writeln(json_encode($filesInfo, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES)); + + return min($errors, 1); + } + + private function getFiles(string $fileOrDirectory): iterable + { + if (is_file($fileOrDirectory)) { + yield new \SplFileInfo($fileOrDirectory); + + return; + } + + foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) { + if (!\in_array($file->getExtension(), ['yml', 'yaml'])) { + continue; + } + + yield $file; + } + } + + private function getParser(): Parser + { + if (!$this->parser) { + $this->parser = new Parser(); + } + + return $this->parser; + } + + private function getDirectoryIterator(string $directory): iterable + { + $default = function ($directory) { + return new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), + \RecursiveIteratorIterator::LEAVES_ONLY + ); + }; + + if (null !== $this->directoryIteratorProvider) { + return ($this->directoryIteratorProvider)($directory, $default); + } + + return $default($directory); + } + + private function isReadable(string $fileOrDirectory): bool + { + $default = function ($fileOrDirectory) { + return is_readable($fileOrDirectory); + }; + + if (null !== $this->isReadableProvider) { + return ($this->isReadableProvider)($fileOrDirectory, $default); + } + + return $default($fileOrDirectory); + } + + public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void + { + if ($input->mustSuggestOptionValuesFor('format')) { + $suggestions->suggestValues(['txt', 'json', 'github']); + } + } +} diff --git a/vendor/symfony/yaml/Dumper.php b/vendor/symfony/yaml/Dumper.php new file mode 100644 index 00000000..db3e346b --- /dev/null +++ b/vendor/symfony/yaml/Dumper.php @@ -0,0 +1,140 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Tag\TaggedValue; + +/** + * Dumper dumps PHP variables to YAML strings. + * + * @author Fabien Potencier + * + * @final + */ +class Dumper +{ + /** + * The amount of spaces to use for indentation of nested nodes. + * + * @var int + */ + protected $indentation; + + public function __construct(int $indentation = 4) + { + if ($indentation < 1) { + throw new \InvalidArgumentException('The indentation must be greater than zero.'); + } + + $this->indentation = $indentation; + } + + /** + * Dumps a PHP value to YAML. + * + * @param mixed $input The PHP value + * @param int $inline The level where you switch to inline YAML + * @param int $indent The level of indentation (used internally) + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + */ + public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0): string + { + $output = ''; + $prefix = $indent ? str_repeat(' ', $indent) : ''; + $dumpObjectAsInlineMap = true; + + if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($input instanceof \ArrayObject || $input instanceof \stdClass)) { + $dumpObjectAsInlineMap = empty((array) $input); + } + + if ($inline <= 0 || (!\is_array($input) && !$input instanceof TaggedValue && $dumpObjectAsInlineMap) || empty($input)) { + $output .= $prefix.Inline::dump($input, $flags); + } else { + $dumpAsMap = Inline::isHash($input); + + foreach ($input as $key => $value) { + if ('' !== $output && "\n" !== $output[-1]) { + $output .= "\n"; + } + + if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value) && false !== strpos($value, "\n") && false === strpos($value, "\r")) { + // If the first line starts with a space character, the spec requires a blockIndicationIndicator + // http://www.yaml.org/spec/1.2/spec.html#id2793979 + $blockIndentationIndicator = (' ' === substr($value, 0, 1)) ? (string) $this->indentation : ''; + + if (isset($value[-2]) && "\n" === $value[-2] && "\n" === $value[-1]) { + $blockChompingIndicator = '+'; + } elseif ("\n" === $value[-1]) { + $blockChompingIndicator = ''; + } else { + $blockChompingIndicator = '-'; + } + + $output .= sprintf('%s%s%s |%s%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '', $blockIndentationIndicator, $blockChompingIndicator); + + foreach (explode("\n", $value) as $row) { + if ('' === $row) { + $output .= "\n"; + } else { + $output .= sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row); + } + } + + continue; + } + + if ($value instanceof TaggedValue) { + $output .= sprintf('%s%s !%s', $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', $value->getTag()); + + if (Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value->getValue()) && false !== strpos($value->getValue(), "\n") && false === strpos($value->getValue(), "\r\n")) { + // If the first line starts with a space character, the spec requires a blockIndicationIndicator + // http://www.yaml.org/spec/1.2/spec.html#id2793979 + $blockIndentationIndicator = (' ' === substr($value->getValue(), 0, 1)) ? (string) $this->indentation : ''; + $output .= sprintf(' |%s', $blockIndentationIndicator); + + foreach (explode("\n", $value->getValue()) as $row) { + $output .= sprintf("\n%s%s%s", $prefix, str_repeat(' ', $this->indentation), $row); + } + + continue; + } + + if ($inline - 1 <= 0 || null === $value->getValue() || is_scalar($value->getValue())) { + $output .= ' '.$this->dump($value->getValue(), $inline - 1, 0, $flags)."\n"; + } else { + $output .= "\n"; + $output .= $this->dump($value->getValue(), $inline - 1, $dumpAsMap ? $indent + $this->indentation : $indent + 2, $flags); + } + + continue; + } + + $dumpObjectAsInlineMap = true; + + if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \ArrayObject || $value instanceof \stdClass)) { + $dumpObjectAsInlineMap = empty((array) $value); + } + + $willBeInlined = $inline - 1 <= 0 || !\is_array($value) && $dumpObjectAsInlineMap || empty($value); + + $output .= sprintf('%s%s%s%s', + $prefix, + $dumpAsMap ? Inline::dump($key, $flags).':' : '-', + $willBeInlined ? ' ' : "\n", + $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $flags) + ).($willBeInlined ? "\n" : ''); + } + } + + return $output; + } +} diff --git a/vendor/symfony/yaml/Escaper.php b/vendor/symfony/yaml/Escaper.php new file mode 100644 index 00000000..e8090d8c --- /dev/null +++ b/vendor/symfony/yaml/Escaper.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +/** + * Escaper encapsulates escaping rules for single and double-quoted + * YAML strings. + * + * @author Matthew Lewinski + * + * @internal + */ +class Escaper +{ + // Characters that would cause a dumped string to require double quoting. + public const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\x7f|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9"; + + // Mapping arrays for escaping a double quoted string. The backslash is + // first to ensure proper escaping because str_replace operates iteratively + // on the input arrays. This ordering of the characters avoids the use of strtr, + // which performs more slowly. + private const ESCAPEES = ['\\', '\\\\', '\\"', '"', + "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", + "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f", + "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", + "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", + "\x7f", + "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9", + ]; + private const ESCAPED = ['\\\\', '\\"', '\\\\', '\\"', + '\\0', '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a', + '\\b', '\\t', '\\n', '\\v', '\\f', '\\r', '\\x0e', '\\x0f', + '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17', + '\\x18', '\\x19', '\\x1a', '\\e', '\\x1c', '\\x1d', '\\x1e', '\\x1f', + '\\x7f', + '\\N', '\\_', '\\L', '\\P', + ]; + + /** + * Determines if a PHP value would require double quoting in YAML. + * + * @param string $value A PHP value + */ + public static function requiresDoubleQuoting(string $value): bool + { + return 0 < preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value); + } + + /** + * Escapes and surrounds a PHP value with double quotes. + * + * @param string $value A PHP value + */ + public static function escapeWithDoubleQuotes(string $value): string + { + return sprintf('"%s"', str_replace(self::ESCAPEES, self::ESCAPED, $value)); + } + + /** + * Determines if a PHP value would require single quoting in YAML. + * + * @param string $value A PHP value + */ + public static function requiresSingleQuoting(string $value): bool + { + // Determines if a PHP value is entirely composed of a value that would + // require single quoting in YAML. + if (\in_array(strtolower($value), ['null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'])) { + return true; + } + + // Determines if the PHP value contains any single characters that would + // cause it to require single quoting in YAML. + return 0 < preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` \p{Zs}]/xu', $value); + } + + /** + * Escapes and surrounds a PHP value with single quotes. + * + * @param string $value A PHP value + */ + public static function escapeWithSingleQuotes(string $value): string + { + return sprintf("'%s'", str_replace('\'', '\'\'', $value)); + } +} diff --git a/vendor/symfony/yaml/Exception/DumpException.php b/vendor/symfony/yaml/Exception/DumpException.php new file mode 100644 index 00000000..cce972f2 --- /dev/null +++ b/vendor/symfony/yaml/Exception/DumpException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during dumping. + * + * @author Fabien Potencier + */ +class DumpException extends RuntimeException +{ +} diff --git a/vendor/symfony/yaml/Exception/ExceptionInterface.php b/vendor/symfony/yaml/Exception/ExceptionInterface.php new file mode 100644 index 00000000..90913168 --- /dev/null +++ b/vendor/symfony/yaml/Exception/ExceptionInterface.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Exception; + +/** + * Exception interface for all exceptions thrown by the component. + * + * @author Fabien Potencier + */ +interface ExceptionInterface extends \Throwable +{ +} diff --git a/vendor/symfony/yaml/Exception/ParseException.php b/vendor/symfony/yaml/Exception/ParseException.php new file mode 100644 index 00000000..8748d2b2 --- /dev/null +++ b/vendor/symfony/yaml/Exception/ParseException.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during parsing. + * + * @author Fabien Potencier + */ +class ParseException extends RuntimeException +{ + private $parsedFile; + private $parsedLine; + private $snippet; + private $rawMessage; + + /** + * @param string $message The error message + * @param int $parsedLine The line where the error occurred + * @param string|null $snippet The snippet of code near the problem + * @param string|null $parsedFile The file name where the error occurred + */ + public function __construct(string $message, int $parsedLine = -1, string $snippet = null, string $parsedFile = null, \Throwable $previous = null) + { + $this->parsedFile = $parsedFile; + $this->parsedLine = $parsedLine; + $this->snippet = $snippet; + $this->rawMessage = $message; + + $this->updateRepr(); + + parent::__construct($this->message, 0, $previous); + } + + /** + * Gets the snippet of code near the error. + * + * @return string + */ + public function getSnippet() + { + return $this->snippet; + } + + /** + * Sets the snippet of code near the error. + */ + public function setSnippet(string $snippet) + { + $this->snippet = $snippet; + + $this->updateRepr(); + } + + /** + * Gets the filename where the error occurred. + * + * This method returns null if a string is parsed. + * + * @return string + */ + public function getParsedFile() + { + return $this->parsedFile; + } + + /** + * Sets the filename where the error occurred. + */ + public function setParsedFile(string $parsedFile) + { + $this->parsedFile = $parsedFile; + + $this->updateRepr(); + } + + /** + * Gets the line where the error occurred. + * + * @return int + */ + public function getParsedLine() + { + return $this->parsedLine; + } + + /** + * Sets the line where the error occurred. + */ + public function setParsedLine(int $parsedLine) + { + $this->parsedLine = $parsedLine; + + $this->updateRepr(); + } + + private function updateRepr() + { + $this->message = $this->rawMessage; + + $dot = false; + if ('.' === substr($this->message, -1)) { + $this->message = substr($this->message, 0, -1); + $dot = true; + } + + if (null !== $this->parsedFile) { + $this->message .= sprintf(' in %s', json_encode($this->parsedFile, \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); + } + + if ($this->parsedLine >= 0) { + $this->message .= sprintf(' at line %d', $this->parsedLine); + } + + if ($this->snippet) { + $this->message .= sprintf(' (near "%s")', $this->snippet); + } + + if ($dot) { + $this->message .= '.'; + } + } +} diff --git a/vendor/symfony/yaml/Exception/RuntimeException.php b/vendor/symfony/yaml/Exception/RuntimeException.php new file mode 100644 index 00000000..3f36b73b --- /dev/null +++ b/vendor/symfony/yaml/Exception/RuntimeException.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Exception; + +/** + * Exception class thrown when an error occurs during parsing. + * + * @author Romain Neutron + */ +class RuntimeException extends \RuntimeException implements ExceptionInterface +{ +} diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php new file mode 100644 index 00000000..3d64b1ad --- /dev/null +++ b/vendor/symfony/yaml/Inline.php @@ -0,0 +1,812 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Exception\DumpException; +use Symfony\Component\Yaml\Exception\ParseException; +use Symfony\Component\Yaml\Tag\TaggedValue; + +/** + * Inline implements a YAML parser/dumper for the YAML inline syntax. + * + * @author Fabien Potencier + * + * @internal + */ +class Inline +{ + public const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')'; + + public static $parsedLineNumber = -1; + public static $parsedFilename; + + private static $exceptionOnInvalidType = false; + private static $objectSupport = false; + private static $objectForMap = false; + private static $constantSupport = false; + + public static function initialize(int $flags, int $parsedLineNumber = null, string $parsedFilename = null) + { + self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags); + self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags); + self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags); + self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags); + self::$parsedFilename = $parsedFilename; + + if (null !== $parsedLineNumber) { + self::$parsedLineNumber = $parsedLineNumber; + } + } + + /** + * Converts a YAML string to a PHP value. + * + * @param string $value A YAML string + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * @param array $references Mapping of variable names to values + * + * @return mixed + * + * @throws ParseException + */ + public static function parse(string $value = null, int $flags = 0, array &$references = []) + { + self::initialize($flags); + + $value = trim($value); + + if ('' === $value) { + return ''; + } + + if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } + + try { + $i = 0; + $tag = self::parseTag($value, $i, $flags); + switch ($value[$i]) { + case '[': + $result = self::parseSequence($value, $flags, $i, $references); + ++$i; + break; + case '{': + $result = self::parseMapping($value, $flags, $i, $references); + ++$i; + break; + default: + $result = self::parseScalar($value, $flags, null, $i, null === $tag, $references); + } + + // some comments are allowed at the end + if (preg_replace('/\s*#.*$/A', '', substr($value, $i))) { + throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + + if (null !== $tag && '' !== $tag) { + return new TaggedValue($tag, $result); + } + + return $result; + } finally { + if (isset($mbEncoding)) { + mb_internal_encoding($mbEncoding); + } + } + } + + /** + * Dumps a given PHP variable to a YAML string. + * + * @param mixed $value The PHP variable to convert + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + * + * @throws DumpException When trying to dump PHP resource + */ + public static function dump($value, int $flags = 0): string + { + switch (true) { + case \is_resource($value): + if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) { + throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value))); + } + + return self::dumpNull($flags); + case $value instanceof \DateTimeInterface: + return $value->format('c'); + case $value instanceof \UnitEnum: + return sprintf('!php/const %s::%s', \get_class($value), $value->name); + case \is_object($value): + if ($value instanceof TaggedValue) { + return '!'.$value->getTag().' '.self::dump($value->getValue(), $flags); + } + + if (Yaml::DUMP_OBJECT & $flags) { + return '!php/object '.self::dump(serialize($value)); + } + + if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) { + $output = []; + + foreach ($value as $key => $val) { + $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags)); + } + + return sprintf('{ %s }', implode(', ', $output)); + } + + if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) { + throw new DumpException('Object support when dumping a YAML file has been disabled.'); + } + + return self::dumpNull($flags); + case \is_array($value): + return self::dumpArray($value, $flags); + case null === $value: + return self::dumpNull($flags); + case true === $value: + return 'true'; + case false === $value: + return 'false'; + case \is_int($value): + return $value; + case is_numeric($value) && false === strpbrk($value, "\f\n\r\t\v"): + $locale = setlocale(\LC_NUMERIC, 0); + if (false !== $locale) { + setlocale(\LC_NUMERIC, 'C'); + } + if (\is_float($value)) { + $repr = (string) $value; + if (is_infinite($value)) { + $repr = str_ireplace('INF', '.Inf', $repr); + } elseif (floor($value) == $value && $repr == $value) { + // Preserve float data type since storing a whole number will result in integer value. + if (false === strpos($repr, 'E')) { + $repr = $repr.'.0'; + } + } + } else { + $repr = \is_string($value) ? "'$value'" : (string) $value; + } + if (false !== $locale) { + setlocale(\LC_NUMERIC, $locale); + } + + return $repr; + case '' == $value: + return "''"; + case self::isBinaryString($value): + return '!!binary '.base64_encode($value); + case Escaper::requiresDoubleQuoting($value): + return Escaper::escapeWithDoubleQuotes($value); + case Escaper::requiresSingleQuoting($value): + case Parser::preg_match('{^[0-9]+[_0-9]*$}', $value): + case Parser::preg_match(self::getHexRegex(), $value): + case Parser::preg_match(self::getTimestampRegex(), $value): + return Escaper::escapeWithSingleQuotes($value); + default: + return $value; + } + } + + /** + * Check if given array is hash or just normal indexed array. + * + * @param array|\ArrayObject|\stdClass $value The PHP array or array-like object to check + */ + public static function isHash($value): bool + { + if ($value instanceof \stdClass || $value instanceof \ArrayObject) { + return true; + } + + $expectedKey = 0; + + foreach ($value as $key => $val) { + if ($key !== $expectedKey++) { + return true; + } + } + + return false; + } + + /** + * Dumps a PHP array to a YAML string. + * + * @param array $value The PHP array to dump + * @param int $flags A bit field of Yaml::DUMP_* constants to customize the dumped YAML string + */ + private static function dumpArray(array $value, int $flags): string + { + // array + if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) { + $output = []; + foreach ($value as $val) { + $output[] = self::dump($val, $flags); + } + + return sprintf('[%s]', implode(', ', $output)); + } + + // hash + $output = []; + foreach ($value as $key => $val) { + $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags)); + } + + return sprintf('{ %s }', implode(', ', $output)); + } + + private static function dumpNull(int $flags): string + { + if (Yaml::DUMP_NULL_AS_TILDE & $flags) { + return '~'; + } + + return 'null'; + } + + /** + * Parses a YAML scalar. + * + * @return mixed + * + * @throws ParseException When malformed inline YAML string is parsed + */ + public static function parseScalar(string $scalar, int $flags = 0, array $delimiters = null, int &$i = 0, bool $evaluate = true, array &$references = [], bool &$isQuoted = null) + { + if (\in_array($scalar[$i], ['"', "'"], true)) { + // quoted scalar + $isQuoted = true; + $output = self::parseQuotedScalar($scalar, $i); + + if (null !== $delimiters) { + $tmp = ltrim(substr($scalar, $i), " \n"); + if ('' === $tmp) { + throw new ParseException(sprintf('Unexpected end of line, expected one of "%s".', implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + if (!\in_array($tmp[0], $delimiters)) { + throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + } + } else { + // "normal" string + $isQuoted = false; + + if (!$delimiters) { + $output = substr($scalar, $i); + $i += \strlen($output); + + // remove comments + if (Parser::preg_match('/[ \t]+#/', $output, $match, \PREG_OFFSET_CAPTURE)) { + $output = substr($output, 0, $match[0][1]); + } + } elseif (Parser::preg_match('/^(.*?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) { + $output = $match[1]; + $i += \strlen($output); + $output = trim($output); + } else { + throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename); + } + + // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >) + if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) { + throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]), self::$parsedLineNumber + 1, $output, self::$parsedFilename); + } + + if ($evaluate) { + $output = self::evaluateScalar($output, $flags, $references, $isQuoted); + } + } + + return $output; + } + + /** + * Parses a YAML quoted scalar. + * + * @throws ParseException When malformed inline YAML string is parsed + */ + private static function parseQuotedScalar(string $scalar, int &$i = 0): string + { + if (!Parser::preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) { + throw new ParseException(sprintf('Malformed inline YAML string: "%s".', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + + $output = substr($match[0], 1, -1); + + $unescaper = new Unescaper(); + if ('"' == $scalar[$i]) { + $output = $unescaper->unescapeDoubleQuotedString($output); + } else { + $output = $unescaper->unescapeSingleQuotedString($output); + } + + $i += \strlen($match[0]); + + return $output; + } + + /** + * Parses a YAML sequence. + * + * @throws ParseException When malformed inline YAML string is parsed + */ + private static function parseSequence(string $sequence, int $flags, int &$i = 0, array &$references = []): array + { + $output = []; + $len = \strlen($sequence); + ++$i; + + // [foo, bar, ...] + while ($i < $len) { + if (']' === $sequence[$i]) { + return $output; + } + if (',' === $sequence[$i] || ' ' === $sequence[$i]) { + ++$i; + + continue; + } + + $tag = self::parseTag($sequence, $i, $flags); + switch ($sequence[$i]) { + case '[': + // nested sequence + $value = self::parseSequence($sequence, $flags, $i, $references); + break; + case '{': + // nested mapping + $value = self::parseMapping($sequence, $flags, $i, $references); + break; + default: + $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references, $isQuoted); + + // the value can be an array if a reference has been resolved to an array var + if (\is_string($value) && !$isQuoted && false !== strpos($value, ': ')) { + // embedded mapping? + try { + $pos = 0; + $value = self::parseMapping('{'.$value.'}', $flags, $pos, $references); + } catch (\InvalidArgumentException $e) { + // no, it's not + } + } + + if (!$isQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) { + $references[$matches['ref']] = $matches['value']; + $value = $matches['value']; + } + + --$i; + } + + if (null !== $tag && '' !== $tag) { + $value = new TaggedValue($tag, $value); + } + + $output[] = $value; + + ++$i; + } + + throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $sequence), self::$parsedLineNumber + 1, null, self::$parsedFilename); + } + + /** + * Parses a YAML mapping. + * + * @return array|\stdClass + * + * @throws ParseException When malformed inline YAML string is parsed + */ + private static function parseMapping(string $mapping, int $flags, int &$i = 0, array &$references = []) + { + $output = []; + $len = \strlen($mapping); + ++$i; + $allowOverwrite = false; + + // {foo: bar, bar:foo, ...} + while ($i < $len) { + switch ($mapping[$i]) { + case ' ': + case ',': + case "\n": + ++$i; + continue 2; + case '}': + if (self::$objectForMap) { + return (object) $output; + } + + return $output; + } + + // key + $offsetBeforeKeyParsing = $i; + $isKeyQuoted = \in_array($mapping[$i], ['"', "'"], true); + $key = self::parseScalar($mapping, $flags, [':', ' '], $i, false); + + if ($offsetBeforeKeyParsing === $i) { + throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping); + } + + if ('!php/const' === $key) { + $key .= ' '.self::parseScalar($mapping, $flags, [':'], $i, false); + $key = self::evaluateScalar($key, $flags); + } + + if (false === $i = strpos($mapping, ':', $i)) { + break; + } + + if (!$isKeyQuoted) { + $evaluatedKey = self::evaluateScalar($key, $flags, $references); + + if ('' !== $key && $evaluatedKey !== $key && !\is_string($evaluatedKey) && !\is_int($evaluatedKey)) { + throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping); + } + } + + if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}', "\n"], true))) { + throw new ParseException('Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}").', self::$parsedLineNumber + 1, $mapping); + } + + if ('<<' === $key) { + $allowOverwrite = true; + } + + while ($i < $len) { + if (':' === $mapping[$i] || ' ' === $mapping[$i] || "\n" === $mapping[$i]) { + ++$i; + + continue; + } + + $tag = self::parseTag($mapping, $i, $flags); + switch ($mapping[$i]) { + case '[': + // nested sequence + $value = self::parseSequence($mapping, $flags, $i, $references); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + // But overwriting is allowed when a merge node is used in current block. + if ('<<' === $key) { + foreach ($value as $parsedValue) { + $output += $parsedValue; + } + } elseif ($allowOverwrite || !isset($output[$key])) { + if (null !== $tag) { + $output[$key] = new TaggedValue($tag, $value); + } else { + $output[$key] = $value; + } + } elseif (isset($output[$key])) { + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); + } + break; + case '{': + // nested mapping + $value = self::parseMapping($mapping, $flags, $i, $references); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + // But overwriting is allowed when a merge node is used in current block. + if ('<<' === $key) { + $output += $value; + } elseif ($allowOverwrite || !isset($output[$key])) { + if (null !== $tag) { + $output[$key] = new TaggedValue($tag, $value); + } else { + $output[$key] = $value; + } + } elseif (isset($output[$key])) { + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); + } + break; + default: + $value = self::parseScalar($mapping, $flags, [',', '}', "\n"], $i, null === $tag, $references, $isValueQuoted); + // Spec: Keys MUST be unique; first one wins. + // Parser cannot abort this mapping earlier, since lines + // are processed sequentially. + // But overwriting is allowed when a merge node is used in current block. + if ('<<' === $key) { + $output += $value; + } elseif ($allowOverwrite || !isset($output[$key])) { + if (!$isValueQuoted && \is_string($value) && '' !== $value && '&' === $value[0] && Parser::preg_match(Parser::REFERENCE_PATTERN, $value, $matches)) { + $references[$matches['ref']] = $matches['value']; + $value = $matches['value']; + } + + if (null !== $tag) { + $output[$key] = new TaggedValue($tag, $value); + } else { + $output[$key] = $value; + } + } elseif (isset($output[$key])) { + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping); + } + --$i; + } + ++$i; + + continue 2; + } + } + + throw new ParseException(sprintf('Malformed inline YAML string: "%s".', $mapping), self::$parsedLineNumber + 1, null, self::$parsedFilename); + } + + /** + * Evaluates scalars and replaces magic values. + * + * @return mixed + * + * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved + */ + private static function evaluateScalar(string $scalar, int $flags, array &$references = [], bool &$isQuotedString = null) + { + $isQuotedString = false; + $scalar = trim($scalar); + + if (0 === strpos($scalar, '*')) { + if (false !== $pos = strpos($scalar, '#')) { + $value = substr($scalar, 1, $pos - 2); + } else { + $value = substr($scalar, 1); + } + + // an unquoted * + if (false === $value || '' === $value) { + throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + + if (!\array_key_exists($value, $references)) { + throw new ParseException(sprintf('Reference "%s" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + + return $references[$value]; + } + + $scalarLower = strtolower($scalar); + + switch (true) { + case 'null' === $scalarLower: + case '' === $scalar: + case '~' === $scalar: + return null; + case 'true' === $scalarLower: + return true; + case 'false' === $scalarLower: + return false; + case '!' === $scalar[0]: + switch (true) { + case 0 === strpos($scalar, '!!str '): + $s = (string) substr($scalar, 6); + + if (\in_array($s[0] ?? '', ['"', "'"], true)) { + $isQuotedString = true; + $s = self::parseQuotedScalar($s); + } + + return $s; + case 0 === strpos($scalar, '! '): + return substr($scalar, 2); + case 0 === strpos($scalar, '!php/object'): + if (self::$objectSupport) { + if (!isset($scalar[12])) { + trigger_deprecation('symfony/yaml', '5.1', 'Using the !php/object tag without a value is deprecated.'); + + return false; + } + + return unserialize(self::parseScalar(substr($scalar, 12))); + } + + if (self::$exceptionOnInvalidType) { + throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + + return null; + case 0 === strpos($scalar, '!php/const'): + if (self::$constantSupport) { + if (!isset($scalar[11])) { + trigger_deprecation('symfony/yaml', '5.1', 'Using the !php/const tag without a value is deprecated.'); + + return ''; + } + + $i = 0; + if (\defined($const = self::parseScalar(substr($scalar, 11), 0, null, $i, false))) { + return \constant($const); + } + + throw new ParseException(sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + if (self::$exceptionOnInvalidType) { + throw new ParseException(sprintf('The string "%s" could not be parsed as a constant. Did you forget to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + + return null; + case 0 === strpos($scalar, '!!float '): + return (float) substr($scalar, 8); + case 0 === strpos($scalar, '!!binary '): + return self::evaluateBinaryScalar(substr($scalar, 9)); + } + + throw new ParseException(sprintf('The string "%s" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename); + case preg_match('/^(?:\+|-)?0o(?P[0-7_]++)$/', $scalar, $matches): + $value = str_replace('_', '', $matches['value']); + + if ('-' === $scalar[0]) { + return -octdec($value); + } + + return octdec($value); + // Optimize for returning strings. + case \in_array($scalar[0], ['+', '-', '.'], true) || is_numeric($scalar[0]): + if (Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar)) { + $scalar = str_replace('_', '', $scalar); + } + + switch (true) { + case ctype_digit($scalar): + if (preg_match('/^0[0-7]+$/', $scalar)) { + trigger_deprecation('symfony/yaml', '5.1', 'Support for parsing numbers prefixed with 0 as octal numbers. They will be parsed as strings as of 6.0. Use "%s" to represent the octal number.', '0o'.substr($scalar, 1)); + + return octdec($scalar); + } + + $cast = (int) $scalar; + + return ($scalar === (string) $cast) ? $cast : $scalar; + case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)): + if (preg_match('/^-0[0-7]+$/', $scalar)) { + trigger_deprecation('symfony/yaml', '5.1', 'Support for parsing numbers prefixed with 0 as octal numbers. They will be parsed as strings as of 6.0. Use "%s" to represent the octal number.', '-0o'.substr($scalar, 2)); + + return -octdec(substr($scalar, 1)); + } + + $cast = (int) $scalar; + + return ($scalar === (string) $cast) ? $cast : $scalar; + case is_numeric($scalar): + case Parser::preg_match(self::getHexRegex(), $scalar): + $scalar = str_replace('_', '', $scalar); + + return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar; + case '.inf' === $scalarLower: + case '.nan' === $scalarLower: + return -log(0); + case '-.inf' === $scalarLower: + return log(0); + case Parser::preg_match('/^(-|\+)?[0-9][0-9_]*(\.[0-9_]+)?$/', $scalar): + return (float) str_replace('_', '', $scalar); + case Parser::preg_match(self::getTimestampRegex(), $scalar): + // When no timezone is provided in the parsed date, YAML spec says we must assume UTC. + $time = new \DateTime($scalar, new \DateTimeZone('UTC')); + + if (Yaml::PARSE_DATETIME & $flags) { + return $time; + } + + try { + if (false !== $scalar = $time->getTimestamp()) { + return $scalar; + } + } catch (\ValueError $e) { + // no-op + } + + return $time->format('U'); + } + } + + return (string) $scalar; + } + + private static function parseTag(string $value, int &$i, int $flags): ?string + { + if ('!' !== $value[$i]) { + return null; + } + + $tagLength = strcspn($value, " \t\n[]{},", $i + 1); + $tag = substr($value, $i + 1, $tagLength); + + $nextOffset = $i + $tagLength + 1; + $nextOffset += strspn($value, ' ', $nextOffset); + + if ('' === $tag && (!isset($value[$nextOffset]) || \in_array($value[$nextOffset], [']', '}', ','], true))) { + throw new ParseException('Using the unquoted scalar value "!" is not supported. You must quote it.', self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + + // Is followed by a scalar and is a built-in tag + if ('' !== $tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || 'str' === $tag || 'php/const' === $tag || 'php/object' === $tag)) { + // Manage in {@link self::evaluateScalar()} + return null; + } + + $i = $nextOffset; + + // Built-in tags + if ('' !== $tag && '!' === $tag[0]) { + throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + + if ('' !== $tag && !isset($value[$i])) { + throw new ParseException(sprintf('Missing value for tag "%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + + if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) { + return $tag; + } + + throw new ParseException(sprintf('Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename); + } + + public static function evaluateBinaryScalar(string $scalar): string + { + $parsedBinaryData = self::parseScalar(preg_replace('/\s/', '', $scalar)); + + if (0 !== (\strlen($parsedBinaryData) % 4)) { + throw new ParseException(sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', \strlen($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + + if (!Parser::preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) { + throw new ParseException(sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename); + } + + return base64_decode($parsedBinaryData, true); + } + + private static function isBinaryString(string $value): bool + { + return !preg_match('//u', $value) || preg_match('/[^\x00\x07-\x0d\x1B\x20-\xff]/', $value); + } + + /** + * Gets a regex that matches a YAML date. + * + * @see http://www.yaml.org/spec/1.2/spec.html#id2761573 + */ + private static function getTimestampRegex(): string + { + return <<[0-9][0-9][0-9][0-9]) + -(?P[0-9][0-9]?) + -(?P[0-9][0-9]?) + (?:(?:[Tt]|[ \t]+) + (?P[0-9][0-9]?) + :(?P[0-9][0-9]) + :(?P[0-9][0-9]) + (?:\.(?P[0-9]*))? + (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) + (?::(?P[0-9][0-9]))?))?)? + $~x +EOF; + } + + /** + * Gets a regex that matches a YAML number in hexadecimal notation. + */ + private static function getHexRegex(): string + { + return '~^0x[0-9a-f_]++$~i'; + } +} diff --git a/vendor/symfony/yaml/LICENSE b/vendor/symfony/yaml/LICENSE new file mode 100644 index 00000000..88bf75bb --- /dev/null +++ b/vendor/symfony/yaml/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2022 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/yaml/Parser.php b/vendor/symfony/yaml/Parser.php new file mode 100644 index 00000000..2701a441 --- /dev/null +++ b/vendor/symfony/yaml/Parser.php @@ -0,0 +1,1305 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Exception\ParseException; +use Symfony\Component\Yaml\Tag\TaggedValue; + +/** + * Parser parses YAML strings to convert them to PHP arrays. + * + * @author Fabien Potencier + * + * @final + */ +class Parser +{ + public const TAG_PATTERN = '(?P![\w!.\/:-]+)'; + public const BLOCK_SCALAR_HEADER_PATTERN = '(?P\||>)(?P\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P +#.*)?'; + public const REFERENCE_PATTERN = '#^&(?P[^ ]++) *+(?P.*)#u'; + + private $filename; + private $offset = 0; + private $numberOfParsedLines = 0; + private $totalNumberOfLines; + private $lines = []; + private $currentLineNb = -1; + private $currentLine = ''; + private $refs = []; + private $skippedLineNumbers = []; + private $locallySkippedLineNumbers = []; + private $refsBeingParsed = []; + + /** + * Parses a YAML file into a PHP value. + * + * @param string $filename The path to the YAML file to be parsed + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * + * @return mixed + * + * @throws ParseException If the file could not be read or the YAML is not valid + */ + public function parseFile(string $filename, int $flags = 0) + { + if (!is_file($filename)) { + throw new ParseException(sprintf('File "%s" does not exist.', $filename)); + } + + if (!is_readable($filename)) { + throw new ParseException(sprintf('File "%s" cannot be read.', $filename)); + } + + $this->filename = $filename; + + try { + return $this->parse(file_get_contents($filename), $flags); + } finally { + $this->filename = null; + } + } + + /** + * Parses a YAML string to a PHP value. + * + * @param string $value A YAML string + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * + * @return mixed + * + * @throws ParseException If the YAML is not valid + */ + public function parse(string $value, int $flags = 0) + { + if (false === preg_match('//u', $value)) { + throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename); + } + + $this->refs = []; + + $mbEncoding = null; + + if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('UTF-8'); + } + + try { + $data = $this->doParse($value, $flags); + } finally { + if (null !== $mbEncoding) { + mb_internal_encoding($mbEncoding); + } + $this->refsBeingParsed = []; + $this->offset = 0; + $this->lines = []; + $this->currentLine = ''; + $this->numberOfParsedLines = 0; + $this->refs = []; + $this->skippedLineNumbers = []; + $this->locallySkippedLineNumbers = []; + $this->totalNumberOfLines = null; + } + + return $data; + } + + private function doParse(string $value, int $flags) + { + $this->currentLineNb = -1; + $this->currentLine = ''; + $value = $this->cleanup($value); + $this->lines = explode("\n", $value); + $this->numberOfParsedLines = \count($this->lines); + $this->locallySkippedLineNumbers = []; + + if (null === $this->totalNumberOfLines) { + $this->totalNumberOfLines = $this->numberOfParsedLines; + } + + if (!$this->moveToNextLine()) { + return null; + } + + $data = []; + $context = null; + $allowOverwrite = false; + + while ($this->isCurrentLineEmpty()) { + if (!$this->moveToNextLine()) { + return null; + } + } + + // Resolves the tag and returns if end of the document + if (null !== ($tag = $this->getLineTag($this->currentLine, $flags, false)) && !$this->moveToNextLine()) { + return new TaggedValue($tag, ''); + } + + do { + if ($this->isCurrentLineEmpty()) { + continue; + } + + // tab? + if ("\t" === $this->currentLine[0]) { + throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename); + + $isRef = $mergeNode = false; + if ('-' === $this->currentLine[0] && self::preg_match('#^\-((?P\s+)(?P.+))?$#u', rtrim($this->currentLine), $values)) { + if ($context && 'mapping' == $context) { + throw new ParseException('You cannot define a sequence item when in a mapping.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + $context = 'sequence'; + + if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) { + $isRef = $matches['ref']; + $this->refsBeingParsed[] = $isRef; + $values['value'] = $matches['value']; + } + + if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) { + throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + + // array + if (isset($values['value']) && 0 === strpos(ltrim($values['value'], ' '), '-')) { + // Inline first child + $currentLineNumber = $this->getRealCurrentLineNb(); + + $sequenceIndentation = \strlen($values['leadspaces']) + 1; + $sequenceYaml = substr($this->currentLine, $sequenceIndentation); + $sequenceYaml .= "\n".$this->getNextEmbedBlock($sequenceIndentation, true); + + $data[] = $this->parseBlock($currentLineNumber, rtrim($sequenceYaml), $flags); + } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { + $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true) ?? '', $flags); + } elseif (null !== $subTag = $this->getLineTag(ltrim($values['value'], ' '), $flags)) { + $data[] = new TaggedValue( + $subTag, + $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags) + ); + } else { + if ( + isset($values['leadspaces']) + && ( + '!' === $values['value'][0] + || self::preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P.+?))?\s*$#u', $this->trimTag($values['value']), $matches) + ) + ) { + // this is a compact notation element, add to next block and parse + $block = $values['value']; + if ($this->isNextLineIndented()) { + $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + \strlen($values['leadspaces']) + 1); + } + + $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags); + } else { + $data[] = $this->parseValue($values['value'], $flags, $context); + } + } + if ($isRef) { + $this->refs[$isRef] = end($data); + array_pop($this->refsBeingParsed); + } + } elseif ( + self::preg_match('#^(?P(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(( |\t)++(?P.+))?$#u', rtrim($this->currentLine), $values) + && (false === strpos($values['key'], ' #') || \in_array($values['key'][0], ['"', "'"])) + ) { + if ($context && 'sequence' == $context) { + throw new ParseException('You cannot define a mapping item when in a sequence.', $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + $context = 'mapping'; + + try { + $key = Inline::parseScalar($values['key']); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + + if (!\is_string($key) && !\is_int($key)) { + throw new ParseException((is_numeric($key) ? 'Numeric' : 'Non-string').' keys are not supported. Quote your evaluable mapping keys instead.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + + // Convert float keys to strings, to avoid being converted to integers by PHP + if (\is_float($key)) { + $key = (string) $key; + } + + if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P[^ ]+)#u', $values['value'], $refMatches))) { + $mergeNode = true; + $allowOverwrite = true; + if (isset($values['value'][0]) && '*' === $values['value'][0]) { + $refName = substr(rtrim($values['value']), 1); + if (!\array_key_exists($refName, $this->refs)) { + if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) { + throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$refName])), $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + + throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + $refValue = $this->refs[$refName]; + + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $refValue instanceof \stdClass) { + $refValue = (array) $refValue; + } + + if (!\is_array($refValue)) { + throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + $data += $refValue; // array union + } else { + if (isset($values['value']) && '' !== $values['value']) { + $value = $values['value']; + } else { + $value = $this->getNextEmbedBlock(); + } + $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags); + + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsed instanceof \stdClass) { + $parsed = (array) $parsed; + } + + if (!\is_array($parsed)) { + throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + if (isset($parsed[0])) { + // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes + // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier + // in the sequence override keys specified in later mapping nodes. + foreach ($parsed as $parsedItem) { + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsedItem instanceof \stdClass) { + $parsedItem = (array) $parsedItem; + } + + if (!\is_array($parsedItem)) { + throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename); + } + + $data += $parsedItem; // array union + } + } else { + // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the + // current mapping, unless the key already exists in it. + $data += $parsed; // array union + } + } + } elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) { + $isRef = $matches['ref']; + $this->refsBeingParsed[] = $isRef; + $values['value'] = $matches['value']; + } + + $subTag = null; + if ($mergeNode) { + // Merge keys + } elseif (!isset($values['value']) || '' === $values['value'] || 0 === strpos($values['value'], '#') || (null !== $subTag = $this->getLineTag($values['value'], $flags)) || '<<' === $key) { + // hash + // if next line is less indented or equal, then it means that the current value is null + if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) { + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if ($allowOverwrite || !isset($data[$key])) { + if (null !== $subTag) { + $data[$key] = new TaggedValue($subTag, ''); + } else { + $data[$key] = null; + } + } else { + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + } else { + // remember the parsed line number here in case we need it to provide some contexts in error messages below + $realCurrentLineNbKey = $this->getRealCurrentLineNb(); + $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags); + if ('<<' === $key) { + $this->refs[$refMatches['ref']] = $value; + + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $value instanceof \stdClass) { + $value = (array) $value; + } + + $data += $value; + } elseif ($allowOverwrite || !isset($data[$key])) { + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if (null !== $subTag) { + $data[$key] = new TaggedValue($subTag, $value); + } else { + $data[$key] = $value; + } + } else { + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine); + } + } + } else { + $value = $this->parseValue(rtrim($values['value']), $flags, $context); + // Spec: Keys MUST be unique; first one wins. + // But overwriting is allowed when a merge node is used in current block. + if ($allowOverwrite || !isset($data[$key])) { + $data[$key] = $value; + } else { + throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + } + if ($isRef) { + $this->refs[$isRef] = $data[$key]; + array_pop($this->refsBeingParsed); + } + } elseif ('"' === $this->currentLine[0] || "'" === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + try { + return Inline::parse($this->lexInlineQuotedString(), $flags, $this->refs); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + } elseif ('{' === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + try { + $parsedMapping = Inline::parse($this->lexInlineMapping(), $flags, $this->refs); + + while ($this->moveToNextLine()) { + if (!$this->isCurrentLineEmpty()) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } + + return $parsedMapping; + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + } elseif ('[' === $this->currentLine[0]) { + if (null !== $context) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + try { + $parsedSequence = Inline::parse($this->lexInlineSequence(), $flags, $this->refs); + + while ($this->moveToNextLine()) { + if (!$this->isCurrentLineEmpty()) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } + + return $parsedSequence; + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + } else { + // multiple documents are not supported + if ('---' === $this->currentLine) { + throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + + if ($deprecatedUsage = (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1])) { + throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine); + } + + // 1-liner optionally followed by newline(s) + if (\is_string($value) && $this->lines[0] === trim($value)) { + try { + $value = Inline::parse($this->lines[0], $flags, $this->refs); + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + + return $value; + } + + // try to parse the value as a multi-line string as a last resort + if (0 === $this->currentLineNb) { + $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = false; + $value = ''; + + foreach ($this->lines as $line) { + $trimmedLine = trim($line); + if ('#' === ($trimmedLine[0] ?? '')) { + continue; + } + // If the indentation is not consistent at offset 0, it is to be considered as a ParseError + if (0 === $this->offset && !$deprecatedUsage && isset($line[0]) && ' ' === $line[0]) { + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + if (false !== strpos($line, ': ')) { + throw new ParseException('Mapping values are not allowed in multi-line blocks.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + + if ('' === $trimmedLine) { + $value .= "\n"; + } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) { + $value .= ' '; + } + + if ('' !== $trimmedLine && '\\' === substr($line, -1)) { + $value .= ltrim(substr($line, 0, -1)); + } elseif ('' !== $trimmedLine) { + $value .= $trimmedLine; + } + + if ('' === $trimmedLine) { + $previousLineWasNewline = true; + $previousLineWasTerminatedWithBackslash = false; + } elseif ('\\' === substr($line, -1)) { + $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = true; + } else { + $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = false; + } + } + + try { + return Inline::parse(trim($value)); + } catch (ParseException $e) { + // fall-through to the ParseException thrown below + } + } + + throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } while ($this->moveToNextLine()); + + if (null !== $tag) { + $data = new TaggedValue($tag, $data); + } + + if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && 'mapping' === $context && !\is_object($data)) { + $object = new \stdClass(); + + foreach ($data as $key => $value) { + $object->$key = $value; + } + + $data = $object; + } + + return empty($data) ? null : $data; + } + + private function parseBlock(int $offset, string $yaml, int $flags) + { + $skippedLineNumbers = $this->skippedLineNumbers; + + foreach ($this->locallySkippedLineNumbers as $lineNumber) { + if ($lineNumber < $offset) { + continue; + } + + $skippedLineNumbers[] = $lineNumber; + } + + $parser = new self(); + $parser->offset = $offset; + $parser->totalNumberOfLines = $this->totalNumberOfLines; + $parser->skippedLineNumbers = $skippedLineNumbers; + $parser->refs = &$this->refs; + $parser->refsBeingParsed = $this->refsBeingParsed; + + return $parser->doParse($yaml, $flags); + } + + /** + * Returns the current line number (takes the offset into account). + * + * @internal + */ + public function getRealCurrentLineNb(): int + { + $realCurrentLineNumber = $this->currentLineNb + $this->offset; + + foreach ($this->skippedLineNumbers as $skippedLineNumber) { + if ($skippedLineNumber > $realCurrentLineNumber) { + break; + } + + ++$realCurrentLineNumber; + } + + return $realCurrentLineNumber; + } + + /** + * Returns the current line indentation. + */ + private function getCurrentLineIndentation(): int + { + if (' ' !== ($this->currentLine[0] ?? '')) { + return 0; + } + + return \strlen($this->currentLine) - \strlen(ltrim($this->currentLine, ' ')); + } + + /** + * Returns the next embed block of YAML. + * + * @param int|null $indentation The indent level at which the block is to be read, or null for default + * @param bool $inSequence True if the enclosing data structure is a sequence + * + * @throws ParseException When indentation problem are detected + */ + private function getNextEmbedBlock(int $indentation = null, bool $inSequence = false): string + { + $oldLineIndentation = $this->getCurrentLineIndentation(); + + if (!$this->moveToNextLine()) { + return ''; + } + + if (null === $indentation) { + $newIndent = null; + $movements = 0; + + do { + $EOF = false; + + // empty and comment-like lines do not influence the indentation depth + if ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) { + $EOF = !$this->moveToNextLine(); + + if (!$EOF) { + ++$movements; + } + } else { + $newIndent = $this->getCurrentLineIndentation(); + } + } while (!$EOF && null === $newIndent); + + for ($i = 0; $i < $movements; ++$i) { + $this->moveToPreviousLine(); + } + + $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem(); + + if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) { + throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } else { + $newIndent = $indentation; + } + + $data = []; + + if ($this->getCurrentLineIndentation() >= $newIndent) { + $data[] = substr($this->currentLine, $newIndent ?? 0); + } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) { + $data[] = $this->currentLine; + } else { + $this->moveToPreviousLine(); + + return ''; + } + + if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) { + // the previous line contained a dash but no item content, this line is a sequence item with the same indentation + // and therefore no nested list or mapping + $this->moveToPreviousLine(); + + return ''; + } + + $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem(); + $isItComment = $this->isCurrentLineComment(); + + while ($this->moveToNextLine()) { + if ($isItComment && !$isItUnindentedCollection) { + $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem(); + $isItComment = $this->isCurrentLineComment(); + } + + $indent = $this->getCurrentLineIndentation(); + + if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) { + $this->moveToPreviousLine(); + break; + } + + if ($this->isCurrentLineBlank()) { + $data[] = substr($this->currentLine, $newIndent); + continue; + } + + if ($indent >= $newIndent) { + $data[] = substr($this->currentLine, $newIndent); + } elseif ($this->isCurrentLineComment()) { + $data[] = $this->currentLine; + } elseif (0 == $indent) { + $this->moveToPreviousLine(); + + break; + } else { + throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename); + } + } + + return implode("\n", $data); + } + + private function hasMoreLines(): bool + { + return (\count($this->lines) - 1) > $this->currentLineNb; + } + + /** + * Moves the parser to the next line. + */ + private function moveToNextLine(): bool + { + if ($this->currentLineNb >= $this->numberOfParsedLines - 1) { + return false; + } + + $this->currentLine = $this->lines[++$this->currentLineNb]; + + return true; + } + + /** + * Moves the parser to the previous line. + */ + private function moveToPreviousLine(): bool + { + if ($this->currentLineNb < 1) { + return false; + } + + $this->currentLine = $this->lines[--$this->currentLineNb]; + + return true; + } + + /** + * Parses a YAML value. + * + * @param string $value A YAML value + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * @param string $context The parser context (either sequence or mapping) + * + * @return mixed + * + * @throws ParseException When reference does not exist + */ + private function parseValue(string $value, int $flags, string $context) + { + if (0 === strpos($value, '*')) { + if (false !== $pos = strpos($value, '#')) { + $value = substr($value, 1, $pos - 2); + } else { + $value = substr($value, 1); + } + + if (!\array_key_exists($value, $this->refs)) { + if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) { + throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$value])), $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + + throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename); + } + + return $this->refs[$value]; + } + + if (\in_array($value[0], ['!', '|', '>'], true) && self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) { + $modifiers = $matches['modifiers'] ?? ''; + + $data = $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), abs((int) $modifiers)); + + if ('' !== $matches['tag'] && '!' !== $matches['tag']) { + if ('!!binary' === $matches['tag']) { + return Inline::evaluateBinaryScalar($data); + } + + return new TaggedValue(substr($matches['tag'], 1), $data); + } + + return $data; + } + + try { + if ('' !== $value && '{' === $value[0]) { + $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value)); + + return Inline::parse($this->lexInlineMapping($cursor), $flags, $this->refs); + } elseif ('' !== $value && '[' === $value[0]) { + $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value)); + + return Inline::parse($this->lexInlineSequence($cursor), $flags, $this->refs); + } + + switch ($value[0] ?? '') { + case '"': + case "'": + $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value)); + $parsedValue = Inline::parse($this->lexInlineQuotedString($cursor), $flags, $this->refs); + + if (isset($this->currentLine[$cursor]) && preg_replace('/\s*(#.*)?$/A', '', substr($this->currentLine, $cursor))) { + throw new ParseException(sprintf('Unexpected characters near "%s".', substr($this->currentLine, $cursor))); + } + + return $parsedValue; + default: + $lines = []; + + while ($this->moveToNextLine()) { + // unquoted strings end before the first unindented line + if (0 === $this->getCurrentLineIndentation()) { + $this->moveToPreviousLine(); + + break; + } + + $lines[] = trim($this->currentLine); + } + + for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) { + if ('' === $lines[$i]) { + $value .= "\n"; + $previousLineBlank = true; + } elseif ($previousLineBlank) { + $value .= $lines[$i]; + $previousLineBlank = false; + } else { + $value .= ' '.$lines[$i]; + $previousLineBlank = false; + } + } + + Inline::$parsedLineNumber = $this->getRealCurrentLineNb(); + + $parsedValue = Inline::parse($value, $flags, $this->refs); + + if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) { + throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename); + } + + return $parsedValue; + } + } catch (ParseException $e) { + $e->setParsedLine($this->getRealCurrentLineNb() + 1); + $e->setSnippet($this->currentLine); + + throw $e; + } + } + + /** + * Parses a block scalar. + * + * @param string $style The style indicator that was used to begin this block scalar (| or >) + * @param string $chomping The chomping indicator that was used to begin this block scalar (+ or -) + * @param int $indentation The indentation indicator that was used to begin this block scalar + */ + private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0): string + { + $notEOF = $this->moveToNextLine(); + if (!$notEOF) { + return ''; + } + + $isCurrentLineBlank = $this->isCurrentLineBlank(); + $blockLines = []; + + // leading blank lines are consumed before determining indentation + while ($notEOF && $isCurrentLineBlank) { + // newline only if not EOF + if ($notEOF = $this->moveToNextLine()) { + $blockLines[] = ''; + $isCurrentLineBlank = $this->isCurrentLineBlank(); + } + } + + // determine indentation if not specified + if (0 === $indentation) { + $currentLineLength = \strlen($this->currentLine); + + for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) { + ++$indentation; + } + } + + if ($indentation > 0) { + $pattern = sprintf('/^ {%d}(.*)$/', $indentation); + + while ( + $notEOF && ( + $isCurrentLineBlank || + self::preg_match($pattern, $this->currentLine, $matches) + ) + ) { + if ($isCurrentLineBlank && \strlen($this->currentLine) > $indentation) { + $blockLines[] = substr($this->currentLine, $indentation); + } elseif ($isCurrentLineBlank) { + $blockLines[] = ''; + } else { + $blockLines[] = $matches[1]; + } + + // newline only if not EOF + if ($notEOF = $this->moveToNextLine()) { + $isCurrentLineBlank = $this->isCurrentLineBlank(); + } + } + } elseif ($notEOF) { + $blockLines[] = ''; + } + + if ($notEOF) { + $blockLines[] = ''; + $this->moveToPreviousLine(); + } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) { + $blockLines[] = ''; + } + + // folded style + if ('>' === $style) { + $text = ''; + $previousLineIndented = false; + $previousLineBlank = false; + + for ($i = 0, $blockLinesCount = \count($blockLines); $i < $blockLinesCount; ++$i) { + if ('' === $blockLines[$i]) { + $text .= "\n"; + $previousLineIndented = false; + $previousLineBlank = true; + } elseif (' ' === $blockLines[$i][0]) { + $text .= "\n".$blockLines[$i]; + $previousLineIndented = true; + $previousLineBlank = false; + } elseif ($previousLineIndented) { + $text .= "\n".$blockLines[$i]; + $previousLineIndented = false; + $previousLineBlank = false; + } elseif ($previousLineBlank || 0 === $i) { + $text .= $blockLines[$i]; + $previousLineIndented = false; + $previousLineBlank = false; + } else { + $text .= ' '.$blockLines[$i]; + $previousLineIndented = false; + $previousLineBlank = false; + } + } + } else { + $text = implode("\n", $blockLines); + } + + // deal with trailing newlines + if ('' === $chomping) { + $text = preg_replace('/\n+$/', "\n", $text); + } elseif ('-' === $chomping) { + $text = preg_replace('/\n+$/', '', $text); + } + + return $text; + } + + /** + * Returns true if the next line is indented. + */ + private function isNextLineIndented(): bool + { + $currentIndentation = $this->getCurrentLineIndentation(); + $movements = 0; + + do { + $EOF = !$this->moveToNextLine(); + + if (!$EOF) { + ++$movements; + } + } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment())); + + if ($EOF) { + return false; + } + + $ret = $this->getCurrentLineIndentation() > $currentIndentation; + + for ($i = 0; $i < $movements; ++$i) { + $this->moveToPreviousLine(); + } + + return $ret; + } + + /** + * Returns true if the current line is blank or if it is a comment line. + */ + private function isCurrentLineEmpty(): bool + { + return $this->isCurrentLineBlank() || $this->isCurrentLineComment(); + } + + /** + * Returns true if the current line is blank. + */ + private function isCurrentLineBlank(): bool + { + return '' === $this->currentLine || '' === trim($this->currentLine, ' '); + } + + /** + * Returns true if the current line is a comment line. + */ + private function isCurrentLineComment(): bool + { + //checking explicitly the first char of the trim is faster than loops or strpos + $ltrimmedLine = '' !== $this->currentLine && ' ' === $this->currentLine[0] ? ltrim($this->currentLine, ' ') : $this->currentLine; + + return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0]; + } + + private function isCurrentLineLastLineInDocument(): bool + { + return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1); + } + + /** + * Cleanups a YAML string to be parsed. + * + * @param string $value The input YAML string + */ + private function cleanup(string $value): string + { + $value = str_replace(["\r\n", "\r"], "\n", $value); + + // strip YAML header + $count = 0; + $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count); + $this->offset += $count; + + // remove leading comments + $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count); + if (1 === $count) { + // items have been removed, update the offset + $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); + $value = $trimmedValue; + } + + // remove start of the document marker (---) + $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count); + if (1 === $count) { + // items have been removed, update the offset + $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); + $value = $trimmedValue; + + // remove end of the document marker (...) + $value = preg_replace('#\.\.\.\s*$#', '', $value); + } + + return $value; + } + + /** + * Returns true if the next line starts unindented collection. + */ + private function isNextLineUnIndentedCollection(): bool + { + $currentIndentation = $this->getCurrentLineIndentation(); + $movements = 0; + + do { + $EOF = !$this->moveToNextLine(); + + if (!$EOF) { + ++$movements; + } + } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment())); + + if ($EOF) { + return false; + } + + $ret = $this->getCurrentLineIndentation() === $currentIndentation && $this->isStringUnIndentedCollectionItem(); + + for ($i = 0; $i < $movements; ++$i) { + $this->moveToPreviousLine(); + } + + return $ret; + } + + /** + * Returns true if the string is un-indented collection item. + */ + private function isStringUnIndentedCollectionItem(): bool + { + return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- '); + } + + /** + * A local wrapper for "preg_match" which will throw a ParseException if there + * is an internal error in the PCRE engine. + * + * This avoids us needing to check for "false" every time PCRE is used + * in the YAML engine + * + * @throws ParseException on a PCRE internal error + * + * @see preg_last_error() + * + * @internal + */ + public static function preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int + { + if (false === $ret = preg_match($pattern, $subject, $matches, $flags, $offset)) { + switch (preg_last_error()) { + case \PREG_INTERNAL_ERROR: + $error = 'Internal PCRE error.'; + break; + case \PREG_BACKTRACK_LIMIT_ERROR: + $error = 'pcre.backtrack_limit reached.'; + break; + case \PREG_RECURSION_LIMIT_ERROR: + $error = 'pcre.recursion_limit reached.'; + break; + case \PREG_BAD_UTF8_ERROR: + $error = 'Malformed UTF-8 data.'; + break; + case \PREG_BAD_UTF8_OFFSET_ERROR: + $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.'; + break; + default: + $error = 'Error.'; + } + + throw new ParseException($error); + } + + return $ret; + } + + /** + * Trim the tag on top of the value. + * + * Prevent values such as "!foo {quz: bar}" to be considered as + * a mapping block. + */ + private function trimTag(string $value): string + { + if ('!' === $value[0]) { + return ltrim(substr($value, 1, strcspn($value, " \r\n", 1)), ' '); + } + + return $value; + } + + private function getLineTag(string $value, int $flags, bool $nextLineCheck = true): ?string + { + if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^'.self::TAG_PATTERN.' *( +#.*)?$/', $value, $matches)) { + return null; + } + + if ($nextLineCheck && !$this->isNextLineIndented()) { + return null; + } + + $tag = substr($matches['tag'], 1); + + // Built-in tags + if ($tag && '!' === $tag[0]) { + throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), $this->getRealCurrentLineNb() + 1, $value, $this->filename); + } + + if (Yaml::PARSE_CUSTOM_TAGS & $flags) { + return $tag; + } + + throw new ParseException(sprintf('Tags support is not enabled. You must use the flag "Yaml::PARSE_CUSTOM_TAGS" to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename); + } + + private function lexInlineQuotedString(int &$cursor = 0): string + { + $quotation = $this->currentLine[$cursor]; + $value = $quotation; + ++$cursor; + + $previousLineWasNewline = true; + $previousLineWasTerminatedWithBackslash = false; + $lineNumber = 0; + + do { + if (++$lineNumber > 1) { + $cursor += strspn($this->currentLine, ' ', $cursor); + } + + if ($this->isCurrentLineBlank()) { + $value .= "\n"; + } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) { + $value .= ' '; + } + + for (; \strlen($this->currentLine) > $cursor; ++$cursor) { + switch ($this->currentLine[$cursor]) { + case '\\': + if ("'" === $quotation) { + $value .= '\\'; + } elseif (isset($this->currentLine[++$cursor])) { + $value .= '\\'.$this->currentLine[$cursor]; + } + + break; + case $quotation: + ++$cursor; + + if ("'" === $quotation && isset($this->currentLine[$cursor]) && "'" === $this->currentLine[$cursor]) { + $value .= "''"; + break; + } + + return $value.$quotation; + default: + $value .= $this->currentLine[$cursor]; + } + } + + if ($this->isCurrentLineBlank()) { + $previousLineWasNewline = true; + $previousLineWasTerminatedWithBackslash = false; + } elseif ('\\' === $this->currentLine[-1]) { + $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = true; + } else { + $previousLineWasNewline = false; + $previousLineWasTerminatedWithBackslash = false; + } + + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); + + throw new ParseException('Malformed inline YAML string.'); + } + + private function lexUnquotedString(int &$cursor): string + { + $offset = $cursor; + $cursor += strcspn($this->currentLine, '[]{},: ', $cursor); + + if ($cursor === $offset) { + throw new ParseException('Malformed unquoted YAML string.'); + } + + return substr($this->currentLine, $offset, $cursor - $offset); + } + + private function lexInlineMapping(int &$cursor = 0): string + { + return $this->lexInlineStructure($cursor, '}'); + } + + private function lexInlineSequence(int &$cursor = 0): string + { + return $this->lexInlineStructure($cursor, ']'); + } + + private function lexInlineStructure(int &$cursor, string $closingTag): string + { + $value = $this->currentLine[$cursor]; + ++$cursor; + + do { + $this->consumeWhitespaces($cursor); + + while (isset($this->currentLine[$cursor])) { + switch ($this->currentLine[$cursor]) { + case '"': + case "'": + $value .= $this->lexInlineQuotedString($cursor); + break; + case ':': + case ',': + $value .= $this->currentLine[$cursor]; + ++$cursor; + break; + case '{': + $value .= $this->lexInlineMapping($cursor); + break; + case '[': + $value .= $this->lexInlineSequence($cursor); + break; + case $closingTag: + $value .= $this->currentLine[$cursor]; + ++$cursor; + + return $value; + case '#': + break 2; + default: + $value .= $this->lexUnquotedString($cursor); + } + + if ($this->consumeWhitespaces($cursor)) { + $value .= ' '; + } + } + + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); + + throw new ParseException('Malformed inline YAML string.'); + } + + private function consumeWhitespaces(int &$cursor): bool + { + $whitespacesConsumed = 0; + + do { + $whitespaceOnlyTokenLength = strspn($this->currentLine, ' ', $cursor); + $whitespacesConsumed += $whitespaceOnlyTokenLength; + $cursor += $whitespaceOnlyTokenLength; + + if (isset($this->currentLine[$cursor])) { + return 0 < $whitespacesConsumed; + } + + if ($this->hasMoreLines()) { + $cursor = 0; + } + } while ($this->moveToNextLine()); + + return 0 < $whitespacesConsumed; + } +} diff --git a/vendor/symfony/yaml/README.md b/vendor/symfony/yaml/README.md new file mode 100644 index 00000000..ac25024b --- /dev/null +++ b/vendor/symfony/yaml/README.md @@ -0,0 +1,13 @@ +Yaml Component +============== + +The Yaml component loads and dumps YAML files. + +Resources +--------- + + * [Documentation](https://symfony.com/doc/current/components/yaml.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/yaml/Resources/bin/yaml-lint b/vendor/symfony/yaml/Resources/bin/yaml-lint new file mode 100755 index 00000000..0ad73d71 --- /dev/null +++ b/vendor/symfony/yaml/Resources/bin/yaml-lint @@ -0,0 +1,45 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Runs the Yaml lint command. + * + * @author Jan Schädlich + */ + +use Symfony\Component\Console\Application; +use Symfony\Component\Yaml\Command\LintCommand; + +function includeIfExists(string $file): bool +{ + return file_exists($file) && include $file; +} + +if ( + !includeIfExists(__DIR__ . '/../../../../autoload.php') && + !includeIfExists(__DIR__ . '/../../vendor/autoload.php') && + !includeIfExists(__DIR__ . '/../../../../../../vendor/autoload.php') +) { + fwrite(STDERR, 'Install dependencies using Composer.'.PHP_EOL); + exit(1); +} + +if (!class_exists(Application::class)) { + fwrite(STDERR, 'You need the "symfony/console" component in order to run the Yaml linter.'.PHP_EOL); + exit(1); +} + +(new Application())->add($command = new LintCommand()) + ->getApplication() + ->setDefaultCommand($command->getName(), true) + ->run() +; diff --git a/vendor/symfony/yaml/Tag/TaggedValue.php b/vendor/symfony/yaml/Tag/TaggedValue.php new file mode 100644 index 00000000..4ea34061 --- /dev/null +++ b/vendor/symfony/yaml/Tag/TaggedValue.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml\Tag; + +/** + * @author Nicolas Grekas + * @author Guilhem N. + */ +final class TaggedValue +{ + private $tag; + private $value; + + public function __construct(string $tag, $value) + { + $this->tag = $tag; + $this->value = $value; + } + + public function getTag(): string + { + return $this->tag; + } + + public function getValue() + { + return $this->value; + } +} diff --git a/vendor/symfony/yaml/Unescaper.php b/vendor/symfony/yaml/Unescaper.php new file mode 100644 index 00000000..d1ef0412 --- /dev/null +++ b/vendor/symfony/yaml/Unescaper.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Exception\ParseException; + +/** + * Unescaper encapsulates unescaping rules for single and double-quoted + * YAML strings. + * + * @author Matthew Lewinski + * + * @internal + */ +class Unescaper +{ + /** + * Regex fragment that matches an escaped character in a double quoted string. + */ + public const REGEX_ESCAPED_CHARACTER = '\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)'; + + /** + * Unescapes a single quoted string. + * + * @param string $value A single quoted string + */ + public function unescapeSingleQuotedString(string $value): string + { + return str_replace('\'\'', '\'', $value); + } + + /** + * Unescapes a double quoted string. + * + * @param string $value A double quoted string + */ + public function unescapeDoubleQuotedString(string $value): string + { + $callback = function ($match) { + return $this->unescapeCharacter($match[0]); + }; + + // evaluate the string + return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value); + } + + /** + * Unescapes a character that was found in a double-quoted string. + * + * @param string $value An escaped character + */ + private function unescapeCharacter(string $value): string + { + switch ($value[1]) { + case '0': + return "\x0"; + case 'a': + return "\x7"; + case 'b': + return "\x8"; + case 't': + return "\t"; + case "\t": + return "\t"; + case 'n': + return "\n"; + case 'v': + return "\xB"; + case 'f': + return "\xC"; + case 'r': + return "\r"; + case 'e': + return "\x1B"; + case ' ': + return ' '; + case '"': + return '"'; + case '/': + return '/'; + case '\\': + return '\\'; + case 'N': + // U+0085 NEXT LINE + return "\xC2\x85"; + case '_': + // U+00A0 NO-BREAK SPACE + return "\xC2\xA0"; + case 'L': + // U+2028 LINE SEPARATOR + return "\xE2\x80\xA8"; + case 'P': + // U+2029 PARAGRAPH SEPARATOR + return "\xE2\x80\xA9"; + case 'x': + return self::utf8chr(hexdec(substr($value, 2, 2))); + case 'u': + return self::utf8chr(hexdec(substr($value, 2, 4))); + case 'U': + return self::utf8chr(hexdec(substr($value, 2, 8))); + default: + throw new ParseException(sprintf('Found unknown escape character "%s".', $value)); + } + } + + /** + * Get the UTF-8 character for the given code point. + */ + private static function utf8chr(int $c): string + { + if (0x80 > $c %= 0x200000) { + return \chr($c); + } + if (0x800 > $c) { + return \chr(0xC0 | $c >> 6).\chr(0x80 | $c & 0x3F); + } + if (0x10000 > $c) { + return \chr(0xE0 | $c >> 12).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F); + } + + return \chr(0xF0 | $c >> 18).\chr(0x80 | $c >> 12 & 0x3F).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F); + } +} diff --git a/vendor/symfony/yaml/Yaml.php b/vendor/symfony/yaml/Yaml.php new file mode 100644 index 00000000..ea130452 --- /dev/null +++ b/vendor/symfony/yaml/Yaml.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Yaml; + +use Symfony\Component\Yaml\Exception\ParseException; + +/** + * Yaml offers convenience methods to load and dump YAML. + * + * @author Fabien Potencier + * + * @final + */ +class Yaml +{ + public const DUMP_OBJECT = 1; + public const PARSE_EXCEPTION_ON_INVALID_TYPE = 2; + public const PARSE_OBJECT = 4; + public const PARSE_OBJECT_FOR_MAP = 8; + public const DUMP_EXCEPTION_ON_INVALID_TYPE = 16; + public const PARSE_DATETIME = 32; + public const DUMP_OBJECT_AS_MAP = 64; + public const DUMP_MULTI_LINE_LITERAL_BLOCK = 128; + public const PARSE_CONSTANT = 256; + public const PARSE_CUSTOM_TAGS = 512; + public const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024; + public const DUMP_NULL_AS_TILDE = 2048; + + /** + * Parses a YAML file into a PHP value. + * + * Usage: + * + * $array = Yaml::parseFile('config.yml'); + * print_r($array); + * + * @param string $filename The path to the YAML file to be parsed + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * + * @return mixed + * + * @throws ParseException If the file could not be read or the YAML is not valid + */ + public static function parseFile(string $filename, int $flags = 0) + { + $yaml = new Parser(); + + return $yaml->parseFile($filename, $flags); + } + + /** + * Parses YAML into a PHP value. + * + * Usage: + * + * $array = Yaml::parse(file_get_contents('config.yml')); + * print_r($array); + * + * + * @param string $input A string containing YAML + * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior + * + * @return mixed + * + * @throws ParseException If the YAML is not valid + */ + public static function parse(string $input, int $flags = 0) + { + $yaml = new Parser(); + + return $yaml->parse($input, $flags); + } + + /** + * Dumps a PHP value to a YAML string. + * + * The dump method, when supplied with an array, will do its best + * to convert the array into friendly YAML. + * + * @param mixed $input The PHP value + * @param int $inline The level where you switch to inline YAML + * @param int $indent The amount of spaces to use for indentation of nested nodes + * @param int $flags A bit field of DUMP_* constants to customize the dumped YAML string + */ + public static function dump($input, int $inline = 2, int $indent = 4, int $flags = 0): string + { + $yaml = new Dumper($indent); + + return $yaml->dump($input, $inline, 0, $flags); + } +} diff --git a/vendor/symfony/yaml/composer.json b/vendor/symfony/yaml/composer.json new file mode 100644 index 00000000..7fa6e2cc --- /dev/null +++ b/vendor/symfony/yaml/composer.json @@ -0,0 +1,42 @@ +{ + "name": "symfony/yaml", + "type": "library", + "description": "Loads and dumps YAML files", + "keywords": [], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "autoload": { + "psr-4": { "Symfony\\Component\\Yaml\\": "" }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "minimum-stability": "dev" +}