2018-05-09 08:05:17 -05:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Providers;
|
|
|
|
|
Implement OS specific information discovery (#11446)
* Implement OS specific information discovery
That way it doesn't have to be fetched during polling
Also improve discovery process, os is only detected once, in the core module.
EXA is the test os, a couple improvements there.
* Use local variable, then unset it so we don't pollute.
* fix style issues
* test and other fixes
* attribute update fixes
* Update exa data, need new source data
* null missing "os" values
* fix ftos odd character
* fix ftos odd character
* only null for new style or we will reset to null every discovery
* Move device observer to own class
* Handle location, relocate event logging
* update exa e7-2 data
* update ird test data, apparently unicode is now working.
* update Linux ntc, now uses correct icon
* Only load all os on the web, also, we can't load existing the the database isn't connected.
* only for devices that have a location
* revert ftos test data apparently
* revert ird
2020-05-14 11:27:59 -05:00
|
|
|
use App\Models\Sensor;
|
2018-09-24 02:07:00 -05:00
|
|
|
use Illuminate\Database\Eloquent\Relations\Relation;
|
2018-05-09 08:05:17 -05:00
|
|
|
use Illuminate\Support\Facades\Blade;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
use Illuminate\Support\ServiceProvider;
|
2020-10-28 16:07:03 -05:00
|
|
|
use LibreNMS\Cache\PermissionsCache;
|
2018-05-09 08:05:17 -05:00
|
|
|
use LibreNMS\Config;
|
2019-01-25 15:30:58 -06:00
|
|
|
use LibreNMS\Util\IP;
|
|
|
|
use LibreNMS\Util\Validate;
|
|
|
|
use Validator;
|
2018-05-09 08:05:17 -05:00
|
|
|
|
|
|
|
class AppServiceProvider extends ServiceProvider
|
|
|
|
{
|
|
|
|
/**
|
2019-03-19 08:14:01 -05:00
|
|
|
* Register any application services.
|
2018-05-09 08:05:17 -05:00
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2023-05-24 22:21:54 +02:00
|
|
|
public function register(): void
|
2018-05-09 08:05:17 -05:00
|
|
|
{
|
2019-03-19 08:14:01 -05:00
|
|
|
$this->registerFacades();
|
|
|
|
$this->registerGeocoder();
|
2018-05-09 08:05:17 -05:00
|
|
|
|
2019-03-19 08:14:01 -05:00
|
|
|
$this->app->singleton('permissions', function ($app) {
|
2020-10-28 16:07:03 -05:00
|
|
|
return new PermissionsCache();
|
2019-03-19 08:14:01 -05:00
|
|
|
});
|
2019-11-14 21:56:06 +00:00
|
|
|
$this->app->singleton('device-cache', function ($app) {
|
|
|
|
return new \LibreNMS\Cache\Device();
|
|
|
|
});
|
2022-10-02 00:41:56 -05:00
|
|
|
$this->app->singleton('git', function ($app) {
|
|
|
|
return new \LibreNMS\Util\Git();
|
2022-09-28 23:23:32 -05:00
|
|
|
});
|
2021-11-17 19:23:55 -06:00
|
|
|
|
|
|
|
$this->app->bind(\App\Models\Device::class, function () {
|
|
|
|
/** @var \LibreNMS\Cache\Device $cache */
|
|
|
|
$cache = $this->app->make('device-cache');
|
|
|
|
|
|
|
|
return $cache->hasPrimary() ? $cache->getPrimary() : new \App\Models\Device;
|
|
|
|
});
|
2018-05-09 08:05:17 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-03-19 08:14:01 -05:00
|
|
|
* Bootstrap any application services.
|
2018-05-09 08:05:17 -05:00
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2023-05-24 22:21:54 +02:00
|
|
|
public function boot(): void
|
2018-05-09 08:05:17 -05:00
|
|
|
{
|
2020-11-03 17:18:31 +01:00
|
|
|
\Illuminate\Pagination\Paginator::useBootstrap();
|
|
|
|
|
2019-03-19 08:14:01 -05:00
|
|
|
$this->bootCustomBladeDirectives();
|
|
|
|
$this->bootCustomValidators();
|
|
|
|
$this->configureMorphAliases();
|
Implement OS specific information discovery (#11446)
* Implement OS specific information discovery
That way it doesn't have to be fetched during polling
Also improve discovery process, os is only detected once, in the core module.
EXA is the test os, a couple improvements there.
* Use local variable, then unset it so we don't pollute.
* fix style issues
* test and other fixes
* attribute update fixes
* Update exa data, need new source data
* null missing "os" values
* fix ftos odd character
* fix ftos odd character
* only null for new style or we will reset to null every discovery
* Move device observer to own class
* Handle location, relocate event logging
* update exa e7-2 data
* update ird test data, apparently unicode is now working.
* update Linux ntc, now uses correct icon
* Only load all os on the web, also, we can't load existing the the database isn't connected.
* only for devices that have a location
* revert ftos test data apparently
* revert ird
2020-05-14 11:27:59 -05:00
|
|
|
$this->bootObservers();
|
2018-05-09 08:05:17 -05:00
|
|
|
}
|
2018-09-24 02:07:00 -05:00
|
|
|
|
2019-02-12 17:45:04 -06:00
|
|
|
private function bootCustomBladeDirectives()
|
|
|
|
{
|
2022-12-15 19:52:22 -06:00
|
|
|
Blade::if('config', function ($key, $value = true) {
|
|
|
|
return \LibreNMS\Config::get($key) == $value;
|
2019-02-12 17:45:04 -06:00
|
|
|
});
|
|
|
|
Blade::if('notconfig', function ($key) {
|
|
|
|
return ! \LibreNMS\Config::get($key);
|
|
|
|
});
|
|
|
|
Blade::if('admin', function () {
|
|
|
|
return auth()->check() && auth()->user()->isAdmin();
|
|
|
|
});
|
2020-01-04 16:14:50 +01:00
|
|
|
|
|
|
|
Blade::directive('deviceUrl', function ($arguments) {
|
|
|
|
return "<?php echo \LibreNMS\Util\Url::deviceUrl($arguments); ?>";
|
|
|
|
});
|
2022-09-03 12:48:43 -05:00
|
|
|
|
|
|
|
// Graphing
|
|
|
|
Blade::directive('signedGraphUrl', function ($vars) {
|
|
|
|
return "<?php echo \LibreNMS\Util\Url::forExternalGraph($vars); ?>";
|
|
|
|
});
|
|
|
|
|
|
|
|
Blade::directive('signedGraphTag', function ($vars) {
|
|
|
|
return "<?php echo '<img class=\"librenms-graph\" src=\"' . \LibreNMS\Util\Url::forExternalGraph($vars) . '\" />'; ?>";
|
|
|
|
});
|
|
|
|
|
2022-09-05 20:41:55 -05:00
|
|
|
Blade::directive('graphImage', function ($vars, $flags = 0) {
|
2022-09-06 07:33:57 -05:00
|
|
|
return "<?php echo \LibreNMS\Util\Graph::getImageData($vars, $flags); ?>";
|
2022-09-03 12:48:43 -05:00
|
|
|
});
|
2019-02-12 17:45:04 -06:00
|
|
|
}
|
|
|
|
|
2018-09-24 02:07:00 -05:00
|
|
|
private function configureMorphAliases()
|
|
|
|
{
|
2020-04-19 19:57:49 +02:00
|
|
|
$sensor_types = [];
|
|
|
|
foreach (Sensor::getTypes() as $sensor_type) {
|
|
|
|
$sensor_types[$sensor_type] = \App\Models\Sensor::class;
|
|
|
|
}
|
|
|
|
Relation::morphMap(array_merge([
|
2018-09-24 02:07:00 -05:00
|
|
|
'interface' => \App\Models\Port::class,
|
|
|
|
'sensor' => \App\Models\Sensor::class,
|
2019-01-03 16:42:12 -06:00
|
|
|
'device' => \App\Models\Device::class,
|
|
|
|
'device_group' => \App\Models\DeviceGroup::class,
|
2020-06-14 12:39:10 -05:00
|
|
|
'location' => \App\Models\Location::class,
|
2020-04-19 19:57:49 +02:00
|
|
|
], $sensor_types));
|
2018-09-24 02:07:00 -05:00
|
|
|
}
|
Refactored and update Location Geocoding (#9359)
- Fix location so it is a regular database relation (this allows multiple devices to be accurately linked to one location and saves api calls)
- Parse coordinates from the location more consistently
- Add settings to webui
- ~~Used [PHP Geocoder](http://geocoder-php.org/), which has lots of backends and is well tested. (also includes reverse and geoip)~~
- Google Maps, Bing, Mapquest, and OpenStreetMap supported initially.
- Default to OpenStreetMap, which doesn't require a key. They will liberally hand out bans if you exceed 1 query per second though.
- All other Geocoding APIs require an API key. (Google requires a credit card on file, but seems to be the most accurate)
- Update all (I think) sql queries to handle the new structure
- Remove final vestiges of override_sysLocation as a device attribute
- Update existing device groups and rules in DB
- Tested all APIs with good/bad location, no/bad/good key, and no connection.
- Cannot fix advanced queries that use location
This blocks #8868
DO NOT DELETE THIS TEXT
#### Please note
> Please read this information carefully. You can run `./scripts/pre-commit.php` to check your code before submitting.
- [x] Have you followed our [code guidelines?](http://docs.librenms.org/Developing/Code-Guidelines/)
#### Testers
If you would like to test this pull request then please run: `./scripts/github-apply <pr_id>`, i.e `./scripts/github-apply 5926`
After you are done testing, you can remove the changes with `./scripts/github-remove`. If there are schema changes, you can ask on discord how to revert.
2018-11-28 16:49:18 -06:00
|
|
|
|
2019-03-12 23:59:03 -05:00
|
|
|
private function registerFacades()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
Refactored and update Location Geocoding (#9359)
- Fix location so it is a regular database relation (this allows multiple devices to be accurately linked to one location and saves api calls)
- Parse coordinates from the location more consistently
- Add settings to webui
- ~~Used [PHP Geocoder](http://geocoder-php.org/), which has lots of backends and is well tested. (also includes reverse and geoip)~~
- Google Maps, Bing, Mapquest, and OpenStreetMap supported initially.
- Default to OpenStreetMap, which doesn't require a key. They will liberally hand out bans if you exceed 1 query per second though.
- All other Geocoding APIs require an API key. (Google requires a credit card on file, but seems to be the most accurate)
- Update all (I think) sql queries to handle the new structure
- Remove final vestiges of override_sysLocation as a device attribute
- Update existing device groups and rules in DB
- Tested all APIs with good/bad location, no/bad/good key, and no connection.
- Cannot fix advanced queries that use location
This blocks #8868
DO NOT DELETE THIS TEXT
#### Please note
> Please read this information carefully. You can run `./scripts/pre-commit.php` to check your code before submitting.
- [x] Have you followed our [code guidelines?](http://docs.librenms.org/Developing/Code-Guidelines/)
#### Testers
If you would like to test this pull request then please run: `./scripts/github-apply <pr_id>`, i.e `./scripts/github-apply 5926`
After you are done testing, you can remove the changes with `./scripts/github-remove`. If there are schema changes, you can ask on discord how to revert.
2018-11-28 16:49:18 -06:00
|
|
|
private function registerGeocoder()
|
|
|
|
{
|
|
|
|
$this->app->alias(\LibreNMS\Interfaces\Geocoder::class, 'geocoder');
|
|
|
|
$this->app->bind(\LibreNMS\Interfaces\Geocoder::class, function ($app) {
|
|
|
|
$engine = Config::get('geoloc.engine');
|
|
|
|
|
|
|
|
switch ($engine) {
|
|
|
|
case 'mapquest':
|
|
|
|
Log::debug('MapQuest geocode engine');
|
2020-09-21 14:54:51 +02:00
|
|
|
|
Refactored and update Location Geocoding (#9359)
- Fix location so it is a regular database relation (this allows multiple devices to be accurately linked to one location and saves api calls)
- Parse coordinates from the location more consistently
- Add settings to webui
- ~~Used [PHP Geocoder](http://geocoder-php.org/), which has lots of backends and is well tested. (also includes reverse and geoip)~~
- Google Maps, Bing, Mapquest, and OpenStreetMap supported initially.
- Default to OpenStreetMap, which doesn't require a key. They will liberally hand out bans if you exceed 1 query per second though.
- All other Geocoding APIs require an API key. (Google requires a credit card on file, but seems to be the most accurate)
- Update all (I think) sql queries to handle the new structure
- Remove final vestiges of override_sysLocation as a device attribute
- Update existing device groups and rules in DB
- Tested all APIs with good/bad location, no/bad/good key, and no connection.
- Cannot fix advanced queries that use location
This blocks #8868
DO NOT DELETE THIS TEXT
#### Please note
> Please read this information carefully. You can run `./scripts/pre-commit.php` to check your code before submitting.
- [x] Have you followed our [code guidelines?](http://docs.librenms.org/Developing/Code-Guidelines/)
#### Testers
If you would like to test this pull request then please run: `./scripts/github-apply <pr_id>`, i.e `./scripts/github-apply 5926`
After you are done testing, you can remove the changes with `./scripts/github-remove`. If there are schema changes, you can ask on discord how to revert.
2018-11-28 16:49:18 -06:00
|
|
|
return $app->make(\App\ApiClients\MapquestApi::class);
|
|
|
|
case 'bing':
|
|
|
|
Log::debug('Bing geocode engine');
|
2020-09-21 14:54:51 +02:00
|
|
|
|
Refactored and update Location Geocoding (#9359)
- Fix location so it is a regular database relation (this allows multiple devices to be accurately linked to one location and saves api calls)
- Parse coordinates from the location more consistently
- Add settings to webui
- ~~Used [PHP Geocoder](http://geocoder-php.org/), which has lots of backends and is well tested. (also includes reverse and geoip)~~
- Google Maps, Bing, Mapquest, and OpenStreetMap supported initially.
- Default to OpenStreetMap, which doesn't require a key. They will liberally hand out bans if you exceed 1 query per second though.
- All other Geocoding APIs require an API key. (Google requires a credit card on file, but seems to be the most accurate)
- Update all (I think) sql queries to handle the new structure
- Remove final vestiges of override_sysLocation as a device attribute
- Update existing device groups and rules in DB
- Tested all APIs with good/bad location, no/bad/good key, and no connection.
- Cannot fix advanced queries that use location
This blocks #8868
DO NOT DELETE THIS TEXT
#### Please note
> Please read this information carefully. You can run `./scripts/pre-commit.php` to check your code before submitting.
- [x] Have you followed our [code guidelines?](http://docs.librenms.org/Developing/Code-Guidelines/)
#### Testers
If you would like to test this pull request then please run: `./scripts/github-apply <pr_id>`, i.e `./scripts/github-apply 5926`
After you are done testing, you can remove the changes with `./scripts/github-remove`. If there are schema changes, you can ask on discord how to revert.
2018-11-28 16:49:18 -06:00
|
|
|
return $app->make(\App\ApiClients\BingApi::class);
|
|
|
|
case 'openstreetmap':
|
|
|
|
Log::debug('OpenStreetMap geocode engine');
|
2020-09-21 14:54:51 +02:00
|
|
|
|
Refactored and update Location Geocoding (#9359)
- Fix location so it is a regular database relation (this allows multiple devices to be accurately linked to one location and saves api calls)
- Parse coordinates from the location more consistently
- Add settings to webui
- ~~Used [PHP Geocoder](http://geocoder-php.org/), which has lots of backends and is well tested. (also includes reverse and geoip)~~
- Google Maps, Bing, Mapquest, and OpenStreetMap supported initially.
- Default to OpenStreetMap, which doesn't require a key. They will liberally hand out bans if you exceed 1 query per second though.
- All other Geocoding APIs require an API key. (Google requires a credit card on file, but seems to be the most accurate)
- Update all (I think) sql queries to handle the new structure
- Remove final vestiges of override_sysLocation as a device attribute
- Update existing device groups and rules in DB
- Tested all APIs with good/bad location, no/bad/good key, and no connection.
- Cannot fix advanced queries that use location
This blocks #8868
DO NOT DELETE THIS TEXT
#### Please note
> Please read this information carefully. You can run `./scripts/pre-commit.php` to check your code before submitting.
- [x] Have you followed our [code guidelines?](http://docs.librenms.org/Developing/Code-Guidelines/)
#### Testers
If you would like to test this pull request then please run: `./scripts/github-apply <pr_id>`, i.e `./scripts/github-apply 5926`
After you are done testing, you can remove the changes with `./scripts/github-remove`. If there are schema changes, you can ask on discord how to revert.
2018-11-28 16:49:18 -06:00
|
|
|
return $app->make(\App\ApiClients\NominatimApi::class);
|
|
|
|
default:
|
|
|
|
case 'google':
|
|
|
|
Log::debug('Google Maps geocode engine');
|
2020-09-21 14:54:51 +02:00
|
|
|
|
Refactored and update Location Geocoding (#9359)
- Fix location so it is a regular database relation (this allows multiple devices to be accurately linked to one location and saves api calls)
- Parse coordinates from the location more consistently
- Add settings to webui
- ~~Used [PHP Geocoder](http://geocoder-php.org/), which has lots of backends and is well tested. (also includes reverse and geoip)~~
- Google Maps, Bing, Mapquest, and OpenStreetMap supported initially.
- Default to OpenStreetMap, which doesn't require a key. They will liberally hand out bans if you exceed 1 query per second though.
- All other Geocoding APIs require an API key. (Google requires a credit card on file, but seems to be the most accurate)
- Update all (I think) sql queries to handle the new structure
- Remove final vestiges of override_sysLocation as a device attribute
- Update existing device groups and rules in DB
- Tested all APIs with good/bad location, no/bad/good key, and no connection.
- Cannot fix advanced queries that use location
This blocks #8868
DO NOT DELETE THIS TEXT
#### Please note
> Please read this information carefully. You can run `./scripts/pre-commit.php` to check your code before submitting.
- [x] Have you followed our [code guidelines?](http://docs.librenms.org/Developing/Code-Guidelines/)
#### Testers
If you would like to test this pull request then please run: `./scripts/github-apply <pr_id>`, i.e `./scripts/github-apply 5926`
After you are done testing, you can remove the changes with `./scripts/github-remove`. If there are schema changes, you can ask on discord how to revert.
2018-11-28 16:49:18 -06:00
|
|
|
return $app->make(\App\ApiClients\GoogleMapsApi::class);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2019-01-25 15:30:58 -06:00
|
|
|
|
Implement OS specific information discovery (#11446)
* Implement OS specific information discovery
That way it doesn't have to be fetched during polling
Also improve discovery process, os is only detected once, in the core module.
EXA is the test os, a couple improvements there.
* Use local variable, then unset it so we don't pollute.
* fix style issues
* test and other fixes
* attribute update fixes
* Update exa data, need new source data
* null missing "os" values
* fix ftos odd character
* fix ftos odd character
* only null for new style or we will reset to null every discovery
* Move device observer to own class
* Handle location, relocate event logging
* update exa e7-2 data
* update ird test data, apparently unicode is now working.
* update Linux ntc, now uses correct icon
* Only load all os on the web, also, we can't load existing the the database isn't connected.
* only for devices that have a location
* revert ftos test data apparently
* revert ird
2020-05-14 11:27:59 -05:00
|
|
|
private function bootObservers()
|
|
|
|
{
|
|
|
|
\App\Models\Device::observe(\App\Observers\DeviceObserver::class);
|
2022-03-12 14:39:58 -06:00
|
|
|
\App\Models\Package::observe(\App\Observers\PackageObserver::class);
|
2021-02-02 06:40:11 +00:00
|
|
|
\App\Models\Service::observe(\App\Observers\ServiceObserver::class);
|
2022-01-30 16:28:18 -06:00
|
|
|
\App\Models\Stp::observe(\App\Observers\StpObserver::class);
|
2022-03-12 14:39:58 -06:00
|
|
|
\App\Models\User::observe(\App\Observers\UserObserver::class);
|
2023-10-05 19:49:26 -05:00
|
|
|
\App\Models\Vminfo::observe(\App\Observers\VminfoObserver::class);
|
Implement OS specific information discovery (#11446)
* Implement OS specific information discovery
That way it doesn't have to be fetched during polling
Also improve discovery process, os is only detected once, in the core module.
EXA is the test os, a couple improvements there.
* Use local variable, then unset it so we don't pollute.
* fix style issues
* test and other fixes
* attribute update fixes
* Update exa data, need new source data
* null missing "os" values
* fix ftos odd character
* fix ftos odd character
* only null for new style or we will reset to null every discovery
* Move device observer to own class
* Handle location, relocate event logging
* update exa e7-2 data
* update ird test data, apparently unicode is now working.
* update Linux ntc, now uses correct icon
* Only load all os on the web, also, we can't load existing the the database isn't connected.
* only for devices that have a location
* revert ftos test data apparently
* revert ird
2020-05-14 11:27:59 -05:00
|
|
|
}
|
|
|
|
|
2019-01-25 15:30:58 -06:00
|
|
|
private function bootCustomValidators()
|
|
|
|
{
|
2019-08-21 20:36:22 -05:00
|
|
|
Validator::extend('alpha_space', function ($attribute, $value) {
|
|
|
|
return preg_match('/^[\w\s]+$/u', $value);
|
|
|
|
});
|
|
|
|
|
2019-01-25 15:30:58 -06:00
|
|
|
Validator::extend('ip_or_hostname', function ($attribute, $value, $parameters, $validator) {
|
|
|
|
$ip = substr($value, 0, strpos($value, '/') ?: strlen($value)); // allow prefixes too
|
2020-09-21 14:54:51 +02:00
|
|
|
|
2019-01-25 15:30:58 -06:00
|
|
|
return IP::isValid($ip) || Validate::hostname($value);
|
2021-05-11 08:08:59 -05:00
|
|
|
});
|
2019-10-16 21:22:05 +00:00
|
|
|
|
2020-02-26 14:01:49 +01:00
|
|
|
Validator::extend('is_regex', function ($attribute, $value) {
|
2021-03-30 00:43:05 +02:00
|
|
|
return @preg_match($value, '') !== false;
|
2021-05-11 08:08:59 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
Validator::extend('keys_in', function ($attribute, $value, $parameters, $validator) {
|
|
|
|
$extra_keys = is_array($value) ? array_diff(array_keys($value), $parameters) : [];
|
|
|
|
|
|
|
|
$validator->addReplacer('keys_in', function ($message, $attribute, $rule, $parameters) use ($extra_keys) {
|
|
|
|
return str_replace(
|
|
|
|
[':extra', ':values'],
|
|
|
|
[implode(',', $extra_keys), implode(',', $parameters)],
|
|
|
|
$message);
|
|
|
|
});
|
|
|
|
|
|
|
|
return is_array($value) && empty($extra_keys);
|
|
|
|
});
|
2020-02-26 14:01:49 +01:00
|
|
|
|
2019-10-16 21:22:05 +00:00
|
|
|
Validator::extend('zero_or_exists', function ($attribute, $value, $parameters, $validator) {
|
2021-08-31 13:43:02 -05:00
|
|
|
if ($value === 0 || $value === '0') {
|
2019-10-16 21:22:05 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
$validator = Validator::make([$attribute => $value], [$attribute => 'exists:' . implode(',', $parameters)]);
|
2020-09-21 14:54:51 +02:00
|
|
|
|
2019-10-16 21:22:05 +00:00
|
|
|
return $validator->passes();
|
2021-05-11 08:08:59 -05:00
|
|
|
}, trans('validation.exists'));
|
2022-02-20 22:05:51 +01:00
|
|
|
|
|
|
|
Validator::extend('url_or_xml', function ($attribute, $value): bool {
|
|
|
|
if (! is_string($value)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (filter_var($value, FILTER_VALIDATE_URL) !== false) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
libxml_use_internal_errors(true);
|
|
|
|
$xml = simplexml_load_string($value);
|
|
|
|
if ($xml !== false) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
});
|
2019-01-25 15:30:58 -06:00
|
|
|
}
|
2018-05-09 08:05:17 -05:00
|
|
|
}
|