Matomo Analytics – Ethical Stats. Powerful Insights. - Version 1.0.5

Version Description

Download this release

Release Info

Developer matomoteam
Plugin Icon 128x128 Matomo Analytics – Ethical Stats. Powerful Insights.
Version 1.0.5
Comparing to
See all releases

Code changes from version 1.0.4 to 1.0.5

Files changed (75) hide show
  1. app/bootstrap.php +21 -19
  2. app/core/Application/Kernel/EnvironmentValidator.php +1 -1
  3. app/core/Archive/ArchivePurger.php +1 -10
  4. app/core/Archive/DataTableFactory.php +5 -1
  5. app/core/ArchiveProcessor.php +60 -29
  6. app/core/ArchiveProcessor/Loader.php +1 -1
  7. app/core/ArchiveProcessor/PluginsArchiver.php +1 -1
  8. app/core/Columns/Dimension.php +11 -0
  9. app/core/CronArchive.php +11 -7
  10. app/core/CronArchive/StopArchiverException.php +15 -0
  11. app/core/DataAccess/ArchivingDbAdapter.php +11 -1
  12. app/core/DataAccess/LogAggregator.php +10 -0
  13. app/core/DataAccess/Model.php +6 -14
  14. app/core/Plugin/ControllerAdmin.php +0 -1
  15. app/core/Plugin/Segment.php +32 -0
  16. app/core/Tracker/GoalManager.php +5 -5
  17. app/core/Updates/3.13.4-b1.php +2 -2
  18. app/core/Updates/3.13.5-rc1.php +50 -0
  19. app/core/Version.php +1 -1
  20. app/js/piwik.min.js +33 -33
  21. app/matomo.js +33 -33
  22. app/piwik.js +33 -33
  23. app/plugins/API/API.php +57 -0
  24. app/plugins/API/SegmentMetadata.php +4 -0
  25. app/plugins/Actions/Columns/ClickedUrl.php +1 -0
  26. app/plugins/Actions/Columns/DownloadUrl.php +1 -0
  27. app/plugins/Actions/Columns/EntryPageTitle.php +1 -0
  28. app/plugins/Actions/Columns/EntryPageUrl.php +1 -0
  29. app/plugins/Actions/Columns/ExitPageTitle.php +1 -0
  30. app/plugins/Actions/Columns/ExitPageUrl.php +1 -0
  31. app/plugins/Actions/Columns/PageTitle.php +1 -0
  32. app/plugins/Actions/Columns/PageUrl.php +1 -0
  33. app/plugins/Actions/DataTable/Filter/Actions.php +15 -2
  34. app/plugins/Contents/Columns/ContentName.php +1 -0
  35. app/plugins/Contents/Columns/ContentPiece.php +1 -0
  36. app/plugins/CoreAdminHome/Tasks.php +20 -0
  37. app/plugins/CoreHome/Columns/UserId.php +8 -0
  38. app/plugins/CoreUpdater/Controller.php +12 -0
  39. app/plugins/CoreUpdater/Updater.php +39 -26
  40. app/plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php +17 -0
  41. app/plugins/Events/Columns/EventAction.php +1 -0
  42. app/plugins/Events/Columns/EventCategory.php +1 -0
  43. app/plugins/Events/Columns/EventName.php +2 -0
  44. app/plugins/Live/Controller.php +2 -0
  45. app/plugins/Marketplace/Api/Client.php +0 -2
  46. app/plugins/UserId/API.php +1 -0
  47. app/vendor/autoload.php +1 -1
  48. app/vendor/composer/autoload_classmap.php +2 -0
  49. app/vendor/composer/autoload_real.php +7 -7
  50. app/vendor/composer/autoload_static.php +8 -6
  51. app/vendor/composer/installed.json +6 -6
  52. app/vendor/piwik/device-detector/DeviceDetector.php +1 -1
  53. app/vendor/piwik/device-detector/Parser/Client/Browser.php +2 -1
  54. app/vendor/piwik/device-detector/Parser/Device/DeviceParserAbstract.php +44 -1
  55. app/vendor/piwik/device-detector/README.md +9 -8
  56. app/vendor/piwik/device-detector/regexes/bots.yml +16 -0
  57. app/vendor/piwik/device-detector/regexes/client/browsers.yml +5 -0
  58. app/vendor/piwik/device-detector/regexes/client/libraries.yml +15 -0
  59. app/vendor/piwik/device-detector/regexes/device/car_browsers.yml +6 -2
  60. app/vendor/piwik/device-detector/regexes/device/mobiles.yml +864 -179
  61. app/vendor/piwik/device-detector/regexes/device/portable_media_player.yml +1 -1
  62. assets/css/admin-style.css +4 -0
  63. assets/js/asset_manager_core_js.js +4 -4
  64. classes/WpMatomo/Admin/Marketplace.php +13 -0
  65. classes/WpMatomo/Admin/SystemReport.php +31 -3
  66. classes/WpMatomo/Admin/TrackingSettings.php +1 -0
  67. classes/WpMatomo/Admin/views/marketplace.php +37 -8
  68. classes/WpMatomo/Admin/views/summary.php +1 -1
  69. classes/WpMatomo/Admin/views/tracking.php +2 -0
  70. classes/WpMatomo/Db/WordPressTracker.php +3 -4
  71. classes/WpMatomo/Logger.php +1 -1
  72. classes/WpMatomo/Settings.php +1 -0
  73. classes/WpMatomo/TrackingCode/TrackingCodeGenerator.php +3 -0
  74. matomo.php +1 -1
  75. readme.txt +1 -14
app/bootstrap.php CHANGED
@@ -24,29 +24,31 @@ if ( ! defined( 'PIWIK_ENABLE_ERROR_HANDLER' ) ) {
24
 
25
  $GLOBALS['MATOMO_LOADED_DIRECTLY'] = ! defined( 'ABSPATH' );
26
 
27
- function matomo_log_message_no_display($message)
28
- {
29
- $message = 'Matomo ' . $message;
30
-
31
- if ( defined( 'WP_DEBUG' ) && WP_DEBUG === true ) {
32
- if (function_exists('ini_set') && function_exists('ini_get')) {
33
- $value_orig = @ini_get('display_errors');
34
- $value = @ini_set('display_errors', 'Off');
35
- if (false !== $value) {
36
- error_log( $message );
 
 
 
37
  }
38
- @ini_set('display_errors', $value_orig);
39
  }
40
- }
41
 
42
- if (function_exists('update_option')
43
- && class_exists('\WpMatomo\Logger')) {
44
- // only if WordPress was bootstrapped by now... otherwise it will fail
45
- try {
46
- $logger = new \WpMatomo\Logger();
47
- $logger->log_exception('archive_boot', new Exception($message));
48
- } catch (Exception $e) {
49
 
 
50
  }
51
  }
52
  }
24
 
25
  $GLOBALS['MATOMO_LOADED_DIRECTLY'] = ! defined( 'ABSPATH' );
26
 
27
+ if (!function_exists('matomo_log_message_no_display')) {
28
+ function matomo_log_message_no_display($message)
29
+ {
30
+ $message = 'Matomo ' . $message;
31
+
32
+ if ( defined( 'WP_DEBUG' ) && WP_DEBUG === true ) {
33
+ if (function_exists('ini_set') && function_exists('ini_get')) {
34
+ $value_orig = @ini_get('display_errors');
35
+ $value = @ini_set('display_errors', 'Off');
36
+ if (false !== $value) {
37
+ error_log( $message );
38
+ }
39
+ @ini_set('display_errors', $value_orig);
40
  }
 
41
  }
 
42
 
43
+ if (function_exists('update_option')
44
+ && class_exists('\WpMatomo\Logger')) {
45
+ // only if WordPress was bootstrapped by now... otherwise it will fail
46
+ try {
47
+ $logger = new \WpMatomo\Logger();
48
+ $logger->log_exception('archive_boot', new Exception($message));
49
+ } catch (Exception $e) {
50
 
51
+ }
52
  }
53
  }
54
  }
app/core/Application/Kernel/EnvironmentValidator.php CHANGED
@@ -82,7 +82,7 @@ class EnvironmentValidator
82
  if (isset($general['enable_installer'])
83
  && !$general['enable_installer']
84
  ) {
85
- throw new NotYetInstalledException('Matomo is not set up yet');
86
  }
87
 
88
  $message = $this->getSpecificMessageWhetherFileExistsOrNot($path);
82
  if (isset($general['enable_installer'])
83
  && !$general['enable_installer']
84
  ) {
85
+ throw new NotYetInstalledException('Matomo is not set up yet. File not readable: ' . $path);
86
  }
87
 
88
  $message = $this->getSpecificMessageWhetherFileExistsOrNot($path);
app/core/Archive/ArchivePurger.php CHANGED
@@ -95,16 +95,7 @@ class ArchivePurger
95
  {
96
  $numericTable = ArchiveTableCreator::getNumericTable($date);
97
 
98
- // we don't want to do an INNER JOIN on every row in a archive table that can potentially have tens to hundreds of thousands of rows,
99
- // so we first look for sites w/ invalidated archives, and use this as a constraint in getInvalidatedArchiveIdsSafeToDelete() below.
100
- // the constraint will hit an INDEX and speed up the inner join that happens in getInvalidatedArchiveIdsSafeToDelete().
101
- $idSites = $this->model->getSitesWithInvalidatedArchive($numericTable);
102
- if (empty($idSites)) {
103
- $this->logger->debug("No sites with invalidated archives found in {table}.", array('table' => $numericTable));
104
- return 0;
105
- }
106
-
107
- $archiveIds = $this->model->getInvalidatedArchiveIdsSafeToDelete($numericTable, $idSites);
108
  if (empty($archiveIds)) {
109
  $this->logger->debug("No invalidated archives found in {table} with newer, valid archives.", array('table' => $numericTable));
110
  return 0;
95
  {
96
  $numericTable = ArchiveTableCreator::getNumericTable($date);
97
 
98
+ $archiveIds = $this->model->getInvalidatedArchiveIdsSafeToDelete($numericTable);
 
 
 
 
 
 
 
 
 
99
  if (empty($archiveIds)) {
100
  $this->logger->debug("No invalidated archives found in {table} with newer, valid archives.", array('table' => $numericTable));
101
  return 0;
app/core/Archive/DataTableFactory.php CHANGED
@@ -404,13 +404,17 @@ class DataTableFactory
404
  foreach ($dataTable->getRowsWithoutSummaryRow() as $row) {
405
  $row->removeSubtable();
406
  }
 
 
 
 
407
 
408
  return;
409
  }
410
 
411
  $dataName = reset($this->dataNames);
412
 
413
- foreach ($dataTable->getRowsWithoutSummaryRow() as $row) {
414
  $sid = $row->getIdSubDataTable();
415
  if ($sid === null) {
416
  continue;
404
  foreach ($dataTable->getRowsWithoutSummaryRow() as $row) {
405
  $row->removeSubtable();
406
  }
407
+ $summaryRow = $dataTable->getRowFromId(DataTable::ID_SUMMARY_ROW);
408
+ if ($summaryRow) {
409
+ $summaryRow->removeSubtable();
410
+ }
411
 
412
  return;
413
  }
414
 
415
  $dataName = reset($this->dataNames);
416
 
417
+ foreach ($dataTable->getRows() as $row) {
418
  $sid = $row->getIdSubDataTable();
419
  if ($sid === null) {
420
  continue;
app/core/ArchiveProcessor.php CHANGED
@@ -103,22 +103,11 @@ class ArchiveProcessor
103
 
104
  private $numberOfVisitsConverted = false;
105
 
106
- /**
107
- * If true, unique visitors are not calculated when we are aggregating data for multiple sites.
108
- * The `[General] enable_processing_unique_visitors_multiple_sites` INI config option controls
109
- * the value of this variable.
110
- *
111
- * @var bool
112
- */
113
- private $skipUniqueVisitorsCalculationForMultipleSites = true;
114
-
115
  public function __construct(Parameters $params, ArchiveWriter $archiveWriter, LogAggregator $logAggregator)
116
  {
117
  $this->params = $params;
118
  $this->logAggregator = $logAggregator;
119
  $this->archiveWriter = $archiveWriter;
120
-
121
- $this->skipUniqueVisitorsCalculationForMultipleSites = Rules::shouldSkipUniqueVisitorsCalculationForMultipleSites();
122
  }
123
 
124
  protected function getArchive()
@@ -414,30 +403,40 @@ class ArchiveProcessor
414
 
415
  protected function enrichWithUniqueVisitorsMetric(Row $row)
416
  {
417
- // skip unique visitors metrics calculation if calculating for multiple sites is disabled
418
- if (!$this->getParams()->isSingleSite()
419
- && $this->skipUniqueVisitorsCalculationForMultipleSites
420
- ) {
421
- return;
422
- }
423
-
424
  if ($row->getColumn('nb_uniq_visitors') === false
425
  && $row->getColumn('nb_users') === false
426
  ) {
427
  return;
428
  }
429
 
430
- if (!SettingsPiwik::isUniqueVisitorsEnabled($this->getParams()->getPeriod()->getLabel())) {
 
 
431
  $row->deleteColumn('nb_uniq_visitors');
432
  $row->deleteColumn('nb_users');
433
  return;
434
  }
435
 
436
- $metrics = array(
437
- Metrics::INDEX_NB_USERS
438
- );
 
 
 
 
 
 
 
 
439
 
440
- if ($this->getParams()->isSingleSite()) {
 
 
 
 
 
 
 
441
  $uniqueVisitorsMetric = Metrics::INDEX_NB_UNIQ_VISITORS;
442
  } else {
443
  if (!SettingsPiwik::isSameFingerprintAcrossWebsites()) {
@@ -447,9 +446,13 @@ class ArchiveProcessor
447
  }
448
  $uniqueVisitorsMetric = Metrics::INDEX_NB_UNIQ_FINGERPRINTS;
449
  }
450
- $metrics[] = $uniqueVisitorsMetric;
451
 
452
- $uniques = $this->computeNbUniques($metrics);
 
 
 
 
 
453
 
454
  // see edge case as described in https://github.com/piwik/piwik/issues/9357 where uniq_visitors might be higher
455
  // than visits because we archive / process it after nb_visits. Between archiving nb_visits and nb_uniq_visitors
@@ -475,19 +478,47 @@ class ArchiveProcessor
475
  return 'sum';
476
  }
477
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
478
  /**
479
  * Processes number of unique visitors for the given period
480
  *
481
  * This is the only Period metric (ie. week/month/year/range) that we process from the logs directly,
482
  * since unique visitors cannot be summed like other metrics.
483
  *
484
- * @param array Metrics Ids for which to aggregates count of values
485
- * @return array of metrics, where the key is metricid and the value is the metric value
 
 
486
  */
487
- protected function computeNbUniques($metrics)
488
  {
489
  $logAggregator = $this->getLogAggregator();
490
- $query = $logAggregator->queryVisitsByDimension(array(), false, array(), $metrics);
 
 
 
 
 
 
 
491
  $data = $query->fetch();
492
  return $data;
493
  }
103
 
104
  private $numberOfVisitsConverted = false;
105
 
 
 
 
 
 
 
 
 
 
106
  public function __construct(Parameters $params, ArchiveWriter $archiveWriter, LogAggregator $logAggregator)
107
  {
108
  $this->params = $params;
109
  $this->logAggregator = $logAggregator;
110
  $this->archiveWriter = $archiveWriter;
 
 
111
  }
112
 
113
  protected function getArchive()
403
 
404
  protected function enrichWithUniqueVisitorsMetric(Row $row)
405
  {
 
 
 
 
 
 
 
406
  if ($row->getColumn('nb_uniq_visitors') === false
407
  && $row->getColumn('nb_users') === false
408
  ) {
409
  return;
410
  }
411
 
412
+ $periodLabel = $this->getParams()->getPeriod()->getLabel();
413
+
414
+ if (!SettingsPiwik::isUniqueVisitorsEnabled($periodLabel)) {
415
  $row->deleteColumn('nb_uniq_visitors');
416
  $row->deleteColumn('nb_users');
417
  return;
418
  }
419
 
420
+ $sites = $this->getIdSitesToComputeNbUniques();
421
+
422
+ if (count($sites) > 1 && Rules::shouldSkipUniqueVisitorsCalculationForMultipleSites()) {
423
+ if ($periodLabel != 'day') {
424
+ // for day we still keep the aggregated metric but for other periods we remove it as it becomes to
425
+ // inaccurate
426
+ $row->deleteColumn('nb_uniq_visitors');
427
+ $row->deleteColumn('nb_users');
428
+ }
429
+ return;
430
+ }
431
 
432
+ if (empty($sites)) {
433
+ // a plugin disabled running below query by removing all sites.
434
+ $row->deleteColumn('nb_uniq_visitors');
435
+ $row->deleteColumn('nb_users');
436
+ return;
437
+ }
438
+
439
+ if (count($sites) === 1) {
440
  $uniqueVisitorsMetric = Metrics::INDEX_NB_UNIQ_VISITORS;
441
  } else {
442
  if (!SettingsPiwik::isSameFingerprintAcrossWebsites()) {
446
  }
447
  $uniqueVisitorsMetric = Metrics::INDEX_NB_UNIQ_FINGERPRINTS;
448
  }
 
449
 
450
+ $metrics = array(
451
+ Metrics::INDEX_NB_USERS,
452
+ $uniqueVisitorsMetric
453
+ );
454
+
455
+ $uniques = $this->computeNbUniques($metrics, $sites);
456
 
457
  // see edge case as described in https://github.com/piwik/piwik/issues/9357 where uniq_visitors might be higher
458
  // than visits because we archive / process it after nb_visits. Between archiving nb_visits and nb_uniq_visitors
478
  return 'sum';
479
  }
480
 
481
+ private function getIdSitesToComputeNbUniques()
482
+ {
483
+ $params = $this->getParams();
484
+ $sites = array($params->getSite()->getId());
485
+
486
+ /**
487
+ * Triggered to change which site ids should be looked at when processing unique visitors and users.
488
+ *
489
+ * @param array &$idSites An array with one idSite. This site is being archived currently. To cancel the query
490
+ * you can change this value to an empty array. To include other sites in the query you
491
+ * can add more idSites to this list of idSites.
492
+ * @param Period $period The period that is being requested to be archived.
493
+ * @param Segment $segment The segment that is request to be archived.
494
+ */
495
+ Piwik::postEvent('ArchiveProcessor.ComputeNbUniques.getIdSites', array(&$sites, $params->getPeriod(), $params->getSegment()));
496
+
497
+ return $sites;
498
+ }
499
+
500
  /**
501
  * Processes number of unique visitors for the given period
502
  *
503
  * This is the only Period metric (ie. week/month/year/range) that we process from the logs directly,
504
  * since unique visitors cannot be summed like other metrics.
505
  *
506
+ * @param array $metrics Metrics Ids for which to aggregates count of values
507
+ * @param int[] $sites A list of idSites that should be included
508
+ * @return array|null An array of metrics, where the key is metricid and the value is the metric value or null if
509
+ * the query was cancelled and not executed.
510
  */
511
+ protected function computeNbUniques($metrics, $sites)
512
  {
513
  $logAggregator = $this->getLogAggregator();
514
+ $sitesBackup = $logAggregator->getSites();
515
+
516
+ $logAggregator->setSites($sites);
517
+ try {
518
+ $query = $logAggregator->queryVisitsByDimension(array(), false, array(), $metrics);
519
+ } finally {
520
+ $logAggregator->setSites($sitesBackup);
521
+ }
522
  $data = $query->fetch();
523
  return $data;
524
  }
app/core/ArchiveProcessor/Loader.php CHANGED
@@ -172,7 +172,7 @@ class Loader
172
  protected function doesRequestedPluginIncludeVisitsSummary()
173
  {
174
  $processAllReportsIncludingVisitsSummary =
175
- Rules::shouldProcessReportsAllPlugins($this->params->getIdSites(), $this->params->getSegment(), $this->params->getPeriod()->getLabel());
176
  $doesRequestedPluginIncludeVisitsSummary = $processAllReportsIncludingVisitsSummary
177
  || $this->params->getRequestedPlugin() == 'VisitsSummary';
178
  return $doesRequestedPluginIncludeVisitsSummary;
172
  protected function doesRequestedPluginIncludeVisitsSummary()
173
  {
174
  $processAllReportsIncludingVisitsSummary =
175
+ Rules::shouldProcessReportsAllPlugins(array($this->params->getSite()->getId()), $this->params->getSegment(), $this->params->getPeriod()->getLabel());
176
  $doesRequestedPluginIncludeVisitsSummary = $processAllReportsIncludingVisitsSummary
177
  || $this->params->getRequestedPlugin() == 'VisitsSummary';
178
  return $doesRequestedPluginIncludeVisitsSummary;
app/core/ArchiveProcessor/PluginsArchiver.php CHANGED
@@ -269,7 +269,7 @@ class PluginsArchiver
269
  }
270
 
271
  if (Rules::shouldProcessReportsAllPlugins(
272
- $this->params->getIdSites(),
273
  $this->params->getSegment(),
274
  $this->params->getPeriod()->getLabel())) {
275
  return true;
269
  }
270
 
271
  if (Rules::shouldProcessReportsAllPlugins(
272
+ array($this->params->getSite()->getId()),
273
  $this->params->getSegment(),
274
  $this->params->getPeriod()->getLabel())) {
275
  return true;
app/core/Columns/Dimension.php CHANGED
@@ -115,6 +115,13 @@ abstract class Dimension
115
  */
116
  protected $suggestedValuesCallback;
117
 
 
 
 
 
 
 
 
118
  /**
119
  * Here you should explain which values are accepted/useful for your segment, for example:
120
  * "1, 2, 3, etc." or "comcast.net, proxad.net, etc.". If the value needs any special encoding you should mention
@@ -620,6 +627,10 @@ abstract class Dimension
620
  $segment->setSuggestedValuesCallback($this->suggestedValuesCallback);
621
  }
622
 
 
 
 
 
623
  if ($this->sqlFilterValue && !$segment->getSqlFilterValue()) {
624
  $segment->setSqlFilterValue($this->sqlFilterValue);
625
  }
115
  */
116
  protected $suggestedValuesCallback;
117
 
118
+ /**
119
+ * An API method whose label columns will be used to determine the suggested values should browser archiving
120
+ * be disabled. The API must have defined a segment metadata on each row for this to work.
121
+ * @var string
122
+ */
123
+ protected $suggestedValuesApi = '';
124
+
125
  /**
126
  * Here you should explain which values are accepted/useful for your segment, for example:
127
  * "1, 2, 3, etc." or "comcast.net, proxad.net, etc.". If the value needs any special encoding you should mention
627
  $segment->setSuggestedValuesCallback($this->suggestedValuesCallback);
628
  }
629
 
630
+ if ($this->suggestedValuesApi) {
631
+ $segment->setSuggestedValuesApi($this->suggestedValuesApi);
632
+ }
633
+
634
  if ($this->sqlFilterValue && !$segment->getSqlFilterValue()) {
635
  $segment->setSqlFilterValue($this->sqlFilterValue);
636
  }
app/core/CronArchive.php CHANGED
@@ -19,11 +19,11 @@ use Piwik\CronArchive\FixedSiteIds;
19
  use Piwik\CronArchive\Performance\Logger;
20
  use Piwik\CronArchive\SharedSiteIds;
21
  use Piwik\Archive\ArchiveInvalidator;
 
22
  use Piwik\DataAccess\ArchiveSelector;
23
  use Piwik\DataAccess\RawLogDao;
24
  use Piwik\Exception\UnexpectedWebsiteFoundException;
25
  use Piwik\Metrics\Formatter;
26
- use Piwik\Period\Factory;
27
  use Piwik\Period\Factory as PeriodFactory;
28
  use Piwik\CronArchive\SitesToReprocessDistributedList;
29
  use Piwik\CronArchive\SegmentArchivingRequestUrlProvider;
@@ -324,10 +324,14 @@ class CronArchive
324
 
325
  $self = $this;
326
  Access::doAsSuperUser(function () use ($self) {
327
- $self->init();
328
- $self->run();
329
- $self->runScheduledTasks();
330
- $self->end();
 
 
 
 
331
  });
332
  }
333
 
@@ -978,10 +982,10 @@ class CronArchive
978
  public function isThereAValidArchiveForPeriod($idSite, $period, $date, $segment = '')
979
  {
980
  if (Range::isMultiplePeriod($date, $period)) {
981
- $rangePeriod = Factory::build($period, $date, Site::getTimezoneFor($idSite));
982
  $periodsToCheck = $rangePeriod->getSubperiods();
983
  } else {
984
- $periodsToCheck = [Factory::build($period, $date, Site::getTimezoneFor($idSite))];
985
  }
986
 
987
  $isTodayIncluded = $this->isTodayIncludedInPeriod($idSite, $periodsToCheck);
19
  use Piwik\CronArchive\Performance\Logger;
20
  use Piwik\CronArchive\SharedSiteIds;
21
  use Piwik\Archive\ArchiveInvalidator;
22
+ use Piwik\CronArchive\StopArchiverException;
23
  use Piwik\DataAccess\ArchiveSelector;
24
  use Piwik\DataAccess\RawLogDao;
25
  use Piwik\Exception\UnexpectedWebsiteFoundException;
26
  use Piwik\Metrics\Formatter;
 
27
  use Piwik\Period\Factory as PeriodFactory;
28
  use Piwik\CronArchive\SitesToReprocessDistributedList;
29
  use Piwik\CronArchive\SegmentArchivingRequestUrlProvider;
324
 
325
  $self = $this;
326
  Access::doAsSuperUser(function () use ($self) {
327
+ try {
328
+ $self->init();
329
+ $self->run();
330
+ $self->runScheduledTasks();
331
+ $self->end();
332
+ } catch (StopArchiverException $e) {
333
+ $this->logger->info("Archiving stopped by stop archiver exception");
334
+ }
335
  });
336
  }
337
 
982
  public function isThereAValidArchiveForPeriod($idSite, $period, $date, $segment = '')
983
  {
984
  if (Range::isMultiplePeriod($date, $period)) {
985
+ $rangePeriod = PeriodFactory::build($period, $date, Site::getTimezoneFor($idSite));
986
  $periodsToCheck = $rangePeriod->getSubperiods();
987
  } else {
988
+ $periodsToCheck = [PeriodFactory::build($period, $date, Site::getTimezoneFor($idSite))];
989
  }
990
 
991
  $isTodayIncluded = $this->isTodayIncludedInPeriod($idSite, $periodsToCheck);
app/core/CronArchive/StopArchiverException.php ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Piwik - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+ namespace Piwik\CronArchive;
10
+
11
+ use Piwik\Exception\Exception;
12
+
13
+ class StopArchiverException extends Exception
14
+ {
15
+ }
app/core/DataAccess/ArchivingDbAdapter.php CHANGED
@@ -9,6 +9,7 @@
9
 
10
  namespace Piwik\DataAccess;
11
 
 
12
  use Piwik\Concurrency\Lock;
13
  use Piwik\Db\AdapterInterface;
14
  use Psr\Log\LoggerInterface;
@@ -30,6 +31,11 @@ class ArchivingDbAdapter
30
  */
31
  private $logger;
32
 
 
 
 
 
 
33
  public function __construct($wrapped, Lock $archivingLock = null, LoggerInterface $logger = null)
34
  {
35
  $this->wrapped = $wrapped;
@@ -101,7 +107,11 @@ class ArchivingDbAdapter
101
  private function reexpireLock()
102
  {
103
  if ($this->archivingLock) {
104
- $this->archivingLock->reexpireLock();
 
 
 
 
105
  }
106
  }
107
  }
9
 
10
  namespace Piwik\DataAccess;
11
 
12
+ use Piwik\ArchiveProcessor\ArchivingStatus;
13
  use Piwik\Concurrency\Lock;
14
  use Piwik\Db\AdapterInterface;
15
  use Psr\Log\LoggerInterface;
31
  */
32
  private $logger;
33
 
34
+ /**
35
+ * @var int
36
+ */
37
+ private $lastReexpireTime = null;
38
+
39
  public function __construct($wrapped, Lock $archivingLock = null, LoggerInterface $logger = null)
40
  {
41
  $this->wrapped = $wrapped;
107
  private function reexpireLock()
108
  {
109
  if ($this->archivingLock) {
110
+ $timeBetweenReexpires = ArchivingStatus::DEFAULT_ARCHIVING_TTL / 4;
111
+ if ($this->lastReexpireTime + $timeBetweenReexpires < time()) {
112
+ $this->archivingLock->reexpireLock();
113
+ $this->lastReexpireTime = time();
114
+ }
115
  }
116
  }
117
  }
app/core/DataAccess/LogAggregator.php CHANGED
@@ -184,6 +184,16 @@ class LogAggregator
184
  $this->logger = $logger ?: StaticContainer::get('Psr\Log\LoggerInterface');
185
  }
186
 
 
 
 
 
 
 
 
 
 
 
187
  public function getSegment()
188
  {
189
  return $this->segment;
184
  $this->logger = $logger ?: StaticContainer::get('Psr\Log\LoggerInterface');
185
  }
186
 
187
+ public function setSites($sites)
188
+ {
189
+ $this->sites = array_map('intval', $sites);
190
+ }
191
+
192
+ public function getSites()
193
+ {
194
+ return $this->sites;
195
+ }
196
+
197
  public function getSegment()
198
  {
199
  return $this->segment;
app/core/DataAccess/Model.php CHANGED
@@ -46,7 +46,7 @@ class Model
46
  * @return array
47
  * @throws Exception
48
  */
49
- public function getInvalidatedArchiveIdsSafeToDelete($archiveTable, array $idSites)
50
  {
51
  try {
52
  Db::get()->query('SET SESSION group_concat_max_len=' . (128 * 1024));
@@ -54,17 +54,12 @@ class Model
54
  $this->logger->info("Could not set group_concat_max_len MySQL session variable.");
55
  }
56
 
57
- $idSites = array_map(function ($v) { return (int)$v; }, $idSites);
58
-
59
  $sql = "SELECT idsite, date1, date2, period, name,
60
  GROUP_CONCAT(idarchive, '.', value ORDER BY ts_archived DESC) as archives
61
  FROM `$archiveTable`
62
  WHERE name LIKE 'done%'
63
- AND value IN (" . ArchiveWriter::DONE_INVALIDATED . ','
64
- . ArchiveWriter::DONE_OK . ','
65
- . ArchiveWriter::DONE_OK_TEMPORARY . ")
66
- AND idsite IN (" . implode(',', $idSites) . ")
67
- GROUP BY idsite, date1, date2, period, name";
68
 
69
  $archiveIds = array();
70
 
@@ -73,11 +68,10 @@ class Model
73
  $duplicateArchives = explode(',', $row['archives']);
74
  $countOfArchives = count($duplicateArchives);
75
 
76
- $firstArchive = array_shift($duplicateArchives);
77
- list($firstArchiveId, $firstArchiveValue) = explode('.', $firstArchive);
78
-
79
  // if there is more than one archive, the older invalidated ones can be deleted
80
  if ($countOfArchives > 1) {
 
 
81
  foreach ($duplicateArchives as $pair) {
82
  if (strpos($pair, '.') === false) {
83
  $this->logger->info("GROUP_CONCAT cut off the query result, you may have to purge archives again.");
@@ -85,9 +79,7 @@ class Model
85
  }
86
 
87
  list($idarchive, $value) = explode('.', $pair);
88
- if ($value == ArchiveWriter::DONE_INVALIDATED) {
89
- $archiveIds[] = $idarchive;
90
- }
91
  }
92
  }
93
  }
46
  * @return array
47
  * @throws Exception
48
  */
49
+ public function getInvalidatedArchiveIdsSafeToDelete($archiveTable)
50
  {
51
  try {
52
  Db::get()->query('SET SESSION group_concat_max_len=' . (128 * 1024));
54
  $this->logger->info("Could not set group_concat_max_len MySQL session variable.");
55
  }
56
 
 
 
57
  $sql = "SELECT idsite, date1, date2, period, name,
58
  GROUP_CONCAT(idarchive, '.', value ORDER BY ts_archived DESC) as archives
59
  FROM `$archiveTable`
60
  WHERE name LIKE 'done%'
61
+ AND `value` NOT IN (" . ArchiveWriter::DONE_ERROR . ")
62
+ GROUP BY idsite, date1, date2, period, name";
 
 
 
63
 
64
  $archiveIds = array();
65
 
68
  $duplicateArchives = explode(',', $row['archives']);
69
  $countOfArchives = count($duplicateArchives);
70
 
 
 
 
71
  // if there is more than one archive, the older invalidated ones can be deleted
72
  if ($countOfArchives > 1) {
73
+ array_shift($duplicateArchives); // we don't want to delete the latest archive if it is usable
74
+
75
  foreach ($duplicateArchives as $pair) {
76
  if (strpos($pair, '.') === false) {
77
  $this->logger->info("GROUP_CONCAT cut off the query result, you may have to purge archives again.");
79
  }
80
 
81
  list($idarchive, $value) = explode('.', $pair);
82
+ $archiveIds[] = $idarchive;
 
 
83
  }
84
  }
85
  }
app/core/Plugin/ControllerAdmin.php CHANGED
@@ -222,7 +222,6 @@ abstract class ControllerAdmin extends Controller
222
 
223
  private static function notifyWhenPhpVersionIsNotCompatibleWithNextMajorPiwik()
224
  {
225
- return;
226
  }
227
 
228
  private static function notifyWhenPhpVersionIsEOL()
222
 
223
  private static function notifyWhenPhpVersionIsNotCompatibleWithNextMajorPiwik()
224
  {
 
225
  }
226
 
227
  private static function notifyWhenPhpVersionIsEOL()
app/core/Plugin/Segment.php CHANGED
@@ -8,6 +8,7 @@
8
  */
9
  namespace Piwik\Plugin;
10
  use Exception;
 
11
 
12
  /**
13
  * Creates a new segment that can be used for instance within the {@link \Piwik\Columns\Dimension::configureSegment()}
@@ -54,6 +55,7 @@ class Segment
54
  private $suggestedValuesCallback;
55
  private $unionOfSegments;
56
  private $isInternalSegment = false;
 
57
 
58
  /**
59
  * If true, this segment will only be visible to the user if the user has view access
@@ -296,6 +298,32 @@ class Segment
296
  $this->suggestedValuesCallback = $suggestedValuesCallback;
297
  }
298
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
299
  /**
300
  * You can restrict the access to this segment by passing a boolean `false`. For instance if you want to make
301
  * a certain segment only available to users having super user access you could do the following:
@@ -346,6 +374,10 @@ class Segment
346
  $segment['suggestedValuesCallback'] = $this->suggestedValuesCallback;
347
  }
348
 
 
 
 
 
349
  return $segment;
350
  }
351
 
8
  */
9
  namespace Piwik\Plugin;
10
  use Exception;
11
+ use Piwik\Development;
12
 
13
  /**
14
  * Creates a new segment that can be used for instance within the {@link \Piwik\Columns\Dimension::configureSegment()}
55
  private $suggestedValuesCallback;
56
  private $unionOfSegments;
57
  private $isInternalSegment = false;
58
+ private $suggestedValuesApi = '';
59
 
60
  /**
61
  * If true, this segment will only be visible to the user if the user has view access
298
  $this->suggestedValuesCallback = $suggestedValuesCallback;
299
  }
300
 
301
+ /**
302
+ * @return string
303
+ * @ignore
304
+ */
305
+ public function getSuggestedValuesApi()
306
+ {
307
+ return $this->suggestedValuesApi;
308
+ }
309
+
310
+ /**
311
+ * Set callback which will be executed when user will call for suggested values for segment.
312
+ *
313
+ * @param string $suggestedValuesApi
314
+ */
315
+ public function setSuggestedValuesApi($suggestedValuesApi)
316
+ {
317
+ if (!empty($suggestedValuesApi) && is_string($suggestedValuesApi)) {
318
+ if (Development::isEnabled() && strpos($suggestedValuesApi, '.get') === false) {
319
+ throw new Exception('Invalid suggested values API defined, expecting ".get" to be present.');
320
+ }
321
+ } else {
322
+ $suggestedValuesApi = '';
323
+ }
324
+ $this->suggestedValuesApi = $suggestedValuesApi;
325
+ }
326
+
327
  /**
328
  * You can restrict the access to this segment by passing a boolean `false`. For instance if you want to make
329
  * a certain segment only available to users having super user access you could do the following:
374
  $segment['suggestedValuesCallback'] = $this->suggestedValuesCallback;
375
  }
376
 
377
+ if (is_string($this->suggestedValuesApi) && !empty($this->suggestedValuesApi)) {
378
+ $segment['suggestedValuesApi'] = $this->suggestedValuesApi;
379
+ }
380
+
381
  return $segment;
382
  }
383
 
app/core/Tracker/GoalManager.php CHANGED
@@ -665,10 +665,6 @@ class GoalManager
665
 
666
  protected function getItemRowEnriched($goal, $item)
667
  {
668
- if (empty($goal['server_time'])) {
669
- // hack to test #215
670
- $goal['server_time'] = Date::getDatetimeFromTimestamp(time());
671
- }
672
  $newRow = array(
673
  'idaction_sku' => (int)$item[self::INTERNAL_ITEM_SKU],
674
  'idaction_name' => (int)$item[self::INTERNAL_ITEM_NAME],
@@ -886,10 +882,14 @@ class GoalManager
886
  $lastVisitTime = $request->getCurrentTimestamp();
887
  }
888
 
 
 
 
 
889
  $goal = array(
890
  'idvisit' => $visitProperties->getProperty('idvisit'),
891
  'idvisitor' => $visitProperties->getProperty('idvisitor'),
892
- 'server_time' => Date::getDatetimeFromTimestamp($lastVisitTime),
893
  );
894
 
895
  $visitDimensions = VisitDimension::getAllDimensions();
665
 
666
  protected function getItemRowEnriched($goal, $item)
667
  {
 
 
 
 
668
  $newRow = array(
669
  'idaction_sku' => (int)$item[self::INTERNAL_ITEM_SKU],
670
  'idaction_name' => (int)$item[self::INTERNAL_ITEM_NAME],
882
  $lastVisitTime = $request->getCurrentTimestamp();
883
  }
884
 
885
+ if (!empty($lastVisitTime) && is_numeric($lastVisitTime)) {
886
+ $lastVisitTime = Date::getDatetimeFromTimestamp($lastVisitTime);
887
+ }
888
+
889
  $goal = array(
890
  'idvisit' => $visitProperties->getProperty('idvisit'),
891
  'idvisitor' => $visitProperties->getProperty('idvisitor'),
892
+ 'server_time' => $lastVisitTime,
893
  );
894
 
895
  $visitDimensions = VisitDimension::getAllDimensions();
app/core/Updates/3.13.4-b1.php CHANGED
@@ -10,16 +10,16 @@
10
  namespace Piwik\Updates;
11
 
12
  use Piwik\Plugins\Installation\ServerFilesGenerator;
13
- use Piwik\SettingsServer;
14
  use Piwik\Updater;
15
  use Piwik\Updates as PiwikUpdates;
 
16
 
17
  class Updates_3_13_4_b1 extends PiwikUpdates
18
  {
19
  public function doUpdate(Updater $updater)
20
  {
21
- // Fix issue with HeatmapSessionRecording on IIS (https://github.com/matomo-org/matomo/issues/15651)
22
  if (SettingsServer::isIIS()) {
 
23
  ServerFilesGenerator::createFilesForSecurity();
24
  }
25
  }
10
  namespace Piwik\Updates;
11
 
12
  use Piwik\Plugins\Installation\ServerFilesGenerator;
 
13
  use Piwik\Updater;
14
  use Piwik\Updates as PiwikUpdates;
15
+ use Piwik\SettingsServer;
16
 
17
  class Updates_3_13_4_b1 extends PiwikUpdates
18
  {
19
  public function doUpdate(Updater $updater)
20
  {
 
21
  if (SettingsServer::isIIS()) {
22
+ // Fix issue with HeatmapSessionRecording on IIS (https://github.com/matomo-org/matomo/issues/15651)
23
  ServerFilesGenerator::createFilesForSecurity();
24
  }
25
  }
app/core/Updates/3.13.5-rc1.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Piwik - free/libre analytics platform
4
+ *
5
+ * @link https://matomo.org
6
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
+ *
8
+ */
9
+
10
+ namespace Piwik\Updates;
11
+
12
+ use Piwik\DataAccess\ArchiveTableCreator;
13
+ use Piwik\Date;
14
+ use Piwik\Plugins\CoreAdminHome\Tasks\ArchivesToPurgeDistributedList;
15
+ use Piwik\Updater;
16
+ use Piwik\Updates as PiwikUpdates;
17
+
18
+ class Updates_3_13_5_rc1 extends PiwikUpdates
19
+ {
20
+ public function doUpdate(Updater $updater)
21
+ {
22
+ $this->addArchivesToPurge();
23
+ }
24
+
25
+ private function addArchivesToPurge()
26
+ {
27
+ $archivesToPurge = new ArchivesToPurgeDistributedList();
28
+
29
+ $startOfProblem = Date::factory('2020-01-01 00:00:00');
30
+
31
+ $archiveTables = ArchiveTableCreator::getTablesArchivesInstalled(ArchiveTableCreator::NUMERIC_TABLE);
32
+ foreach ($archiveTables as $table) {
33
+ $date = ArchiveTableCreator::getDateFromTableName($table);
34
+ list($year, $month) = explode('_', $date);
35
+
36
+ // only add if the table is for jan 2020 or above since tables w/ that date will be most affected
37
+ try {
38
+ $dateObj = Date::factory("$year-$month-01 00:00:00");
39
+ } catch (\Exception $ex) {
40
+ continue; // date is too old for some reason
41
+ }
42
+
43
+ if ($dateObj->isEarlier($startOfProblem)) {
44
+ continue;
45
+ }
46
+
47
+ $archivesToPurge->add("{$year}_{$month}");
48
+ }
49
+ }
50
+ }
app/core/Version.php CHANGED
@@ -20,7 +20,7 @@ final class Version
20
  * The current Matomo version.
21
  * @var string
22
  */
23
- const VERSION = '3.13.4';
24
 
25
  public function isStableVersion($version)
26
  {
20
  * The current Matomo version.
21
  * @var string
22
  */
23
+ const VERSION = '3.13.5';
24
 
25
  public function isStableVersion($version)
26
  {
app/js/piwik.min.js CHANGED
@@ -8,7 +8,7 @@
8
  * @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
9
  * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
10
  */
11
- ;if(typeof JSON_PIWIK!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON_PIWIK=window.JSON}else{(function(){var a={};
12
  /*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
13
  (function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
14
  var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
@@ -38,38 +38,38 @@ if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq
38
  if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
- if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
- try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
- if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
- var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
- dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
46
- }function ay(){if(dc()){bQ()}bJ()}function df(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dc()){bQ()}}})}function cB(dm){var dj=new Date();var di=dj.getTime();cX=di;if(cA&&di<cA){var dk=cA-di;setTimeout(dm,dk);cf(dk+50);cA+=50;return}if(cA===false){var dl=800;cA=di+dl}dm()}function aO(){if(aC(cK)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dj,di,dk){aO();if(!bA){cI.push(dj);return}if(!cO&&dj){if(cz&&bA){dj+="&consent=1"}cB(function(){if(cV&&a6(dj,dk)){cf(100);return}if(c9==="POST"||String(dj).length>2000){c3(dj,dk)}else{cp(dj,dk)}cf(di)})}if(!aN){df()}}function cj(di){if(cO){return false}return(di&&di.length)}function c2(di,dm){if(!dm||dm>=di.length){return[di]}var dj=0;var dk=di.length;var dl=[];for(dj;dj<dk;dj+=dm){dl.push(di.slice(dj,dj+dm))}return dl}function de(dj,di){if(!cj(dj)){return}if(!bA){cI.push(dj);return}cB(function(){var dm=c2(dj,50);var dk=0,dl;for(dk;dk<dm.length;dk++){dl='{"requests":["?'+dm[dk].join('","?')+'"]}';
47
- c3(dl,null,false)}cf(di)})}function aT(di){return bj+di+"."+b5+"."+bn}function bX(dk,dj,di){dd(dk,"",-86400,dj,di)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var di=bj+"testcookie";dd(di,"1",undefined,bo,cW,bR);var dj=aC(di)==="1"?"1":"0";bX(di);return dj}function bh(){bn=b6((cW||cT)+(bo||"/")).slice(0,4)}function cF(){if(J(c7.res)){return c7}var dj,dl,dm={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dj in dm){if(Object.prototype.hasOwnProperty.call(dm,dj)){dl=h.mimeTypes[dm[dj]];c7[dj]=(dl&&dl.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c7.java="1"
48
- }if(A(T.GearsFactory)){c7.gears="1"}c7.cookie=b4()}var dk=parseInt(X.width,10);var di=parseInt(X.height,10);c7.res=parseInt(dk,10)+"x"+parseInt(di,10);return c7}function bW(){var dj=aT("cvar"),di=aC(dj);if(di.length){di=JSON_PIWIK.parse(di);if(W(di)){return di}}return{}}function cC(){if(aQ===false){aQ=bW()}}function cP(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dj=bf();var dk=az();var di=String(dj)+dk;return di}function c1(dk){dk=String(dk);var dn=az();var dl=dn.length;var dm=dk.substr(-1*dl,dl);var dj=parseInt(dk.substr(0,dk.length-dl),10);if(dj&&dm&&dm===dn){var di=bf();if(aZ<=0){return true}if(di>=dj&&di<=(dj+aZ)){return true}}return false}function dg(di){if(!cL){return""}var dm=f(di,av);if(!dm){return""}dm=String(dm);
49
- var dk=new RegExp("^[a-zA-Z0-9]+$");if(dm.length===32&&dk.test(dm)){var dj=dm.substr(16,32);if(c1(dj)){var dl=dm.substr(0,16);return dl}}return""}function cM(){if(!bN){bN=dg(bM)}var dk=new Date(),di=Math.round(dk.getTime()/1000),dj=aT("id"),dn=aC(dj),dm,dl;if(dn){dm=dn.split(".");dm.unshift("0");if(bN.length){dm[1]=bN}return dm}if(bN.length){dl=bN}else{if("0"===b4()){dl=""}else{dl=cP()}}dm=["1",dl,di,0,di,"",""];return dm}function aY(){var dq=cM(),dl=dq[0],dm=dq[1],dj=dq[2],di=dq[3],dn=dq[4],dk=dq[5];if(!J(dq[6])){dq[6]=""}var dp=dq[6];return{newVisitor:dl,uuid:dm,createTs:dj,visitCount:di,currentVisitTs:dn,lastVisitTs:dk,lastEcommerceOrderTs:dp}}function aG(){var dl=new Date(),dj=dl.getTime(),dm=aY().createTs;var di=parseInt(dm,10);var dk=(di*1000)+cH-dj;return dk}function aL(di){if(!b5){return}var dk=new Date(),dj=Math.round(dk.getTime()/1000);if(!J(di)){di=aY()}var dl=di.uuid+"."+di.createTs+"."+di.visitCount+"."+dj+"."+di.lastVisitTs+"."+di.lastEcommerceOrderTs;dd(aT("id"),dl,aG(),bo,cW,bR)
50
- }function bL(){var di=aC(aT("ref"));if(di.length){try{di=JSON_PIWIK.parse(di);if(W(di)){return di}}catch(dj){}}return["","",0,""]}function bv(dj){var di="testvalue";dd("test",di,10000,null,dj);if(aC("test")===di){bX("test",null,dj);return true}return false}function aE(){var dj=bk;bk=false;var di,dk;for(di=0;di<bt.length;di++){dk=aT(bt[di]);if(dk!==cK&&dk!==bd&&0!==aC(dk)){bX(dk,bo,cW)}}bk=dj}function b2(di){b5=di;aL()}function dh(dm){if(!dm||!W(dm)){return}var dl=[];var dk;for(dk in dm){if(Object.prototype.hasOwnProperty.call(dm,dk)){dl.push(dk)}}var dn={};dl.sort();var di=dl.length;var dj;for(dj=0;dj<di;dj++){dn[dl[dj]]=dm[dl[dj]]}return dn}function cc(){dd(aT("ses"),"1",co,bo,cW,bR)}function bg(){var dl="";var dj="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dk=dj.length;var di;for(di=0;di<6;di++){dl+=dj.charAt(Math.floor(Math.random()*dk))}return dl}function cs(dk,dG,dH,dl){var dF,dj=new Date(),dt=Math.round(dj.getTime()/1000),dq,dE,dm=1024,dN,du,dC=aQ,dn=aT("ses"),dA=aT("ref"),dx=aT("cvar"),dy=aC(dn),dD=bL(),dJ=a4||bM,dr,di;
51
- if(bk){aE()}if(cO){return""}var dz=aY();if(!J(dl)){dl=""}var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dD[0];di=dD[1];dq=dD[2];dE=dD[3];if(!dy){var dI=co/1000;if(!dz.lastVisitTs||(dt-dz.lastVisitTs)>dI){dz.visitCount++;dz.lastVisitTs=dz.currentVisitTs}if(!bu||!dr.length){for(dF in cq){if(Object.prototype.hasOwnProperty.call(cq,dF)){dr=f(dJ,cq[dF]);if(dr.length){break}}}for(dF in bF){if(Object.prototype.hasOwnProperty.call(bF,dF)){di=f(dJ,bF[dF]);if(di.length){break}}}}dN=d(bm);du=dE.length?d(dE):"";if(dN.length&&!aV(dN)&&(!bu||!du.length||aV(du))){dE=bm}if(dE.length||dr.length){dq=dt;dD=[dr,di,dq,b1(dE.slice(0,dm))];dd(dA,JSON_PIWIK.stringify(dD),c4,bo,cW)}}dk+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dj.getHours()+"&m="+dj.getMinutes()+"&s="+dj.getSeconds()+"&url="+t(b1(dJ))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dz.uuid+"&_idts="+dz.createTs+"&_idvc="+dz.visitCount+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+t(dr):"")+(di.length?"&_rck="+t(di):"")+"&_refts="+dq+"&_viewts="+dz.lastVisitTs+(String(dz.lastEcommerceOrderTs).length?"&_ects="+dz.lastEcommerceOrderTs:"")+(String(dE).length?"&_ref="+t(b1(dE.slice(0,dm))):"")+(dw?"&cs="+t(dw):"")+"&send_image=0";
52
- var dM=cF();for(dF in dM){if(Object.prototype.hasOwnProperty.call(dM,dF)){dk+="&"+dF+"="+dM[dF]}}var dL=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dL.push(parseInt(dp,10));dL.push(String(dp));dk+="&"+dF+"="+t(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in bl){if(Object.prototype.hasOwnProperty.call(bl,dF)){var dv=(-1===M(dL,dF));if(dv){dk+="&dimension"+dF+"="+t(bl[dF])}}}if(dG){dk+="&data="+t(JSON_PIWIK.stringify(dG))}else{if(ao){dk+="&data="+t(JSON_PIWIK.stringify(ao))}}function ds(dO,dP){var dQ=JSON_PIWIK.stringify(dO);if(dQ.length>2){return"&"+dP+"="+t(dQ)}return""}var dK=dh(bV);var dB=dh(cl);dk+=ds(dK,"cvar");dk+=ds(dB,"e_cvar");if(aQ){dk+=ds(aQ,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aQ[dF][0]===""||aQ[dF][1]===""){delete aQ[dF]}}}if(bP){dd(dx,JSON_PIWIK.stringify(aQ),co,bo,cW)}}if(a2){if(cm){dk+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dk+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
53
- }}}if(aK){dk+="&pv_id="+aK}dz.lastEcommerceOrderTs=J(dl)&&String(dl).length?dl:dz.lastEcommerceOrderTs;aL(dz);cc();dk+=ac(dH,{tracker:bH,request:dk});if(cY.length){dk+="&"+cY}if(A(ca)){dk=ca(dk)}return dk}bQ=function a7(){var di=new Date();di=di.getTime();if(!cX){return false}if((cX+(1000*c6))<=di){return false}if(cX+a5<=di){bH.ping();return true}return false};function bp(dl,dk,dr,dm,di,du){var dp="idgoal=0",dq,dj=new Date(),ds=[],dt,dn=String(dl).length;if(dn){dp+="&ec_id="+t(dl);dq=Math.round(dj.getTime()/1000)}dp+="&revenue="+dk;if(String(dr).length){dp+="&ec_st="+dr}if(String(dm).length){dp+="&ec_tx="+dm}if(String(di).length){dp+="&ec_sh="+di}if(String(du).length){dp+="&ec_dt="+du}if(cZ){for(dt in cZ){if(Object.prototype.hasOwnProperty.call(cZ,dt)){if(!J(cZ[dt][1])){cZ[dt][1]=""}if(!J(cZ[dt][2])){cZ[dt][2]=""}if(!J(cZ[dt][3])||String(cZ[dt][3]).length===0){cZ[dt][3]=0}if(!J(cZ[dt][4])||String(cZ[dt][4]).length===0){cZ[dt][4]=1}ds.push(cZ[dt])}}dp+="&ec_items="+t(JSON_PIWIK.stringify(ds))
54
- }dp=cs(dp,ao,"ecommerce",dq);bE(dp,bI);if(dn){cZ={}}}function bY(di,dm,dl,dk,dj,dn){if(String(di).length&&J(dm)){bp(di,dm,dl,dk,dj,dn)}}function br(di){if(J(di)){bp("",di,"","","","")}}function bZ(dj,dl,dk){aK=bg();var di=cs("action_name="+t(al(dj||bi)),dl,"log");bE(di,bI,dk)}function a0(dk,dj){var dl,di="(^| )(piwik[_-]"+dj;if(dk){for(dl=0;dl<dk.length;dl++){di+="|"+dk[dl]}}di+=")( |$)";return new RegExp(di)}function aU(di){return(aD&&di&&0===String(di).indexOf(aD))}function cu(dm,di,dn,dj){if(aU(di)){return 0}var dl=a0(bK,"download"),dk=a0(a8,"link"),dp=new RegExp("\\.("+c5.join("|")+")([?&#]|$)","i");if(dk.test(dm)){return"link"}if(dj||dl.test(dm)||dp.test(di)){return"download"}if(dn){return 0}return"link"}function au(dj){var di;di=dj.parentNode;while(di!==null&&J(di)){if(ae.isLinkElement(dj)){break}dj=di;di=dj.parentNode}return dj}function db(dn){dn=au(dn);if(!ae.hasNodeAttribute(dn,"href")){return}if(!J(dn.href)){return}var dm=ae.getAttributeValueFromNode(dn,"href");if(aU(dm)){return
55
- }var dj=dn.pathname||ck(dn.href);var dp=dn.hostname||d(dn.href);var dq=dp.toLowerCase();var dk=dn.href.replace(dp,dq);var dl=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dl.test(dk)){var di=cu(dn.className,dk,ar(dq,dj),ae.hasNodeAttribute(dn,"download"));if(di){return{type:di,href:dk}}}}function aP(di,dj,dk,dl){var dm=v.buildInteractionRequestParams(di,dj,dk,dl);if(!dm){return}return cs(dm,null,"contentInteraction")}function cJ(dk,dl,dq,di,dj){if(!J(dk)){return}if(aU(dk)){return dk}var dn=v.toAbsoluteUrl(dk);var dm="redirecturl="+t(dn)+"&";dm+=aP(dl,dq,di,(dj||dk));var dp="&";if(aD.indexOf("?")<0){dp="?"}return aD+dp+dm}function bb(di,dj){if(!di||!dj){return false}var dk=v.findTargetNode(di);if(v.shouldIgnoreInteraction(dk)){return false}dk=v.findTargetNodeNoDefault(di);if(dk&&!V(dk,dj)){return false}return true}function ct(dk,dj,dm){if(!dk){return}var di=v.findParentContentNode(dk);if(!di){return}if(!bb(di,dk)){return}var dl=v.buildContentBlock(di);
56
- if(!dl){return}if(!dl.target&&dm){dl.target=dm}return v.buildInteractionRequestParams(dj,dl.name,dl.piece,dl.target)}function aW(dj){if(!b9||!b9.length){return false}var di,dk;for(di=0;di<b9.length;di++){dk=b9[di];if(dk&&dk.name===dj.name&&dk.piece===dj.piece&&dk.target===dj.target){return true}}return false}function bD(dl){if(!dl){return false}var dp=v.findTargetNode(dl);if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dq=db(dp);if(c8&&dq&&dq.type){return false}if(ae.isLinkElement(dp)&&ae.hasNodeAttributeWithValue(dp,"href")){var di=String(ae.getAttributeValueFromNode(dp,"href"));if(0===di.indexOf("#")){return false}if(aU(di)){return true}if(!v.isUrlToCurrentDomain(di)){return false}var dm=v.buildContentBlock(dl);if(!dm){return}var dk=dm.name;var dr=dm.piece;var dn=dm.target;if(!ae.hasNodeAttributeWithValue(dp,v.CONTENT_TARGET_ATTR)||dp.wasContentTargetAttrReplaced){dp.wasContentTargetAttrReplaced=true;dn=v.toAbsoluteUrl(di);ae.setAnyAttribute(dp,v.CONTENT_TARGET_ATTR,dn)}var dj=cJ(di,"click",dk,dr,dn);
57
- v.setHrefAttribute(dp,dj);return true}return false}function aM(dj){if(!dj||!dj.length){return}var di;for(di=0;di<dj.length;di++){bD(dj[di])}}function aX(di){return function(dj){if(!di){return}var dm=v.findParentContentNode(di);var dn;if(dj){dn=dj.target||dj.srcElement}if(!dn){dn=di}if(!bb(dm,dn)){return}cf(bI);if(ae.isLinkElement(di)&&ae.hasNodeAttributeWithValue(di,"href")&&ae.hasNodeAttributeWithValue(di,v.CONTENT_TARGET_ATTR)){var dk=ae.getAttributeValueFromNode(di,"href");if(!aU(dk)&&di.wasContentTargetAttrReplaced){ae.setAnyAttribute(di,v.CONTENT_TARGET_ATTR,"")}}var ds=db(di);if(ap&&ds&&ds.type){return ds.type}if(bD(dm)){return"href"}var dp=v.buildContentBlock(dm);if(!dp){return}var dl=dp.name;var dt=dp.piece;var dr=dp.target;var dq=aP("click",dl,dt,dr);if(dq){bE(dq,bI)}return dq}}function b0(dk){if(!dk||!dk.length){return}var di,dj;for(di=0;di<dk.length;di++){dj=v.findTargetNode(dk[di]);if(dj&&!dj.contentInteractionTrackingSetupDone){dj.contentInteractionTrackingSetupDone=true;an(dj,"click",aX(dj))
58
- }}}function bw(dk,dl){if(!dk||!dk.length){return[]}var di,dj;for(di=0;di<dk.length;di++){if(aW(dk[di])){dk.splice(di,1);di--}else{b9.push(dk[di])}}if(!dk||!dk.length){return[]}aM(dl);b0(dl);var dm=[];for(di=0;di<dk.length;di++){dj=cs(v.buildImpressionRequestParams(dk[di].name,dk[di].piece,dk[di].target),undefined,"contentImpressions");if(dj){dm.push(dj)}}return dm}function cy(dj){var di=v.collectContent(dj);return bw(di,dj)}function a9(dj){if(!dj||!dj.length){return[]}var di;for(di=0;di<dj.length;di++){if(!v.isNodeVisible(dj[di])){dj.splice(di,1);di--}}if(!dj||!dj.length){return[]}return cy(dj)}function aF(dk,di,dj){var dl=v.buildImpressionRequestParams(dk,di,dj);return cs(dl,null,"contentImpression")}function da(dl,dj){if(!dl){return}var di=v.findParentContentNode(dl);var dk=v.buildContentBlock(di);if(!dk){return}if(!dj){dj="Unknown"}return aP(dj,dk.name,dk.piece,dk.target)}function cN(dj,dl,di,dk){return"e_c="+t(dj)+"&e_a="+t(dl)+(J(di)?"&e_n="+t(di):"")+(J(dk)?"&e_v="+t(dk):"")}function at(dk,dm,di,dl,dp,dn){if(a(String(dk)).length===0||a(String(dm)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
59
- return false}var dj=cs(cN(dk,dm,di,dl),dp,"event");bE(dj,bI,dn)}function b7(di,dl,dj,dm){var dk=cs("search="+t(di)+(dl?"&search_cat="+t(dl):"")+(J(dj)?"&search_count="+dj:""),dm,"sitesearch");bE(dk,bI)}function cS(di,dm,dl,dk){var dj=cs("idgoal="+di+(dm?"&revenue="+dm:""),dl,"goal");bE(dj,bI,dk)}function c0(dl,di,dq,dp,dk){var dn=di+"="+t(b1(dl));var dj=ct(dk,"click",dl);if(dj){dn+="&"+dj}var dm=cs(dn,dq,"link");bE(dm,bI,dp)}function bT(dj,di){if(dj!==""){return dj+di.charAt(0).toUpperCase()+di.slice(1)}return di}function cg(dn){var dm,di,dl=["","webkit","ms","moz"],dk;if(!be){for(di=0;di<dl.length;di++){dk=dl[di];if(Object.prototype.hasOwnProperty.call(G,bT(dk,"hidden"))){if(G[bT(dk,"visibilityState")]==="prerender"){dm=true}break}}}if(dm){an(G,dk+"visibilitychange",function dj(){G.removeEventListener(dk+"visibilitychange",dj,false);dn()});return}dn()}function bq(){var dj=aY().uuid;var di=aI();return dj+di}function ci(di){if(!di){return}if(!ae.hasNodeAttribute(di,"href")){return}var dj=ae.getAttributeValueFromNode(di,"href");
60
- if(!dj||aU(dj)){return}dj=k(dj,av);var dk=bq();dj=F(dj,av,dk);ae.setAnyAttribute(di,"href",dj)}function aA(dl){var dm=ae.getAttributeValueFromNode(dl,"href");if(!dm){return false}dm=String(dm);var dj=dm.indexOf("//")===0||dm.indexOf("http://")===0||dm.indexOf("https://")===0;if(!dj){return false}var di=dl.pathname||ck(dl.href);var dk=(dl.hostname||d(dl.href)).toLowerCase();if(ar(dk,di)){if(!cE(cT,L(dk))){return true}return false}return false}function cD(di){var dj=db(di);if(dj&&dj.type){dj.href=p(dj.href);c0(dj.href,dj.type,undefined,null,di);return}if(cL){di=au(di);if(aA(di)){ci(di)}}}function cv(){return G.all&&!G.addEventListener}function cU(di){var dk=di.which;var dj=(typeof di.button);if(!dk&&dj!=="undefined"){if(cv()){if(di.button&1){dk=1}else{if(di.button&2){dk=3}else{if(di.button&4){dk=2}}}}else{if(di.button===0||di.button==="0"){dk=1}else{if(di.button&1){dk=2}else{if(di.button&2){dk=3}}}}}return dk}function bS(di){switch(cU(di)){case 1:return"left";case 2:return"middle";case 3:return"right"
61
- }}function a1(di){return di.target||di.srcElement}function aB(di){return function(dl){dl=dl||T.event;var dk=bS(dl);var dm=a1(dl);if(dl.type==="click"){var dj=false;if(di&&dk==="middle"){dj=true}if(dm&&!dj){cD(dm)}}else{if(dl.type==="mousedown"){if(dk==="middle"&&dm){aR=dk;bz=dm}else{aR=bz=null}}else{if(dl.type==="mouseup"){if(dk===aR&&dm===bz){cD(dm)}aR=bz=null}else{if(dl.type==="contextmenu"){cD(dm)}}}}}}function aq(dk,dj){var di=typeof dj;if(di==="undefined"){dj=true}an(dk,"click",aB(dj),false);if(dj){an(dk,"mouseup",aB(dj),false);an(dk,"mousedown",aB(dj),false);an(dk,"contextmenu",aB(dj),false)}}function bC(dk,dm){ap=true;var dl,dj=a0(by,"ignore"),dn=G.links,di=null,dp=null;if(dn){for(dl=0;dl<dn.length;dl++){di=dn[dl];if(!dj.test(di.className)){dp=typeof di.piwikTrackers;if("undefined"===dp){di.piwikTrackers=[]}if(-1===M(di.piwikTrackers,dm)){di.piwikTrackers.push(dm);aq(di,dk)}}}}}function aS(dj,dm,dn){if(ce){return true}ce=true;var dp=false;var dl,dk;function di(){dp=true}n(function(){function dq(ds){setTimeout(function(){if(!ce){return
62
- }dp=false;dn.trackVisibleContentImpressions();dq(ds)},ds)}function dr(ds){setTimeout(function(){if(!ce){return}if(dp){dp=false;dn.trackVisibleContentImpressions()}dr(ds)},ds)}if(dj){dl=["scroll","resize"];for(dk=0;dk<dl.length;dk++){if(G.addEventListener){G.addEventListener(dl[dk],di,false)}else{T.attachEvent("on"+dl[dk],di)}}dr(100)}if(dm&&dm>0){dm=parseInt(dm,10);dq(dm)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var di=this.requests;this.requests=[];if(di.length===1){bE(di[0],bI)}else{de(di,bI)}},push:function(di){if(!di){return}if(m||!this.enabled){bE(di,bI);return}bB.requests.push(di);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dj="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dj)){b[dj]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
63
- };this.getVisitorInfo=function(){return cM()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(di){aD=di};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(di,dk){if(!J(di)||null===di){di=this.getTrackerUrl()}var dj=new Q(di,dk);I.push(dj);e.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b5};this.setSiteId=function(di){b2(di)};this.resetUserId=function(){bx=""};this.setUserId=function(di){if(Y(di)){bx=di}};this.getUserId=function(){return bx};this.setCustomData=function(di,dj){if(W(di)){ao=di}else{if(!ao){ao={}}ao[di]=dj}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(di){ca=di};this.appendToTrackingUrl=function(di){cY=di
64
- };this.getRequest=function(di){return cs(di)};this.addPlugin=function(di,dj){b[di]=dj};this.setCustomDimension=function(di,dj){di=parseInt(di,10);if(di>0){if(!J(dj)){dj=""}if(!w(dj)){dj=String(dj)}bl[di]=dj}};this.getCustomDimension=function(di){di=parseInt(di,10);if(di>0&&Object.prototype.hasOwnProperty.call(bl,di)){return bl[di]}};this.deleteCustomDimension=function(di){di=parseInt(di,10);if(di>0){delete bl[di]}};this.setCustomVariable=function(dj,di,dm,dk){var dl;if(!J(dk)){dk="visit"}if(!J(di)){return}if(!J(dm)){dm=""}if(dj>0){di=!w(di)?String(di):di;dm=!w(dm)?String(dm):dm;dl=[di.slice(0,bs),dm.slice(0,bs)];if(dk==="visit"||dk===2){cC();aQ[dj]=dl}else{if(dk==="page"||dk===3){bV[dj]=dl}else{if(dk==="event"){cl[dj]=dl}}}}};this.getCustomVariable=function(dj,dk){var di;if(!J(dk)){dk="visit"}if(dk==="page"||dk===3){di=bV[dj]}else{if(dk==="event"){di=cl[dj]}else{if(dk==="visit"||dk===2){cC();di=aQ[dj]}}}if(!J(di)||(di&&di[0]==="")){return false}return di};this.deleteCustomVariable=function(di,dj){if(this.getCustomVariable(di,dj)){this.setCustomVariable(di,"","",dj)
65
- }};this.deleteCustomVariables=function(di){if(di==="page"||di===3){bV={}}else{if(di==="event"){cl={}}else{if(di==="visit"||di===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(di){bI=di};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(di){if(w(di)){di=di.split("|")}c5=di};this.addDownloadExtensions=function(dj){var di;if(w(dj)){dj=dj.split("|")}for(di=0;di<dj.length;di++){c5.push(dj[di])}};this.removeDownloadExtensions=function(dk){var dj,di=[];if(w(dk)){dk=dk.split("|")}for(dj=0;dj<c5.length;dj++){if(M(dk,c5[dj])===-1){di.push(c5[dj])}}c5=di};this.setDomains=function(di){ax=w(di)?[di]:di;var dm=false,dk=0,dj;for(dk;dk<ax.length;dk++){dj=String(ax[dk]);if(cE(cT,L(dj))){dm=true;break}var dl=ck(dj);if(dl&&dl!=="/"&&dl!=="/*"){dm=true;break}}if(!dm){ax.push(cT)}};this.enableCrossDomainLinking=function(){cL=true};this.disableCrossDomainLinking=function(){cL=false};this.isCrossDomainLinkingEnabled=function(){return cL
66
- };this.setCrossDomainLinkingTimeout=function(di){aZ=di};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(di){by=w(di)?[di]:di};this.setRequestMethod=function(di){c9=di||ch};this.setRequestContentType=function(di){cw=di||aH};this.setReferrerUrl=function(di){bm=di};this.setCustomUrl=function(di){a4=bU(bM,di)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(di){bi=di};this.setAPIUrl=function(di){bG=di};this.setDownloadClasses=function(di){bK=w(di)?[di]:di};this.setLinkClasses=function(di){a8=w(di)?[di]:di};this.setCampaignNameKey=function(di){cq=w(di)?[di]:di};this.setCampaignKeywordKey=function(di){bF=w(di)?[di]:di};this.discardHashTag=function(di){bO=di};this.setCookieNamePrefix=function(di){bj=di;aQ=bW()};this.setCookieDomain=function(di){var dj=L(di);if(bv(dj)){cW=dj;bh()}};this.getCookieDomain=function(){return cW};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dk,dj,di){if(!dk){throw new Error("Missing cookie name")
67
- }if(!J(di)){di=co}bt.push(dk);dd(aT(dk),dj,di,bo,cW)};this.getCookie=function(dj){var di=aC(aT(dj));if(di===0){return null}return di};this.setCookiePath=function(di){bo=di;bh()};this.getCookiePath=function(di){return bo};this.setVisitorCookieTimeout=function(di){cH=di*1000};this.setSessionCookieTimeout=function(di){co=di*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(di){c4=di*1000};this.setConversionAttributionFirstReferrer=function(di){bu=di};this.setSecureCookie=function(di){bR=di};this.disableCookies=function(){bk=true;c7.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dj){var di=h.doNotTrack||h.msDoNotTrack;cO=dj&&(di==="yes"||di==="1");if(cO){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cV=true};this.addListener=function(dj,di){aq(dj,di)};this.enableLinkTracking=function(dj){c8=true;var di=this;cg(function(){q(function(){bC(dj,di)})})};this.enableJSErrorTracking=function(){if(cR){return
68
- }cR=true;var di=T.onerror;T.onerror=function(dn,dl,dk,dm,dj){cg(function(){var dp="JavaScript Errors";var dq=dl+":"+dk;if(dm){dq+=":"+dm}at(dp,dq,dn)});if(di){return di(dn,dl,dk,dm,dj)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(di){cm=parseInt(di,10)};this.setVisitStandardLength=function(di){di=Math.max(di,5);c6=di};this.enableHeartBeatTimer=function(di){di=Math.max(di,5);a5=(di||15)*1000;if(cX!==null){df()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(di){if(T.location.protocol==="file:"){T.location=di}};this.setCountPreRendered=function(di){be=di};this.trackGoal=function(di,dl,dk,dj){cg(function(){cS(di,dl,dk,dj)})};this.trackLink=function(dj,di,dl,dk){cg(function(){c0(dj,di,dl,dk)
69
- })};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(di,dk,dj){b9=[];cI=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(di,dk,dj)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var di=v.findContentNodes();var dj=cy(di);de(dj,bI)})})};this.trackVisibleContentImpressions=function(di,dj){if(N(b5)){return}if(!J(di)){di=true}if(!J(dj)){dj=750}aS(di,dj,this);cg(function(){n(function(){var dk=v.findContentNodes();var dl=a9(dk);de(dl,bI)})})};this.trackContentImpression=function(dk,di,dj){if(N(b5)){return}dk=a(dk);di=a(di);dj=a(dj);if(!dk){return}di=di||"Unknown";cg(function(){var dl=aF(dk,di,dj);bE(dl,bI)})};this.trackContentImpressionsWithinNode=function(di){if(N(b5)||!di){return}cg(function(){if(ce){n(function(){var dj=v.findContentNodesWithinNode(di);var dk=a9(dj);de(dk,bI)})}else{q(function(){var dj=v.findContentNodesWithinNode(di);var dk=cy(dj);de(dk,bI)})}})};this.trackContentInteraction=function(dk,dl,di,dj){if(N(b5)){return
70
- }dk=a(dk);dl=a(dl);di=a(di);dj=a(dj);if(!dk||!dl){return}di=di||"Unknown";cg(function(){var dm=aP(dk,dl,di,dj);if(dm){bE(dm,bI)}})};this.trackContentInteractionNode=function(dj,di){if(N(b5)||!dj){return}cg(function(){var dk=da(dj,di);if(dk){bE(dk,bI)}})};this.logAllContentBlocksOnPage=function(){var dk=v.findContentNodes();var di=v.collectContent(dk);var dj=typeof console;if(dj!=="undefined"&&console&&console.log){console.log(di)}};this.trackEvent=function(dj,dl,di,dk,dn,dm){cg(function(){at(dj,dl,di,dk,dn,dm)})};this.trackSiteSearch=function(di,dk,dj,dl){b9=[];cg(function(){b7(di,dk,dj,dl)})};this.setEcommerceView=function(dl,di,dk,dj){if(Y(dk)){dk=String(dk)}if(!J(dk)||dk===null||dk===false||!dk.length){dk=""}else{if(dk instanceof Array){dk=JSON_PIWIK.stringify(dk)}}bV[5]=["_pkc",dk];if(J(dj)&&dj!==null&&dj!==false&&String(dj).length){bV[2]=["_pkp",dj]}if(!Y(dl)&&!Y(di)){return}if(Y(dl)){bV[3]=["_pks",dl]}if(!Y(di)){di=""}bV[4]=["_pkn",di]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cZ))
71
- };this.addEcommerceItem=function(dm,di,dk,dj,dl){if(Y(dm)){cZ[dm]=[String(dm),di,dk,dj,dl]}};this.removeEcommerceItem=function(di){if(Y(di)){di=String(di);delete cZ[di]}};this.clearEcommerceCart=function(){cZ={}};this.trackEcommerceOrder=function(di,dm,dl,dk,dj,dn){bY(di,dm,dl,dk,dj,dn)};this.trackEcommerceCartUpdate=function(di){br(di)};this.trackRequest=function(dj,dl,dk,di){cg(function(){var dm=cs(dj,dl,di);bE(dm,bI,dk)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(di){if(di<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=di};this.queueRequest=function(di){cg(function(){var dj=cs(di);bB.push(dj)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var di=aC(bd);if(aC(cK)){if(di){bX(bd,bo,cW)}return null}if(!di||di===0){return null}return di};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
72
- };this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cK,bo,cW);var dj,di;for(dj=0;dj<cI.length;dj++){di=typeof cI[dj];if(di==="string"){bE(cI[dj],bI)}else{if(di==="object"){de(cI[dj],bI)}}}cI=[]};this.rememberConsentGiven=function(dj){if(dj){dj=dj*60*60*1000}else{dj=30*365*24*60*60*1000}this.setConsentGiven();var di=new Date().getTime();dd(bd,di,dj,bo,cW,bR)};this.forgetConsentGiven=function(){var di=30*365*24*60*60*1000;bX(bd,bo,cW);dd(cK,new Date().getTime(),di,bo,cW,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
73
  if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
74
  if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
75
  }y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
8
  * @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
9
  * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
10
  */
11
+ ;if(typeof window.JSON==="object"&&typeof window.JSON.stringify==="function"&&typeof window.JSON.parse==="function"){JSON_PIWIK=window.JSON}else{(function(){var a={};
12
  /*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
13
  (function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
14
  var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
38
  if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
+ if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cL="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cU=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cS=false,ch="GET",da=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cZ="",b5=b8||"",bx="",bN="",a4,bi="",c6=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cU],by=[],bK=[],a8=[],bI=500,cW=false,cH,a5,bQ,c7=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cX,bo,bR=false,bk=false,cP,be,bu,cI=33955200000,co=1800000,c5=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,c0={},c8={},b9=[],ce=false,cA=false,ap=false,c9=false,cM=false,aN=false,bc=u(),cR=null,cY=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cJ=[],aw=U++;
42
+ try{bi=G.title}catch(cx){bi=""}function de(dq,dn,dm,dp,dl,dk){if(bk){return}var dj;if(dm){dj=new Date();dj.setTime(dj.getTime()+dm)}G.cookie=dq+"="+t(dn)+(dm?";expires="+dj.toGMTString():"")+";path="+(dp||"/")+(dl?";domain="+dl:"")+(dk?";secure":"")+";SameSite=Lax"}function aC(dl){if(bk){return 0}var dj=new RegExp("(^|;)[ ]*"+dl+"=([^;]*)"),dk=dj.exec(G.cookie);return dk?S(dk[2]):0}bA=!aC(cL);function b1(dj){var dk;dj=k(dj,av);if(bO){dk=new RegExp("#.*");return dj.replace(dk,"")}return dj}function bU(dl,dj){var dm=s(dj),dk;if(dm){return dj}if(dj.slice(0,1)==="/"){return s(dl)+"://"+d(dl)+dj}dl=b1(dl);dk=dl.indexOf("?");if(dk>=0){dl=dl.slice(0,dk)}dk=dl.lastIndexOf("/");if(dk!==dl.length-1){dl=dl.slice(0,dk+1)}return dl+dj}function cF(dl,dj){var dk;dl=String(dl).toLowerCase();dj=String(dj).toLowerCase();if(dl===dj){return true}if(dj.slice(0,1)==="."){if(dl===dj.slice(1)){return true}dk=dl.length-dj.length;if((dk>0)&&(dl.slice(dk)===dj)){return true}}return false}function ck(dj){var dk=document.createElement("a");
43
+ if(dj.indexOf("//")!==0&&dj.indexOf("http")!==0){if(dj.indexOf("*")===0){dj=dj.substr(1)}if(dj.indexOf(".")===0){dj=dj.substr(1)}dj="http://"+dj}dk.href=v.toAbsoluteUrl(dj);if(dk.pathname){return dk.pathname}return""}function a3(dk,dj){if(!aj(dj,"/")){dj="/"+dj}if(!aj(dk,"/")){dk="/"+dk}var dl=(dj==="/"||dj==="/*");if(dl){return true}if(dk===dj){return true}dj=String(dj).toLowerCase();dk=String(dk).toLowerCase();if(R(dj,"*")){dj=dj.slice(0,-1);dl=(!dj||dj==="/");if(dl){return true}if(dk===dj){return true}return dk.indexOf(dj)===0}if(!R(dk,"/")){dk+="/"}if(!R(dj,"/")){dj+="/"}return dk.indexOf(dj)===0}function ar(dn,dq){var dk,dj,dl,dm,dp;for(dk=0;dk<ax.length;dk++){dm=L(ax[dk]);dp=ck(ax[dk]);if(cF(dn,dm)&&a3(dq,dp)){return true}}return false}function aV(dm){var dk,dj,dl;for(dk=0;dk<ax.length;dk++){dj=L(ax[dk].toLowerCase());if(dm===dj){return true}if(dj.slice(0,1)==="."){if(dm===dj.slice(1)){return true}dl=dm.length-dj.length;if((dl>0)&&(dm.slice(dl)===dj)){return true}}}return false}function cp(dj,dl){dj=dj.replace("send_image=0","send_image=1");
44
+ var dk=new Image(1,1);dk.onload=function(){E=0;if(typeof dl==="function"){dl({request:dj,trackerUrl:aD,success:true})}};dk.onerror=function(){if(typeof dl==="function"){dl({request:dj,trackerUrl:aD,success:false})}};dk.src=aD+(aD.indexOf("?")<0?"?":"&")+dj}function cC(dj){if(da==="POST"){return true}return dj&&(dj.length>2000||dj.indexOf('{"requests"')===0)}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dn,dr,dq){var dl=aJ();if(!dl){return false}var dm={type:"application/x-www-form-urlencoded; charset=UTF-8"};var ds=false;var dk=aD;try{var dj=new Blob([dn],dm);if(dq&&!cC(dn)){dj=new Blob([],dm);dk=dk+(dk.indexOf("?")<0?"?":"&")+dn}ds=h.sendBeacon(dk,dj)}catch(dp){return false}if(ds&&typeof dr==="function"){dr({request:dn,trackerUrl:aD,success:true,isSendBeacon:true})}return ds}function c4(dk,dl,dj){if(!J(dj)||null===dj){dj=true}if(m&&a6(dk,dl,dj)){return}setTimeout(function(){if(m&&a6(dk,dl,dj)){return}var dp;try{var dn=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;
45
+ dn.open("POST",aD,true);dn.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dq=m&&a6(dk,dl,dj);if(!dq&&dj){cp(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dl==="function")){dl({request:dk,trackerUrl:aD,success:true,xhr:this})}}};dn.setRequestHeader("Content-Type",cw);dn.withCredentials=true;dn.send(dk)}catch(dm){dp=m&&a6(dk,dl,dj);if(!dp&&dj){cp(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aD,success:false})}}}},50)}function cf(dk){var dj=new Date();var dl=dj.getTime()+dk;if(!r||dl>r){r=dl}}function cn(dj){if(cb||!a5||!bA){return}cb=setTimeout(function dk(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dl=new Date(),dm=a5-(dl.getTime()-cY);dm=Math.min(a5,dm);cn(dm)},dj||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cR=new Date().getTime()}function dd(){var dj=new Date().getTime();
46
+ return !cR||(dj-cR)>a5}function ay(){if(dd()){bQ()}bJ()}function dg(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dd()){bQ()}}})}function cB(dn){var dk=new Date();var dj=dk.getTime();cY=dj;if(cA&&dj<cA){var dl=cA-dj;setTimeout(dn,dl);cf(dl+50);cA+=50;return}if(cA===false){var dm=800;cA=dj+dm}dn()}function aO(){if(aC(cL)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dk,dj,dl){aO();if(!bA){cJ.push(dk);return}if(!cP&&dk){if(cz&&bA){dk+="&consent=1"}cB(function(){if(cW&&a6(dk,dl,true)){cf(100);return}if(cC(dk)){c4(dk,dl)}else{cp(dk,dl)}cf(dj)})}if(!aN){dg()}}function cj(dj){if(cP){return false}return(dj&&dj.length)}function c3(dj,dn){if(!dn||dn>=dj.length){return[dj]}var dk=0;var dl=dj.length;var dm=[];for(dk;dk<dl;dk+=dn){dm.push(dj.slice(dk,dk+dn))}return dm}function df(dk,dj){if(!cj(dk)){return}if(!bA){cJ.push(dk);return}cB(function(){var dn=c3(dk,50);var dl=0,dm;for(dl;dl<dn.length;dl++){dm='{"requests":["?'+dn[dl].join('","?')+'"]}';
47
+ if(cW&&a6(dm,null,false)){cf(100)}else{c4(dm,null,false)}}cf(dj)})}function aT(dj){return bj+dj+"."+b5+"."+bn}function bX(dl,dk,dj){de(dl,"",-86400,dk,dj)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var dj=bj+"testcookie";de(dj,"1",undefined,bo,cX,bR);var dk=aC(dj)==="1"?"1":"0";bX(dj);return dk}function bh(){bn=b6((cX||cU)+(bo||"/")).slice(0,4)}function cG(){if(J(c8.res)){return c8}var dk,dm,dn={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dk in dn){if(Object.prototype.hasOwnProperty.call(dn,dk)){dm=h.mimeTypes[dn[dk]];c8[dk]=(dm&&dm.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c8.java="1"
48
+ }if(A(T.GearsFactory)){c8.gears="1"}c8.cookie=b4()}var dl=parseInt(X.width,10);var dj=parseInt(X.height,10);c8.res=parseInt(dl,10)+"x"+parseInt(dj,10);return c8}function bW(){var dk=aT("cvar"),dj=aC(dk);if(dj.length){dj=JSON_PIWIK.parse(dj);if(W(dj)){return dj}}return{}}function cD(){if(aQ===false){aQ=bW()}}function cQ(){var dj=cG();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(dj)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var dj=cG();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(dj)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dk=bf();var dl=az();var dj=String(dk)+dl;return dj}function c2(dl){dl=String(dl);var dp=az();var dm=dp.length;var dn=dl.substr(-1*dm,dm);var dk=parseInt(dl.substr(0,dl.length-dm),10);if(dk&&dn&&dn===dp){var dj=bf();if(aZ<=0){return true}if(dj>=dk&&dj<=(dk+aZ)){return true}}return false}function dh(dj){if(!cM){return""}var dn=f(dj,av);if(!dn){return""}dn=String(dn);
49
+ var dl=new RegExp("^[a-zA-Z0-9]+$");if(dn.length===32&&dl.test(dn)){var dk=dn.substr(16,32);if(c2(dk)){var dm=dn.substr(0,16);return dm}}return""}function cN(){if(!bN){bN=dh(bM)}var dl=new Date(),dj=Math.round(dl.getTime()/1000),dk=aT("id"),dp=aC(dk),dn,dm;if(dp){dn=dp.split(".");dn.unshift("0");if(bN.length){dn[1]=bN}return dn}if(bN.length){dm=bN}else{if("0"===b4()){dm=""}else{dm=cQ()}}dn=["1",dm,dj,0,dj,"",""];return dn}function aY(){var dr=cN(),dm=dr[0],dn=dr[1],dk=dr[2],dj=dr[3],dp=dr[4],dl=dr[5];if(!J(dr[6])){dr[6]=""}var dq=dr[6];return{newVisitor:dm,uuid:dn,createTs:dk,visitCount:dj,currentVisitTs:dp,lastVisitTs:dl,lastEcommerceOrderTs:dq}}function aG(){var dm=new Date(),dk=dm.getTime(),dn=aY().createTs;var dj=parseInt(dn,10);var dl=(dj*1000)+cI-dk;return dl}function aL(dj){if(!b5){return}var dl=new Date(),dk=Math.round(dl.getTime()/1000);if(!J(dj)){dj=aY()}var dm=dj.uuid+"."+dj.createTs+"."+dj.visitCount+"."+dk+"."+dj.lastVisitTs+"."+dj.lastEcommerceOrderTs;de(aT("id"),dm,aG(),bo,cX,bR)
50
+ }function bL(){var dj=aC(aT("ref"));if(dj.length){try{dj=JSON_PIWIK.parse(dj);if(W(dj)){return dj}}catch(dk){}}return["","",0,""]}function bv(dk){var dj="testvalue";de("test",dj,10000,null,dk);if(aC("test")===dj){bX("test",null,dk);return true}return false}function aE(){var dk=bk;bk=false;var dj,dl;for(dj=0;dj<bt.length;dj++){dl=aT(bt[dj]);if(dl!==cL&&dl!==bd&&0!==aC(dl)){bX(dl,bo,cX)}}bk=dk}function b2(dj){b5=dj;aL()}function di(dn){if(!dn||!W(dn)){return}var dm=[];var dl;for(dl in dn){if(Object.prototype.hasOwnProperty.call(dn,dl)){dm.push(dl)}}var dp={};dm.sort();var dj=dm.length;var dk;for(dk=0;dk<dj;dk++){dp[dm[dk]]=dn[dm[dk]]}return dp}function cc(){de(aT("ses"),"1",co,bo,cX,bR)}function bg(){var dm="";var dk="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dl=dk.length;var dj;for(dj=0;dj<6;dj++){dm+=dk.charAt(Math.floor(Math.random()*dl))}return dm}function cs(dl,dH,dI,dm){var dG,dk=new Date(),du=Math.round(dk.getTime()/1000),dr,dF,dn=1024,dO,dv,dD=aQ,dp=aT("ses"),dB=aT("ref"),dy=aT("cvar"),dz=aC(dp),dE=bL(),dK=a4||bM,ds,dj;
51
+ if(bk){aE()}if(cP){return""}var dA=aY();if(!J(dm)){dm=""}var dx=G.characterSet||G.charset;if(!dx||dx.toLowerCase()==="utf-8"){dx=null}ds=dE[0];dj=dE[1];dr=dE[2];dF=dE[3];if(!dz){var dJ=co/1000;if(!dA.lastVisitTs||(du-dA.lastVisitTs)>dJ){dA.visitCount++;dA.lastVisitTs=dA.currentVisitTs}if(!bu||!ds.length){for(dG in cq){if(Object.prototype.hasOwnProperty.call(cq,dG)){ds=f(dK,cq[dG]);if(ds.length){break}}}for(dG in bF){if(Object.prototype.hasOwnProperty.call(bF,dG)){dj=f(dK,bF[dG]);if(dj.length){break}}}}dO=d(bm);dv=dF.length?d(dF):"";if(dO.length&&!aV(dO)&&(!bu||!dv.length||aV(dv))){dF=bm}if(dF.length||ds.length){dr=du;dE=[ds,dj,dr,b1(dF.slice(0,dn))];de(dB,JSON_PIWIK.stringify(dE),c5,bo,cX)}}dl+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dk.getHours()+"&m="+dk.getMinutes()+"&s="+dk.getSeconds()+"&url="+t(b1(dK))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dA.uuid+"&_idts="+dA.createTs+"&_idvc="+dA.visitCount+"&_idn="+dA.newVisitor+(ds.length?"&_rcn="+t(ds):"")+(dj.length?"&_rck="+t(dj):"")+"&_refts="+dr+"&_viewts="+dA.lastVisitTs+(String(dA.lastEcommerceOrderTs).length?"&_ects="+dA.lastEcommerceOrderTs:"")+(String(dF).length?"&_ref="+t(b1(dF.slice(0,dn))):"")+(dx?"&cs="+t(dx):"")+"&send_image=0";
52
+ var dN=cG();for(dG in dN){if(Object.prototype.hasOwnProperty.call(dN,dG)){dl+="&"+dG+"="+dN[dG]}}var dM=[];if(dH){for(dG in dH){if(Object.prototype.hasOwnProperty.call(dH,dG)&&/^dimension\d+$/.test(dG)){var dq=dG.replace("dimension","");dM.push(parseInt(dq,10));dM.push(String(dq));dl+="&"+dG+"="+t(dH[dG]);delete dH[dG]}}}if(dH&&B(dH)){dH=null}for(dG in bl){if(Object.prototype.hasOwnProperty.call(bl,dG)){var dw=(-1===M(dM,dG));if(dw){dl+="&dimension"+dG+"="+t(bl[dG])}}}if(dH){dl+="&data="+t(JSON_PIWIK.stringify(dH))}else{if(ao){dl+="&data="+t(JSON_PIWIK.stringify(ao))}}function dt(dP,dQ){var dR=JSON_PIWIK.stringify(dP);if(dR.length>2){return"&"+dQ+"="+t(dR)}return""}var dL=di(bV);var dC=di(cl);dl+=dt(dL,"cvar");dl+=dt(dC,"e_cvar");if(aQ){dl+=dt(aQ,"_cvar");for(dG in dD){if(Object.prototype.hasOwnProperty.call(dD,dG)){if(aQ[dG][0]===""||aQ[dG][1]===""){delete aQ[dG]}}}if(bP){de(dy,JSON_PIWIK.stringify(aQ),co,bo,cX)}}if(a2){if(cm){dl+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dl+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
53
+ }}}if(aK){dl+="&pv_id="+aK}dA.lastEcommerceOrderTs=J(dm)&&String(dm).length?dm:dA.lastEcommerceOrderTs;aL(dA);cc();dl+=ac(dI,{tracker:bH,request:dl});if(cZ.length){dl+="&"+cZ}if(A(ca)){dl=ca(dl)}return dl}bQ=function a7(){var dj=new Date();dj=dj.getTime();if(!cY){return false}if((cY+(1000*c7))<=dj){return false}if(cY+a5<=dj){bH.ping();return true}return false};function bp(dm,dl,ds,dn,dj,dv){var dq="idgoal=0",dr,dk=new Date(),dt=[],du,dp=String(dm).length;if(dp){dq+="&ec_id="+t(dm);dr=Math.round(dk.getTime()/1000)}dq+="&revenue="+dl;if(String(ds).length){dq+="&ec_st="+ds}if(String(dn).length){dq+="&ec_tx="+dn}if(String(dj).length){dq+="&ec_sh="+dj}if(String(dv).length){dq+="&ec_dt="+dv}if(c0){for(du in c0){if(Object.prototype.hasOwnProperty.call(c0,du)){if(!J(c0[du][1])){c0[du][1]=""}if(!J(c0[du][2])){c0[du][2]=""}if(!J(c0[du][3])||String(c0[du][3]).length===0){c0[du][3]=0}if(!J(c0[du][4])||String(c0[du][4]).length===0){c0[du][4]=1}dt.push(c0[du])}}dq+="&ec_items="+t(JSON_PIWIK.stringify(dt))
54
+ }dq=cs(dq,ao,"ecommerce",dr);bE(dq,bI);if(dp){c0={}}}function bY(dj,dn,dm,dl,dk,dp){if(String(dj).length&&J(dn)){bp(dj,dn,dm,dl,dk,dp)}}function br(dj){if(J(dj)){bp("",dj,"","","","")}}function bZ(dk,dm,dl){aK=bg();var dj=cs("action_name="+t(al(dk||bi)),dm,"log");bE(dj,bI,dl)}function a0(dl,dk){var dm,dj="(^| )(piwik[_-]"+dk;if(dl){for(dm=0;dm<dl.length;dm++){dj+="|"+dl[dm]}}dj+=")( |$)";return new RegExp(dj)}function aU(dj){return(aD&&dj&&0===String(dj).indexOf(aD))}function cu(dn,dj,dp,dk){if(aU(dj)){return 0}var dm=a0(bK,"download"),dl=a0(a8,"link"),dq=new RegExp("\\.("+c6.join("|")+")([?&#]|$)","i");if(dl.test(dn)){return"link"}if(dk||dm.test(dn)||dq.test(dj)){return"download"}if(dp){return 0}return"link"}function au(dk){var dj;dj=dk.parentNode;while(dj!==null&&J(dj)){if(ae.isLinkElement(dk)){break}dk=dj;dj=dk.parentNode}return dk}function dc(dp){dp=au(dp);if(!ae.hasNodeAttribute(dp,"href")){return}if(!J(dp.href)){return}var dn=ae.getAttributeValueFromNode(dp,"href");if(aU(dn)){return
55
+ }var dk=dp.pathname||ck(dp.href);var dq=dp.hostname||d(dp.href);var dr=dq.toLowerCase();var dl=dp.href.replace(dq,dr);var dm=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dm.test(dl)){var dj=cu(dp.className,dl,ar(dr,dk),ae.hasNodeAttribute(dp,"download"));if(dj){return{type:dj,href:dl}}}}function aP(dj,dk,dl,dm){var dn=v.buildInteractionRequestParams(dj,dk,dl,dm);if(!dn){return}return cs(dn,null,"contentInteraction")}function cK(dl,dm,dr,dj,dk){if(!J(dl)){return}if(aU(dl)){return dl}var dp=v.toAbsoluteUrl(dl);var dn="redirecturl="+t(dp)+"&";dn+=aP(dm,dr,dj,(dk||dl));var dq="&";if(aD.indexOf("?")<0){dq="?"}return aD+dq+dn}function bb(dj,dk){if(!dj||!dk){return false}var dl=v.findTargetNode(dj);if(v.shouldIgnoreInteraction(dl)){return false}dl=v.findTargetNodeNoDefault(dj);if(dl&&!V(dl,dk)){return false}return true}function ct(dl,dk,dn){if(!dl){return}var dj=v.findParentContentNode(dl);if(!dj){return}if(!bb(dj,dl)){return}var dm=v.buildContentBlock(dj);
56
+ if(!dm){return}if(!dm.target&&dn){dm.target=dn}return v.buildInteractionRequestParams(dk,dm.name,dm.piece,dm.target)}function aW(dk){if(!b9||!b9.length){return false}var dj,dl;for(dj=0;dj<b9.length;dj++){dl=b9[dj];if(dl&&dl.name===dk.name&&dl.piece===dk.piece&&dl.target===dk.target){return true}}return false}function bD(dm){if(!dm){return false}var dq=v.findTargetNode(dm);if(!dq||v.shouldIgnoreInteraction(dq)){return false}var dr=dc(dq);if(c9&&dr&&dr.type){return false}if(ae.isLinkElement(dq)&&ae.hasNodeAttributeWithValue(dq,"href")){var dj=String(ae.getAttributeValueFromNode(dq,"href"));if(0===dj.indexOf("#")){return false}if(aU(dj)){return true}if(!v.isUrlToCurrentDomain(dj)){return false}var dn=v.buildContentBlock(dm);if(!dn){return}var dl=dn.name;var ds=dn.piece;var dp=dn.target;if(!ae.hasNodeAttributeWithValue(dq,v.CONTENT_TARGET_ATTR)||dq.wasContentTargetAttrReplaced){dq.wasContentTargetAttrReplaced=true;dp=v.toAbsoluteUrl(dj);ae.setAnyAttribute(dq,v.CONTENT_TARGET_ATTR,dp)}var dk=cK(dj,"click",dl,ds,dp);
57
+ v.setHrefAttribute(dq,dk);return true}return false}function aM(dk){if(!dk||!dk.length){return}var dj;for(dj=0;dj<dk.length;dj++){bD(dk[dj])}}function aX(dj){return function(dk){if(!dj){return}var dn=v.findParentContentNode(dj);var dp;if(dk){dp=dk.target||dk.srcElement}if(!dp){dp=dj}if(!bb(dn,dp)){return}cf(bI);if(ae.isLinkElement(dj)&&ae.hasNodeAttributeWithValue(dj,"href")&&ae.hasNodeAttributeWithValue(dj,v.CONTENT_TARGET_ATTR)){var dl=ae.getAttributeValueFromNode(dj,"href");if(!aU(dl)&&dj.wasContentTargetAttrReplaced){ae.setAnyAttribute(dj,v.CONTENT_TARGET_ATTR,"")}}var dt=dc(dj);if(ap&&dt&&dt.type){return dt.type}if(bD(dn)){return"href"}var dq=v.buildContentBlock(dn);if(!dq){return}var dm=dq.name;var du=dq.piece;var ds=dq.target;var dr=aP("click",dm,du,ds);if(dr){bE(dr,bI)}return dr}}function b0(dl){if(!dl||!dl.length){return}var dj,dk;for(dj=0;dj<dl.length;dj++){dk=v.findTargetNode(dl[dj]);if(dk&&!dk.contentInteractionTrackingSetupDone){dk.contentInteractionTrackingSetupDone=true;an(dk,"click",aX(dk))
58
+ }}}function bw(dl,dm){if(!dl||!dl.length){return[]}var dj,dk;for(dj=0;dj<dl.length;dj++){if(aW(dl[dj])){dl.splice(dj,1);dj--}else{b9.push(dl[dj])}}if(!dl||!dl.length){return[]}aM(dm);b0(dm);var dn=[];for(dj=0;dj<dl.length;dj++){dk=cs(v.buildImpressionRequestParams(dl[dj].name,dl[dj].piece,dl[dj].target),undefined,"contentImpressions");if(dk){dn.push(dk)}}return dn}function cy(dk){var dj=v.collectContent(dk);return bw(dj,dk)}function a9(dk){if(!dk||!dk.length){return[]}var dj;for(dj=0;dj<dk.length;dj++){if(!v.isNodeVisible(dk[dj])){dk.splice(dj,1);dj--}}if(!dk||!dk.length){return[]}return cy(dk)}function aF(dl,dj,dk){var dm=v.buildImpressionRequestParams(dl,dj,dk);return cs(dm,null,"contentImpression")}function db(dm,dk){if(!dm){return}var dj=v.findParentContentNode(dm);var dl=v.buildContentBlock(dj);if(!dl){return}if(!dk){dk="Unknown"}return aP(dk,dl.name,dl.piece,dl.target)}function cO(dk,dm,dj,dl){return"e_c="+t(dk)+"&e_a="+t(dm)+(J(dj)?"&e_n="+t(dj):"")+(J(dl)?"&e_v="+t(dl):"")}function at(dl,dn,dj,dm,dq,dp){if(a(String(dl)).length===0||a(String(dn)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
59
+ return false}var dk=cs(cO(dl,dn,dj,dm),dq,"event");bE(dk,bI,dp)}function b7(dj,dm,dk,dn){var dl=cs("search="+t(dj)+(dm?"&search_cat="+t(dm):"")+(J(dk)?"&search_count="+dk:""),dn,"sitesearch");bE(dl,bI)}function cT(dj,dn,dm,dl){var dk=cs("idgoal="+dj+(dn?"&revenue="+dn:""),dm,"goal");bE(dk,bI,dl)}function c1(dm,dj,dr,dq,dl){var dp=dj+"="+t(b1(dm));var dk=ct(dl,"click",dm);if(dk){dp+="&"+dk}var dn=cs(dp,dr,"link");bE(dn,bI,dq)}function bT(dk,dj){if(dk!==""){return dk+dj.charAt(0).toUpperCase()+dj.slice(1)}return dj}function cg(dp){var dn,dj,dm=["","webkit","ms","moz"],dl;if(!be){for(dj=0;dj<dm.length;dj++){dl=dm[dj];if(Object.prototype.hasOwnProperty.call(G,bT(dl,"hidden"))){if(G[bT(dl,"visibilityState")]==="prerender"){dn=true}break}}}if(dn){an(G,dl+"visibilitychange",function dk(){G.removeEventListener(dl+"visibilitychange",dk,false);dp()});return}dp()}function bq(){var dk=aY().uuid;var dj=aI();return dk+dj}function ci(dj){if(!dj){return}if(!ae.hasNodeAttribute(dj,"href")){return}var dk=ae.getAttributeValueFromNode(dj,"href");
60
+ if(!dk||aU(dk)){return}dk=k(dk,av);var dl=bq();dk=F(dk,av,dl);ae.setAnyAttribute(dj,"href",dk)}function aA(dm){var dn=ae.getAttributeValueFromNode(dm,"href");if(!dn){return false}dn=String(dn);var dk=dn.indexOf("//")===0||dn.indexOf("http://")===0||dn.indexOf("https://")===0;if(!dk){return false}var dj=dm.pathname||ck(dm.href);var dl=(dm.hostname||d(dm.href)).toLowerCase();if(ar(dl,dj)){if(!cF(cU,L(dl))){return true}return false}return false}function cE(dj){var dk=dc(dj);if(dk&&dk.type){dk.href=p(dk.href);c1(dk.href,dk.type,undefined,null,dj);return}if(cM){dj=au(dj);if(aA(dj)){ci(dj)}}}function cv(){return G.all&&!G.addEventListener}function cV(dj){var dl=dj.which;var dk=(typeof dj.button);if(!dl&&dk!=="undefined"){if(cv()){if(dj.button&1){dl=1}else{if(dj.button&2){dl=3}else{if(dj.button&4){dl=2}}}}else{if(dj.button===0||dj.button==="0"){dl=1}else{if(dj.button&1){dl=2}else{if(dj.button&2){dl=3}}}}}return dl}function bS(dj){switch(cV(dj)){case 1:return"left";case 2:return"middle";case 3:return"right"
61
+ }}function a1(dj){return dj.target||dj.srcElement}function aB(dj){return function(dm){dm=dm||T.event;var dl=bS(dm);var dn=a1(dm);if(dm.type==="click"){var dk=false;if(dj&&dl==="middle"){dk=true}if(dn&&!dk){cE(dn)}}else{if(dm.type==="mousedown"){if(dl==="middle"&&dn){aR=dl;bz=dn}else{aR=bz=null}}else{if(dm.type==="mouseup"){if(dl===aR&&dn===bz){cE(dn)}aR=bz=null}else{if(dm.type==="contextmenu"){cE(dn)}}}}}}function aq(dl,dk){var dj=typeof dk;if(dj==="undefined"){dk=true}an(dl,"click",aB(dk),false);if(dk){an(dl,"mouseup",aB(dk),false);an(dl,"mousedown",aB(dk),false);an(dl,"contextmenu",aB(dk),false)}}function bC(dl,dn){ap=true;var dm,dk=a0(by,"ignore"),dp=G.links,dj=null,dq=null;if(dp){for(dm=0;dm<dp.length;dm++){dj=dp[dm];if(!dk.test(dj.className)){dq=typeof dj.piwikTrackers;if("undefined"===dq){dj.piwikTrackers=[]}if(-1===M(dj.piwikTrackers,dn)){dj.piwikTrackers.push(dn);aq(dj,dl)}}}}}function aS(dk,dn,dp){if(ce){return true}ce=true;var dq=false;var dm,dl;function dj(){dq=true}n(function(){function dr(dt){setTimeout(function(){if(!ce){return
62
+ }dq=false;dp.trackVisibleContentImpressions();dr(dt)},dt)}function ds(dt){setTimeout(function(){if(!ce){return}if(dq){dq=false;dp.trackVisibleContentImpressions()}ds(dt)},dt)}if(dk){dm=["scroll","resize"];for(dl=0;dl<dm.length;dl++){if(G.addEventListener){G.addEventListener(dm[dl],dj,false)}else{T.attachEvent("on"+dm[dl],dj)}}ds(100)}if(dn&&dn>0){dn=parseInt(dn,10);dr(dn)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dj=this.requests;this.requests=[];if(dj.length===1){bE(dj[0],bI)}else{df(dj,bI)}},push:function(dj){if(!dj){return}if(m||!this.enabled){bE(dj,bI);return}bB.requests.push(dj);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dk="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dk)){b[dk]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
63
+ };this.getVisitorInfo=function(){return cN()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(dj){aD=dj};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(dj,dl){if(!J(dj)||null===dj){dj=this.getTrackerUrl()}var dk=new Q(dj,dl);I.push(dk);e.trigger("TrackerAdded",[this]);return dk};this.getSiteId=function(){return b5};this.setSiteId=function(dj){b2(dj)};this.resetUserId=function(){bx=""};this.setUserId=function(dj){if(Y(dj)){bx=dj}};this.getUserId=function(){return bx};this.setCustomData=function(dj,dk){if(W(dj)){ao=dj}else{if(!ao){ao={}}ao[dj]=dk}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dj){ca=dj};this.appendToTrackingUrl=function(dj){cZ=dj
64
+ };this.getRequest=function(dj){return cs(dj)};this.addPlugin=function(dj,dk){b[dj]=dk};this.setCustomDimension=function(dj,dk){dj=parseInt(dj,10);if(dj>0){if(!J(dk)){dk=""}if(!w(dk)){dk=String(dk)}bl[dj]=dk}};this.getCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0&&Object.prototype.hasOwnProperty.call(bl,dj)){return bl[dj]}};this.deleteCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0){delete bl[dj]}};this.setCustomVariable=function(dk,dj,dn,dl){var dm;if(!J(dl)){dl="visit"}if(!J(dj)){return}if(!J(dn)){dn=""}if(dk>0){dj=!w(dj)?String(dj):dj;dn=!w(dn)?String(dn):dn;dm=[dj.slice(0,bs),dn.slice(0,bs)];if(dl==="visit"||dl===2){cD();aQ[dk]=dm}else{if(dl==="page"||dl===3){bV[dk]=dm}else{if(dl==="event"){cl[dk]=dm}}}}};this.getCustomVariable=function(dk,dl){var dj;if(!J(dl)){dl="visit"}if(dl==="page"||dl===3){dj=bV[dk]}else{if(dl==="event"){dj=cl[dk]}else{if(dl==="visit"||dl===2){cD();dj=aQ[dk]}}}if(!J(dj)||(dj&&dj[0]==="")){return false}return dj};this.deleteCustomVariable=function(dj,dk){if(this.getCustomVariable(dj,dk)){this.setCustomVariable(dj,"","",dk)
65
+ }};this.deleteCustomVariables=function(dj){if(dj==="page"||dj===3){bV={}}else{if(dj==="event"){cl={}}else{if(dj==="visit"||dj===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(dj){bI=dj};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(dj){if(w(dj)){dj=dj.split("|")}c6=dj};this.addDownloadExtensions=function(dk){var dj;if(w(dk)){dk=dk.split("|")}for(dj=0;dj<dk.length;dj++){c6.push(dk[dj])}};this.removeDownloadExtensions=function(dl){var dk,dj=[];if(w(dl)){dl=dl.split("|")}for(dk=0;dk<c6.length;dk++){if(M(dl,c6[dk])===-1){dj.push(c6[dk])}}c6=dj};this.setDomains=function(dj){ax=w(dj)?[dj]:dj;var dn=false,dl=0,dk;for(dl;dl<ax.length;dl++){dk=String(ax[dl]);if(cF(cU,L(dk))){dn=true;break}var dm=ck(dk);if(dm&&dm!=="/"&&dm!=="/*"){dn=true;break}}if(!dn){ax.push(cU)}};this.enableCrossDomainLinking=function(){cM=true};this.disableCrossDomainLinking=function(){cM=false};this.isCrossDomainLinkingEnabled=function(){return cM
66
+ };this.setCrossDomainLinkingTimeout=function(dj){aZ=dj};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(dj){by=w(dj)?[dj]:dj};this.setRequestMethod=function(dj){da=dj||ch};this.setRequestContentType=function(dj){cw=dj||aH};this.setReferrerUrl=function(dj){bm=dj};this.setCustomUrl=function(dj){a4=bU(bM,dj)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(dj){bi=dj};this.setAPIUrl=function(dj){bG=dj};this.setDownloadClasses=function(dj){bK=w(dj)?[dj]:dj};this.setLinkClasses=function(dj){a8=w(dj)?[dj]:dj};this.setCampaignNameKey=function(dj){cq=w(dj)?[dj]:dj};this.setCampaignKeywordKey=function(dj){bF=w(dj)?[dj]:dj};this.discardHashTag=function(dj){bO=dj};this.setCookieNamePrefix=function(dj){bj=dj;aQ=bW()};this.setCookieDomain=function(dj){var dk=L(dj);if(bv(dk)){cX=dk;bh()}};this.getCookieDomain=function(){return cX};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dl,dk,dj){if(!dl){throw new Error("Missing cookie name")
67
+ }if(!J(dj)){dj=co}bt.push(dl);de(aT(dl),dk,dj,bo,cX)};this.getCookie=function(dk){var dj=aC(aT(dk));if(dj===0){return null}return dj};this.setCookiePath=function(dj){bo=dj;bh()};this.getCookiePath=function(dj){return bo};this.setVisitorCookieTimeout=function(dj){cI=dj*1000};this.setSessionCookieTimeout=function(dj){co=dj*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(dj){c5=dj*1000};this.setConversionAttributionFirstReferrer=function(dj){bu=dj};this.setSecureCookie=function(dj){bR=dj};this.disableCookies=function(){bk=true;c8.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dk){var dj=h.doNotTrack||h.msDoNotTrack;cP=dk&&(dj==="yes"||dj==="1");if(cP){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cW=true};this.addListener=function(dk,dj){aq(dk,dj)};this.enableLinkTracking=function(dk){c9=true;var dj=this;cg(function(){q(function(){bC(dk,dj)})})};this.enableJSErrorTracking=function(){if(cS){return
68
+ }cS=true;var dj=T.onerror;T.onerror=function(dp,dm,dl,dn,dk){cg(function(){var dq="JavaScript Errors";var dr=dm+":"+dl;if(dn){dr+=":"+dn}at(dq,dr,dp)});if(dj){return dj(dp,dm,dl,dn,dk)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(dj){cm=parseInt(dj,10)};this.setVisitStandardLength=function(dj){dj=Math.max(dj,5);c7=dj};this.enableHeartBeatTimer=function(dj){dj=Math.max(dj,5);a5=(dj||15)*1000;if(cY!==null){dg()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(dj){if(T.location.protocol==="file:"){T.location=dj}};this.setCountPreRendered=function(dj){be=dj};this.trackGoal=function(dj,dm,dl,dk){cg(function(){cT(dj,dm,dl,dk)})};this.trackLink=function(dk,dj,dm,dl){cg(function(){c1(dk,dj,dm,dl)
69
+ })};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(dj,dl,dk){b9=[];cJ=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(dj,dl,dk)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var dj=v.findContentNodes();var dk=cy(dj);df(dk,bI)})})};this.trackVisibleContentImpressions=function(dj,dk){if(N(b5)){return}if(!J(dj)){dj=true}if(!J(dk)){dk=750}aS(dj,dk,this);cg(function(){n(function(){var dl=v.findContentNodes();var dm=a9(dl);df(dm,bI)})})};this.trackContentImpression=function(dl,dj,dk){if(N(b5)){return}dl=a(dl);dj=a(dj);dk=a(dk);if(!dl){return}dj=dj||"Unknown";cg(function(){var dm=aF(dl,dj,dk);bE(dm,bI)})};this.trackContentImpressionsWithinNode=function(dj){if(N(b5)||!dj){return}cg(function(){if(ce){n(function(){var dk=v.findContentNodesWithinNode(dj);var dl=a9(dk);df(dl,bI)})}else{q(function(){var dk=v.findContentNodesWithinNode(dj);var dl=cy(dk);df(dl,bI)})}})};this.trackContentInteraction=function(dl,dm,dj,dk){if(N(b5)){return
70
+ }dl=a(dl);dm=a(dm);dj=a(dj);dk=a(dk);if(!dl||!dm){return}dj=dj||"Unknown";cg(function(){var dn=aP(dl,dm,dj,dk);if(dn){bE(dn,bI)}})};this.trackContentInteractionNode=function(dk,dj){if(N(b5)||!dk){return}cg(function(){var dl=db(dk,dj);if(dl){bE(dl,bI)}})};this.logAllContentBlocksOnPage=function(){var dl=v.findContentNodes();var dj=v.collectContent(dl);var dk=typeof console;if(dk!=="undefined"&&console&&console.log){console.log(dj)}};this.trackEvent=function(dk,dm,dj,dl,dp,dn){cg(function(){at(dk,dm,dj,dl,dp,dn)})};this.trackSiteSearch=function(dj,dl,dk,dm){b9=[];cg(function(){b7(dj,dl,dk,dm)})};this.setEcommerceView=function(dm,dj,dl,dk){if(Y(dl)){dl=String(dl)}if(!J(dl)||dl===null||dl===false||!dl.length){dl=""}else{if(dl instanceof Array){dl=JSON_PIWIK.stringify(dl)}}bV[5]=["_pkc",dl];if(J(dk)&&dk!==null&&dk!==false&&String(dk).length){bV[2]=["_pkp",dk]}if(!Y(dm)&&!Y(dj)){return}if(Y(dm)){bV[3]=["_pks",dm]}if(!Y(dj)){dj=""}bV[4]=["_pkn",dj]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c0))
71
+ };this.addEcommerceItem=function(dn,dj,dl,dk,dm){if(Y(dn)){c0[dn]=[String(dn),dj,dl,dk,dm]}};this.removeEcommerceItem=function(dj){if(Y(dj)){dj=String(dj);delete c0[dj]}};this.clearEcommerceCart=function(){c0={}};this.trackEcommerceOrder=function(dj,dn,dm,dl,dk,dp){bY(dj,dn,dm,dl,dk,dp)};this.trackEcommerceCartUpdate=function(dj){br(dj)};this.trackRequest=function(dk,dm,dl,dj){cg(function(){var dn=cs(dk,dm,dj);bE(dn,bI,dl)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(dj){if(dj<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=dj};this.queueRequest=function(dj){cg(function(){var dk=cs(dj);bB.push(dk)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var dj=aC(bd);if(aC(cL)){if(dj){bX(bd,bo,cX)}return null}if(!dj||dj===0){return null}return dj};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
72
+ };this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cL,bo,cX);var dk,dj;for(dk=0;dk<cJ.length;dk++){dj=typeof cJ[dk];if(dj==="string"){bE(cJ[dk],bI)}else{if(dj==="object"){df(cJ[dk],bI)}}}cJ=[]};this.rememberConsentGiven=function(dk){if(dk){dk=dk*60*60*1000}else{dk=30*365*24*60*60*1000}this.setConsentGiven();var dj=new Date().getTime();de(bd,dj,dk,bo,cX,bR)};this.forgetConsentGiven=function(){var dj=30*365*24*60*60*1000;bX(bd,bo,cX);de(cL,new Date().getTime(),dj,bo,cX,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
73
  if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
74
  if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
75
  }y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
app/matomo.js CHANGED
@@ -8,7 +8,7 @@
8
  * @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
9
  * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
10
  */
11
- ;if(typeof JSON_PIWIK!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON_PIWIK=window.JSON}else{(function(){var a={};
12
  /*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
13
  (function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
14
  var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
@@ -38,38 +38,38 @@ if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq
38
  if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
- if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
- try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
- if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
- var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
- dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
46
- }function ay(){if(dc()){bQ()}bJ()}function df(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dc()){bQ()}}})}function cB(dm){var dj=new Date();var di=dj.getTime();cX=di;if(cA&&di<cA){var dk=cA-di;setTimeout(dm,dk);cf(dk+50);cA+=50;return}if(cA===false){var dl=800;cA=di+dl}dm()}function aO(){if(aC(cK)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dj,di,dk){aO();if(!bA){cI.push(dj);return}if(!cO&&dj){if(cz&&bA){dj+="&consent=1"}cB(function(){if(cV&&a6(dj,dk)){cf(100);return}if(c9==="POST"||String(dj).length>2000){c3(dj,dk)}else{cp(dj,dk)}cf(di)})}if(!aN){df()}}function cj(di){if(cO){return false}return(di&&di.length)}function c2(di,dm){if(!dm||dm>=di.length){return[di]}var dj=0;var dk=di.length;var dl=[];for(dj;dj<dk;dj+=dm){dl.push(di.slice(dj,dj+dm))}return dl}function de(dj,di){if(!cj(dj)){return}if(!bA){cI.push(dj);return}cB(function(){var dm=c2(dj,50);var dk=0,dl;for(dk;dk<dm.length;dk++){dl='{"requests":["?'+dm[dk].join('","?')+'"]}';
47
- c3(dl,null,false)}cf(di)})}function aT(di){return bj+di+"."+b5+"."+bn}function bX(dk,dj,di){dd(dk,"",-86400,dj,di)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var di=bj+"testcookie";dd(di,"1",undefined,bo,cW,bR);var dj=aC(di)==="1"?"1":"0";bX(di);return dj}function bh(){bn=b6((cW||cT)+(bo||"/")).slice(0,4)}function cF(){if(J(c7.res)){return c7}var dj,dl,dm={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dj in dm){if(Object.prototype.hasOwnProperty.call(dm,dj)){dl=h.mimeTypes[dm[dj]];c7[dj]=(dl&&dl.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c7.java="1"
48
- }if(A(T.GearsFactory)){c7.gears="1"}c7.cookie=b4()}var dk=parseInt(X.width,10);var di=parseInt(X.height,10);c7.res=parseInt(dk,10)+"x"+parseInt(di,10);return c7}function bW(){var dj=aT("cvar"),di=aC(dj);if(di.length){di=JSON_PIWIK.parse(di);if(W(di)){return di}}return{}}function cC(){if(aQ===false){aQ=bW()}}function cP(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dj=bf();var dk=az();var di=String(dj)+dk;return di}function c1(dk){dk=String(dk);var dn=az();var dl=dn.length;var dm=dk.substr(-1*dl,dl);var dj=parseInt(dk.substr(0,dk.length-dl),10);if(dj&&dm&&dm===dn){var di=bf();if(aZ<=0){return true}if(di>=dj&&di<=(dj+aZ)){return true}}return false}function dg(di){if(!cL){return""}var dm=f(di,av);if(!dm){return""}dm=String(dm);
49
- var dk=new RegExp("^[a-zA-Z0-9]+$");if(dm.length===32&&dk.test(dm)){var dj=dm.substr(16,32);if(c1(dj)){var dl=dm.substr(0,16);return dl}}return""}function cM(){if(!bN){bN=dg(bM)}var dk=new Date(),di=Math.round(dk.getTime()/1000),dj=aT("id"),dn=aC(dj),dm,dl;if(dn){dm=dn.split(".");dm.unshift("0");if(bN.length){dm[1]=bN}return dm}if(bN.length){dl=bN}else{if("0"===b4()){dl=""}else{dl=cP()}}dm=["1",dl,di,0,di,"",""];return dm}function aY(){var dq=cM(),dl=dq[0],dm=dq[1],dj=dq[2],di=dq[3],dn=dq[4],dk=dq[5];if(!J(dq[6])){dq[6]=""}var dp=dq[6];return{newVisitor:dl,uuid:dm,createTs:dj,visitCount:di,currentVisitTs:dn,lastVisitTs:dk,lastEcommerceOrderTs:dp}}function aG(){var dl=new Date(),dj=dl.getTime(),dm=aY().createTs;var di=parseInt(dm,10);var dk=(di*1000)+cH-dj;return dk}function aL(di){if(!b5){return}var dk=new Date(),dj=Math.round(dk.getTime()/1000);if(!J(di)){di=aY()}var dl=di.uuid+"."+di.createTs+"."+di.visitCount+"."+dj+"."+di.lastVisitTs+"."+di.lastEcommerceOrderTs;dd(aT("id"),dl,aG(),bo,cW,bR)
50
- }function bL(){var di=aC(aT("ref"));if(di.length){try{di=JSON_PIWIK.parse(di);if(W(di)){return di}}catch(dj){}}return["","",0,""]}function bv(dj){var di="testvalue";dd("test",di,10000,null,dj);if(aC("test")===di){bX("test",null,dj);return true}return false}function aE(){var dj=bk;bk=false;var di,dk;for(di=0;di<bt.length;di++){dk=aT(bt[di]);if(dk!==cK&&dk!==bd&&0!==aC(dk)){bX(dk,bo,cW)}}bk=dj}function b2(di){b5=di;aL()}function dh(dm){if(!dm||!W(dm)){return}var dl=[];var dk;for(dk in dm){if(Object.prototype.hasOwnProperty.call(dm,dk)){dl.push(dk)}}var dn={};dl.sort();var di=dl.length;var dj;for(dj=0;dj<di;dj++){dn[dl[dj]]=dm[dl[dj]]}return dn}function cc(){dd(aT("ses"),"1",co,bo,cW,bR)}function bg(){var dl="";var dj="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dk=dj.length;var di;for(di=0;di<6;di++){dl+=dj.charAt(Math.floor(Math.random()*dk))}return dl}function cs(dk,dG,dH,dl){var dF,dj=new Date(),dt=Math.round(dj.getTime()/1000),dq,dE,dm=1024,dN,du,dC=aQ,dn=aT("ses"),dA=aT("ref"),dx=aT("cvar"),dy=aC(dn),dD=bL(),dJ=a4||bM,dr,di;
51
- if(bk){aE()}if(cO){return""}var dz=aY();if(!J(dl)){dl=""}var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dD[0];di=dD[1];dq=dD[2];dE=dD[3];if(!dy){var dI=co/1000;if(!dz.lastVisitTs||(dt-dz.lastVisitTs)>dI){dz.visitCount++;dz.lastVisitTs=dz.currentVisitTs}if(!bu||!dr.length){for(dF in cq){if(Object.prototype.hasOwnProperty.call(cq,dF)){dr=f(dJ,cq[dF]);if(dr.length){break}}}for(dF in bF){if(Object.prototype.hasOwnProperty.call(bF,dF)){di=f(dJ,bF[dF]);if(di.length){break}}}}dN=d(bm);du=dE.length?d(dE):"";if(dN.length&&!aV(dN)&&(!bu||!du.length||aV(du))){dE=bm}if(dE.length||dr.length){dq=dt;dD=[dr,di,dq,b1(dE.slice(0,dm))];dd(dA,JSON_PIWIK.stringify(dD),c4,bo,cW)}}dk+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dj.getHours()+"&m="+dj.getMinutes()+"&s="+dj.getSeconds()+"&url="+t(b1(dJ))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dz.uuid+"&_idts="+dz.createTs+"&_idvc="+dz.visitCount+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+t(dr):"")+(di.length?"&_rck="+t(di):"")+"&_refts="+dq+"&_viewts="+dz.lastVisitTs+(String(dz.lastEcommerceOrderTs).length?"&_ects="+dz.lastEcommerceOrderTs:"")+(String(dE).length?"&_ref="+t(b1(dE.slice(0,dm))):"")+(dw?"&cs="+t(dw):"")+"&send_image=0";
52
- var dM=cF();for(dF in dM){if(Object.prototype.hasOwnProperty.call(dM,dF)){dk+="&"+dF+"="+dM[dF]}}var dL=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dL.push(parseInt(dp,10));dL.push(String(dp));dk+="&"+dF+"="+t(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in bl){if(Object.prototype.hasOwnProperty.call(bl,dF)){var dv=(-1===M(dL,dF));if(dv){dk+="&dimension"+dF+"="+t(bl[dF])}}}if(dG){dk+="&data="+t(JSON_PIWIK.stringify(dG))}else{if(ao){dk+="&data="+t(JSON_PIWIK.stringify(ao))}}function ds(dO,dP){var dQ=JSON_PIWIK.stringify(dO);if(dQ.length>2){return"&"+dP+"="+t(dQ)}return""}var dK=dh(bV);var dB=dh(cl);dk+=ds(dK,"cvar");dk+=ds(dB,"e_cvar");if(aQ){dk+=ds(aQ,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aQ[dF][0]===""||aQ[dF][1]===""){delete aQ[dF]}}}if(bP){dd(dx,JSON_PIWIK.stringify(aQ),co,bo,cW)}}if(a2){if(cm){dk+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dk+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
53
- }}}if(aK){dk+="&pv_id="+aK}dz.lastEcommerceOrderTs=J(dl)&&String(dl).length?dl:dz.lastEcommerceOrderTs;aL(dz);cc();dk+=ac(dH,{tracker:bH,request:dk});if(cY.length){dk+="&"+cY}if(A(ca)){dk=ca(dk)}return dk}bQ=function a7(){var di=new Date();di=di.getTime();if(!cX){return false}if((cX+(1000*c6))<=di){return false}if(cX+a5<=di){bH.ping();return true}return false};function bp(dl,dk,dr,dm,di,du){var dp="idgoal=0",dq,dj=new Date(),ds=[],dt,dn=String(dl).length;if(dn){dp+="&ec_id="+t(dl);dq=Math.round(dj.getTime()/1000)}dp+="&revenue="+dk;if(String(dr).length){dp+="&ec_st="+dr}if(String(dm).length){dp+="&ec_tx="+dm}if(String(di).length){dp+="&ec_sh="+di}if(String(du).length){dp+="&ec_dt="+du}if(cZ){for(dt in cZ){if(Object.prototype.hasOwnProperty.call(cZ,dt)){if(!J(cZ[dt][1])){cZ[dt][1]=""}if(!J(cZ[dt][2])){cZ[dt][2]=""}if(!J(cZ[dt][3])||String(cZ[dt][3]).length===0){cZ[dt][3]=0}if(!J(cZ[dt][4])||String(cZ[dt][4]).length===0){cZ[dt][4]=1}ds.push(cZ[dt])}}dp+="&ec_items="+t(JSON_PIWIK.stringify(ds))
54
- }dp=cs(dp,ao,"ecommerce",dq);bE(dp,bI);if(dn){cZ={}}}function bY(di,dm,dl,dk,dj,dn){if(String(di).length&&J(dm)){bp(di,dm,dl,dk,dj,dn)}}function br(di){if(J(di)){bp("",di,"","","","")}}function bZ(dj,dl,dk){aK=bg();var di=cs("action_name="+t(al(dj||bi)),dl,"log");bE(di,bI,dk)}function a0(dk,dj){var dl,di="(^| )(piwik[_-]"+dj;if(dk){for(dl=0;dl<dk.length;dl++){di+="|"+dk[dl]}}di+=")( |$)";return new RegExp(di)}function aU(di){return(aD&&di&&0===String(di).indexOf(aD))}function cu(dm,di,dn,dj){if(aU(di)){return 0}var dl=a0(bK,"download"),dk=a0(a8,"link"),dp=new RegExp("\\.("+c5.join("|")+")([?&#]|$)","i");if(dk.test(dm)){return"link"}if(dj||dl.test(dm)||dp.test(di)){return"download"}if(dn){return 0}return"link"}function au(dj){var di;di=dj.parentNode;while(di!==null&&J(di)){if(ae.isLinkElement(dj)){break}dj=di;di=dj.parentNode}return dj}function db(dn){dn=au(dn);if(!ae.hasNodeAttribute(dn,"href")){return}if(!J(dn.href)){return}var dm=ae.getAttributeValueFromNode(dn,"href");if(aU(dm)){return
55
- }var dj=dn.pathname||ck(dn.href);var dp=dn.hostname||d(dn.href);var dq=dp.toLowerCase();var dk=dn.href.replace(dp,dq);var dl=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dl.test(dk)){var di=cu(dn.className,dk,ar(dq,dj),ae.hasNodeAttribute(dn,"download"));if(di){return{type:di,href:dk}}}}function aP(di,dj,dk,dl){var dm=v.buildInteractionRequestParams(di,dj,dk,dl);if(!dm){return}return cs(dm,null,"contentInteraction")}function cJ(dk,dl,dq,di,dj){if(!J(dk)){return}if(aU(dk)){return dk}var dn=v.toAbsoluteUrl(dk);var dm="redirecturl="+t(dn)+"&";dm+=aP(dl,dq,di,(dj||dk));var dp="&";if(aD.indexOf("?")<0){dp="?"}return aD+dp+dm}function bb(di,dj){if(!di||!dj){return false}var dk=v.findTargetNode(di);if(v.shouldIgnoreInteraction(dk)){return false}dk=v.findTargetNodeNoDefault(di);if(dk&&!V(dk,dj)){return false}return true}function ct(dk,dj,dm){if(!dk){return}var di=v.findParentContentNode(dk);if(!di){return}if(!bb(di,dk)){return}var dl=v.buildContentBlock(di);
56
- if(!dl){return}if(!dl.target&&dm){dl.target=dm}return v.buildInteractionRequestParams(dj,dl.name,dl.piece,dl.target)}function aW(dj){if(!b9||!b9.length){return false}var di,dk;for(di=0;di<b9.length;di++){dk=b9[di];if(dk&&dk.name===dj.name&&dk.piece===dj.piece&&dk.target===dj.target){return true}}return false}function bD(dl){if(!dl){return false}var dp=v.findTargetNode(dl);if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dq=db(dp);if(c8&&dq&&dq.type){return false}if(ae.isLinkElement(dp)&&ae.hasNodeAttributeWithValue(dp,"href")){var di=String(ae.getAttributeValueFromNode(dp,"href"));if(0===di.indexOf("#")){return false}if(aU(di)){return true}if(!v.isUrlToCurrentDomain(di)){return false}var dm=v.buildContentBlock(dl);if(!dm){return}var dk=dm.name;var dr=dm.piece;var dn=dm.target;if(!ae.hasNodeAttributeWithValue(dp,v.CONTENT_TARGET_ATTR)||dp.wasContentTargetAttrReplaced){dp.wasContentTargetAttrReplaced=true;dn=v.toAbsoluteUrl(di);ae.setAnyAttribute(dp,v.CONTENT_TARGET_ATTR,dn)}var dj=cJ(di,"click",dk,dr,dn);
57
- v.setHrefAttribute(dp,dj);return true}return false}function aM(dj){if(!dj||!dj.length){return}var di;for(di=0;di<dj.length;di++){bD(dj[di])}}function aX(di){return function(dj){if(!di){return}var dm=v.findParentContentNode(di);var dn;if(dj){dn=dj.target||dj.srcElement}if(!dn){dn=di}if(!bb(dm,dn)){return}cf(bI);if(ae.isLinkElement(di)&&ae.hasNodeAttributeWithValue(di,"href")&&ae.hasNodeAttributeWithValue(di,v.CONTENT_TARGET_ATTR)){var dk=ae.getAttributeValueFromNode(di,"href");if(!aU(dk)&&di.wasContentTargetAttrReplaced){ae.setAnyAttribute(di,v.CONTENT_TARGET_ATTR,"")}}var ds=db(di);if(ap&&ds&&ds.type){return ds.type}if(bD(dm)){return"href"}var dp=v.buildContentBlock(dm);if(!dp){return}var dl=dp.name;var dt=dp.piece;var dr=dp.target;var dq=aP("click",dl,dt,dr);if(dq){bE(dq,bI)}return dq}}function b0(dk){if(!dk||!dk.length){return}var di,dj;for(di=0;di<dk.length;di++){dj=v.findTargetNode(dk[di]);if(dj&&!dj.contentInteractionTrackingSetupDone){dj.contentInteractionTrackingSetupDone=true;an(dj,"click",aX(dj))
58
- }}}function bw(dk,dl){if(!dk||!dk.length){return[]}var di,dj;for(di=0;di<dk.length;di++){if(aW(dk[di])){dk.splice(di,1);di--}else{b9.push(dk[di])}}if(!dk||!dk.length){return[]}aM(dl);b0(dl);var dm=[];for(di=0;di<dk.length;di++){dj=cs(v.buildImpressionRequestParams(dk[di].name,dk[di].piece,dk[di].target),undefined,"contentImpressions");if(dj){dm.push(dj)}}return dm}function cy(dj){var di=v.collectContent(dj);return bw(di,dj)}function a9(dj){if(!dj||!dj.length){return[]}var di;for(di=0;di<dj.length;di++){if(!v.isNodeVisible(dj[di])){dj.splice(di,1);di--}}if(!dj||!dj.length){return[]}return cy(dj)}function aF(dk,di,dj){var dl=v.buildImpressionRequestParams(dk,di,dj);return cs(dl,null,"contentImpression")}function da(dl,dj){if(!dl){return}var di=v.findParentContentNode(dl);var dk=v.buildContentBlock(di);if(!dk){return}if(!dj){dj="Unknown"}return aP(dj,dk.name,dk.piece,dk.target)}function cN(dj,dl,di,dk){return"e_c="+t(dj)+"&e_a="+t(dl)+(J(di)?"&e_n="+t(di):"")+(J(dk)?"&e_v="+t(dk):"")}function at(dk,dm,di,dl,dp,dn){if(a(String(dk)).length===0||a(String(dm)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
59
- return false}var dj=cs(cN(dk,dm,di,dl),dp,"event");bE(dj,bI,dn)}function b7(di,dl,dj,dm){var dk=cs("search="+t(di)+(dl?"&search_cat="+t(dl):"")+(J(dj)?"&search_count="+dj:""),dm,"sitesearch");bE(dk,bI)}function cS(di,dm,dl,dk){var dj=cs("idgoal="+di+(dm?"&revenue="+dm:""),dl,"goal");bE(dj,bI,dk)}function c0(dl,di,dq,dp,dk){var dn=di+"="+t(b1(dl));var dj=ct(dk,"click",dl);if(dj){dn+="&"+dj}var dm=cs(dn,dq,"link");bE(dm,bI,dp)}function bT(dj,di){if(dj!==""){return dj+di.charAt(0).toUpperCase()+di.slice(1)}return di}function cg(dn){var dm,di,dl=["","webkit","ms","moz"],dk;if(!be){for(di=0;di<dl.length;di++){dk=dl[di];if(Object.prototype.hasOwnProperty.call(G,bT(dk,"hidden"))){if(G[bT(dk,"visibilityState")]==="prerender"){dm=true}break}}}if(dm){an(G,dk+"visibilitychange",function dj(){G.removeEventListener(dk+"visibilitychange",dj,false);dn()});return}dn()}function bq(){var dj=aY().uuid;var di=aI();return dj+di}function ci(di){if(!di){return}if(!ae.hasNodeAttribute(di,"href")){return}var dj=ae.getAttributeValueFromNode(di,"href");
60
- if(!dj||aU(dj)){return}dj=k(dj,av);var dk=bq();dj=F(dj,av,dk);ae.setAnyAttribute(di,"href",dj)}function aA(dl){var dm=ae.getAttributeValueFromNode(dl,"href");if(!dm){return false}dm=String(dm);var dj=dm.indexOf("//")===0||dm.indexOf("http://")===0||dm.indexOf("https://")===0;if(!dj){return false}var di=dl.pathname||ck(dl.href);var dk=(dl.hostname||d(dl.href)).toLowerCase();if(ar(dk,di)){if(!cE(cT,L(dk))){return true}return false}return false}function cD(di){var dj=db(di);if(dj&&dj.type){dj.href=p(dj.href);c0(dj.href,dj.type,undefined,null,di);return}if(cL){di=au(di);if(aA(di)){ci(di)}}}function cv(){return G.all&&!G.addEventListener}function cU(di){var dk=di.which;var dj=(typeof di.button);if(!dk&&dj!=="undefined"){if(cv()){if(di.button&1){dk=1}else{if(di.button&2){dk=3}else{if(di.button&4){dk=2}}}}else{if(di.button===0||di.button==="0"){dk=1}else{if(di.button&1){dk=2}else{if(di.button&2){dk=3}}}}}return dk}function bS(di){switch(cU(di)){case 1:return"left";case 2:return"middle";case 3:return"right"
61
- }}function a1(di){return di.target||di.srcElement}function aB(di){return function(dl){dl=dl||T.event;var dk=bS(dl);var dm=a1(dl);if(dl.type==="click"){var dj=false;if(di&&dk==="middle"){dj=true}if(dm&&!dj){cD(dm)}}else{if(dl.type==="mousedown"){if(dk==="middle"&&dm){aR=dk;bz=dm}else{aR=bz=null}}else{if(dl.type==="mouseup"){if(dk===aR&&dm===bz){cD(dm)}aR=bz=null}else{if(dl.type==="contextmenu"){cD(dm)}}}}}}function aq(dk,dj){var di=typeof dj;if(di==="undefined"){dj=true}an(dk,"click",aB(dj),false);if(dj){an(dk,"mouseup",aB(dj),false);an(dk,"mousedown",aB(dj),false);an(dk,"contextmenu",aB(dj),false)}}function bC(dk,dm){ap=true;var dl,dj=a0(by,"ignore"),dn=G.links,di=null,dp=null;if(dn){for(dl=0;dl<dn.length;dl++){di=dn[dl];if(!dj.test(di.className)){dp=typeof di.piwikTrackers;if("undefined"===dp){di.piwikTrackers=[]}if(-1===M(di.piwikTrackers,dm)){di.piwikTrackers.push(dm);aq(di,dk)}}}}}function aS(dj,dm,dn){if(ce){return true}ce=true;var dp=false;var dl,dk;function di(){dp=true}n(function(){function dq(ds){setTimeout(function(){if(!ce){return
62
- }dp=false;dn.trackVisibleContentImpressions();dq(ds)},ds)}function dr(ds){setTimeout(function(){if(!ce){return}if(dp){dp=false;dn.trackVisibleContentImpressions()}dr(ds)},ds)}if(dj){dl=["scroll","resize"];for(dk=0;dk<dl.length;dk++){if(G.addEventListener){G.addEventListener(dl[dk],di,false)}else{T.attachEvent("on"+dl[dk],di)}}dr(100)}if(dm&&dm>0){dm=parseInt(dm,10);dq(dm)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var di=this.requests;this.requests=[];if(di.length===1){bE(di[0],bI)}else{de(di,bI)}},push:function(di){if(!di){return}if(m||!this.enabled){bE(di,bI);return}bB.requests.push(di);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dj="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dj)){b[dj]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
63
- };this.getVisitorInfo=function(){return cM()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(di){aD=di};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(di,dk){if(!J(di)||null===di){di=this.getTrackerUrl()}var dj=new Q(di,dk);I.push(dj);e.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b5};this.setSiteId=function(di){b2(di)};this.resetUserId=function(){bx=""};this.setUserId=function(di){if(Y(di)){bx=di}};this.getUserId=function(){return bx};this.setCustomData=function(di,dj){if(W(di)){ao=di}else{if(!ao){ao={}}ao[di]=dj}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(di){ca=di};this.appendToTrackingUrl=function(di){cY=di
64
- };this.getRequest=function(di){return cs(di)};this.addPlugin=function(di,dj){b[di]=dj};this.setCustomDimension=function(di,dj){di=parseInt(di,10);if(di>0){if(!J(dj)){dj=""}if(!w(dj)){dj=String(dj)}bl[di]=dj}};this.getCustomDimension=function(di){di=parseInt(di,10);if(di>0&&Object.prototype.hasOwnProperty.call(bl,di)){return bl[di]}};this.deleteCustomDimension=function(di){di=parseInt(di,10);if(di>0){delete bl[di]}};this.setCustomVariable=function(dj,di,dm,dk){var dl;if(!J(dk)){dk="visit"}if(!J(di)){return}if(!J(dm)){dm=""}if(dj>0){di=!w(di)?String(di):di;dm=!w(dm)?String(dm):dm;dl=[di.slice(0,bs),dm.slice(0,bs)];if(dk==="visit"||dk===2){cC();aQ[dj]=dl}else{if(dk==="page"||dk===3){bV[dj]=dl}else{if(dk==="event"){cl[dj]=dl}}}}};this.getCustomVariable=function(dj,dk){var di;if(!J(dk)){dk="visit"}if(dk==="page"||dk===3){di=bV[dj]}else{if(dk==="event"){di=cl[dj]}else{if(dk==="visit"||dk===2){cC();di=aQ[dj]}}}if(!J(di)||(di&&di[0]==="")){return false}return di};this.deleteCustomVariable=function(di,dj){if(this.getCustomVariable(di,dj)){this.setCustomVariable(di,"","",dj)
65
- }};this.deleteCustomVariables=function(di){if(di==="page"||di===3){bV={}}else{if(di==="event"){cl={}}else{if(di==="visit"||di===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(di){bI=di};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(di){if(w(di)){di=di.split("|")}c5=di};this.addDownloadExtensions=function(dj){var di;if(w(dj)){dj=dj.split("|")}for(di=0;di<dj.length;di++){c5.push(dj[di])}};this.removeDownloadExtensions=function(dk){var dj,di=[];if(w(dk)){dk=dk.split("|")}for(dj=0;dj<c5.length;dj++){if(M(dk,c5[dj])===-1){di.push(c5[dj])}}c5=di};this.setDomains=function(di){ax=w(di)?[di]:di;var dm=false,dk=0,dj;for(dk;dk<ax.length;dk++){dj=String(ax[dk]);if(cE(cT,L(dj))){dm=true;break}var dl=ck(dj);if(dl&&dl!=="/"&&dl!=="/*"){dm=true;break}}if(!dm){ax.push(cT)}};this.enableCrossDomainLinking=function(){cL=true};this.disableCrossDomainLinking=function(){cL=false};this.isCrossDomainLinkingEnabled=function(){return cL
66
- };this.setCrossDomainLinkingTimeout=function(di){aZ=di};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(di){by=w(di)?[di]:di};this.setRequestMethod=function(di){c9=di||ch};this.setRequestContentType=function(di){cw=di||aH};this.setReferrerUrl=function(di){bm=di};this.setCustomUrl=function(di){a4=bU(bM,di)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(di){bi=di};this.setAPIUrl=function(di){bG=di};this.setDownloadClasses=function(di){bK=w(di)?[di]:di};this.setLinkClasses=function(di){a8=w(di)?[di]:di};this.setCampaignNameKey=function(di){cq=w(di)?[di]:di};this.setCampaignKeywordKey=function(di){bF=w(di)?[di]:di};this.discardHashTag=function(di){bO=di};this.setCookieNamePrefix=function(di){bj=di;aQ=bW()};this.setCookieDomain=function(di){var dj=L(di);if(bv(dj)){cW=dj;bh()}};this.getCookieDomain=function(){return cW};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dk,dj,di){if(!dk){throw new Error("Missing cookie name")
67
- }if(!J(di)){di=co}bt.push(dk);dd(aT(dk),dj,di,bo,cW)};this.getCookie=function(dj){var di=aC(aT(dj));if(di===0){return null}return di};this.setCookiePath=function(di){bo=di;bh()};this.getCookiePath=function(di){return bo};this.setVisitorCookieTimeout=function(di){cH=di*1000};this.setSessionCookieTimeout=function(di){co=di*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(di){c4=di*1000};this.setConversionAttributionFirstReferrer=function(di){bu=di};this.setSecureCookie=function(di){bR=di};this.disableCookies=function(){bk=true;c7.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dj){var di=h.doNotTrack||h.msDoNotTrack;cO=dj&&(di==="yes"||di==="1");if(cO){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cV=true};this.addListener=function(dj,di){aq(dj,di)};this.enableLinkTracking=function(dj){c8=true;var di=this;cg(function(){q(function(){bC(dj,di)})})};this.enableJSErrorTracking=function(){if(cR){return
68
- }cR=true;var di=T.onerror;T.onerror=function(dn,dl,dk,dm,dj){cg(function(){var dp="JavaScript Errors";var dq=dl+":"+dk;if(dm){dq+=":"+dm}at(dp,dq,dn)});if(di){return di(dn,dl,dk,dm,dj)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(di){cm=parseInt(di,10)};this.setVisitStandardLength=function(di){di=Math.max(di,5);c6=di};this.enableHeartBeatTimer=function(di){di=Math.max(di,5);a5=(di||15)*1000;if(cX!==null){df()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(di){if(T.location.protocol==="file:"){T.location=di}};this.setCountPreRendered=function(di){be=di};this.trackGoal=function(di,dl,dk,dj){cg(function(){cS(di,dl,dk,dj)})};this.trackLink=function(dj,di,dl,dk){cg(function(){c0(dj,di,dl,dk)
69
- })};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(di,dk,dj){b9=[];cI=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(di,dk,dj)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var di=v.findContentNodes();var dj=cy(di);de(dj,bI)})})};this.trackVisibleContentImpressions=function(di,dj){if(N(b5)){return}if(!J(di)){di=true}if(!J(dj)){dj=750}aS(di,dj,this);cg(function(){n(function(){var dk=v.findContentNodes();var dl=a9(dk);de(dl,bI)})})};this.trackContentImpression=function(dk,di,dj){if(N(b5)){return}dk=a(dk);di=a(di);dj=a(dj);if(!dk){return}di=di||"Unknown";cg(function(){var dl=aF(dk,di,dj);bE(dl,bI)})};this.trackContentImpressionsWithinNode=function(di){if(N(b5)||!di){return}cg(function(){if(ce){n(function(){var dj=v.findContentNodesWithinNode(di);var dk=a9(dj);de(dk,bI)})}else{q(function(){var dj=v.findContentNodesWithinNode(di);var dk=cy(dj);de(dk,bI)})}})};this.trackContentInteraction=function(dk,dl,di,dj){if(N(b5)){return
70
- }dk=a(dk);dl=a(dl);di=a(di);dj=a(dj);if(!dk||!dl){return}di=di||"Unknown";cg(function(){var dm=aP(dk,dl,di,dj);if(dm){bE(dm,bI)}})};this.trackContentInteractionNode=function(dj,di){if(N(b5)||!dj){return}cg(function(){var dk=da(dj,di);if(dk){bE(dk,bI)}})};this.logAllContentBlocksOnPage=function(){var dk=v.findContentNodes();var di=v.collectContent(dk);var dj=typeof console;if(dj!=="undefined"&&console&&console.log){console.log(di)}};this.trackEvent=function(dj,dl,di,dk,dn,dm){cg(function(){at(dj,dl,di,dk,dn,dm)})};this.trackSiteSearch=function(di,dk,dj,dl){b9=[];cg(function(){b7(di,dk,dj,dl)})};this.setEcommerceView=function(dl,di,dk,dj){if(Y(dk)){dk=String(dk)}if(!J(dk)||dk===null||dk===false||!dk.length){dk=""}else{if(dk instanceof Array){dk=JSON_PIWIK.stringify(dk)}}bV[5]=["_pkc",dk];if(J(dj)&&dj!==null&&dj!==false&&String(dj).length){bV[2]=["_pkp",dj]}if(!Y(dl)&&!Y(di)){return}if(Y(dl)){bV[3]=["_pks",dl]}if(!Y(di)){di=""}bV[4]=["_pkn",di]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cZ))
71
- };this.addEcommerceItem=function(dm,di,dk,dj,dl){if(Y(dm)){cZ[dm]=[String(dm),di,dk,dj,dl]}};this.removeEcommerceItem=function(di){if(Y(di)){di=String(di);delete cZ[di]}};this.clearEcommerceCart=function(){cZ={}};this.trackEcommerceOrder=function(di,dm,dl,dk,dj,dn){bY(di,dm,dl,dk,dj,dn)};this.trackEcommerceCartUpdate=function(di){br(di)};this.trackRequest=function(dj,dl,dk,di){cg(function(){var dm=cs(dj,dl,di);bE(dm,bI,dk)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(di){if(di<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=di};this.queueRequest=function(di){cg(function(){var dj=cs(di);bB.push(dj)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var di=aC(bd);if(aC(cK)){if(di){bX(bd,bo,cW)}return null}if(!di||di===0){return null}return di};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
72
- };this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cK,bo,cW);var dj,di;for(dj=0;dj<cI.length;dj++){di=typeof cI[dj];if(di==="string"){bE(cI[dj],bI)}else{if(di==="object"){de(cI[dj],bI)}}}cI=[]};this.rememberConsentGiven=function(dj){if(dj){dj=dj*60*60*1000}else{dj=30*365*24*60*60*1000}this.setConsentGiven();var di=new Date().getTime();dd(bd,di,dj,bo,cW,bR)};this.forgetConsentGiven=function(){var di=30*365*24*60*60*1000;bX(bd,bo,cW);dd(cK,new Date().getTime(),di,bo,cW,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
73
  if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
74
  if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
75
  }y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
8
  * @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
9
  * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
10
  */
11
+ ;if(typeof window.JSON==="object"&&typeof window.JSON.stringify==="function"&&typeof window.JSON.parse==="function"){JSON_PIWIK=window.JSON}else{(function(){var a={};
12
  /*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
13
  (function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
14
  var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
38
  if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
+ if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cL="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cU=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cS=false,ch="GET",da=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cZ="",b5=b8||"",bx="",bN="",a4,bi="",c6=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cU],by=[],bK=[],a8=[],bI=500,cW=false,cH,a5,bQ,c7=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cX,bo,bR=false,bk=false,cP,be,bu,cI=33955200000,co=1800000,c5=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,c0={},c8={},b9=[],ce=false,cA=false,ap=false,c9=false,cM=false,aN=false,bc=u(),cR=null,cY=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cJ=[],aw=U++;
42
+ try{bi=G.title}catch(cx){bi=""}function de(dq,dn,dm,dp,dl,dk){if(bk){return}var dj;if(dm){dj=new Date();dj.setTime(dj.getTime()+dm)}G.cookie=dq+"="+t(dn)+(dm?";expires="+dj.toGMTString():"")+";path="+(dp||"/")+(dl?";domain="+dl:"")+(dk?";secure":"")+";SameSite=Lax"}function aC(dl){if(bk){return 0}var dj=new RegExp("(^|;)[ ]*"+dl+"=([^;]*)"),dk=dj.exec(G.cookie);return dk?S(dk[2]):0}bA=!aC(cL);function b1(dj){var dk;dj=k(dj,av);if(bO){dk=new RegExp("#.*");return dj.replace(dk,"")}return dj}function bU(dl,dj){var dm=s(dj),dk;if(dm){return dj}if(dj.slice(0,1)==="/"){return s(dl)+"://"+d(dl)+dj}dl=b1(dl);dk=dl.indexOf("?");if(dk>=0){dl=dl.slice(0,dk)}dk=dl.lastIndexOf("/");if(dk!==dl.length-1){dl=dl.slice(0,dk+1)}return dl+dj}function cF(dl,dj){var dk;dl=String(dl).toLowerCase();dj=String(dj).toLowerCase();if(dl===dj){return true}if(dj.slice(0,1)==="."){if(dl===dj.slice(1)){return true}dk=dl.length-dj.length;if((dk>0)&&(dl.slice(dk)===dj)){return true}}return false}function ck(dj){var dk=document.createElement("a");
43
+ if(dj.indexOf("//")!==0&&dj.indexOf("http")!==0){if(dj.indexOf("*")===0){dj=dj.substr(1)}if(dj.indexOf(".")===0){dj=dj.substr(1)}dj="http://"+dj}dk.href=v.toAbsoluteUrl(dj);if(dk.pathname){return dk.pathname}return""}function a3(dk,dj){if(!aj(dj,"/")){dj="/"+dj}if(!aj(dk,"/")){dk="/"+dk}var dl=(dj==="/"||dj==="/*");if(dl){return true}if(dk===dj){return true}dj=String(dj).toLowerCase();dk=String(dk).toLowerCase();if(R(dj,"*")){dj=dj.slice(0,-1);dl=(!dj||dj==="/");if(dl){return true}if(dk===dj){return true}return dk.indexOf(dj)===0}if(!R(dk,"/")){dk+="/"}if(!R(dj,"/")){dj+="/"}return dk.indexOf(dj)===0}function ar(dn,dq){var dk,dj,dl,dm,dp;for(dk=0;dk<ax.length;dk++){dm=L(ax[dk]);dp=ck(ax[dk]);if(cF(dn,dm)&&a3(dq,dp)){return true}}return false}function aV(dm){var dk,dj,dl;for(dk=0;dk<ax.length;dk++){dj=L(ax[dk].toLowerCase());if(dm===dj){return true}if(dj.slice(0,1)==="."){if(dm===dj.slice(1)){return true}dl=dm.length-dj.length;if((dl>0)&&(dm.slice(dl)===dj)){return true}}}return false}function cp(dj,dl){dj=dj.replace("send_image=0","send_image=1");
44
+ var dk=new Image(1,1);dk.onload=function(){E=0;if(typeof dl==="function"){dl({request:dj,trackerUrl:aD,success:true})}};dk.onerror=function(){if(typeof dl==="function"){dl({request:dj,trackerUrl:aD,success:false})}};dk.src=aD+(aD.indexOf("?")<0?"?":"&")+dj}function cC(dj){if(da==="POST"){return true}return dj&&(dj.length>2000||dj.indexOf('{"requests"')===0)}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dn,dr,dq){var dl=aJ();if(!dl){return false}var dm={type:"application/x-www-form-urlencoded; charset=UTF-8"};var ds=false;var dk=aD;try{var dj=new Blob([dn],dm);if(dq&&!cC(dn)){dj=new Blob([],dm);dk=dk+(dk.indexOf("?")<0?"?":"&")+dn}ds=h.sendBeacon(dk,dj)}catch(dp){return false}if(ds&&typeof dr==="function"){dr({request:dn,trackerUrl:aD,success:true,isSendBeacon:true})}return ds}function c4(dk,dl,dj){if(!J(dj)||null===dj){dj=true}if(m&&a6(dk,dl,dj)){return}setTimeout(function(){if(m&&a6(dk,dl,dj)){return}var dp;try{var dn=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;
45
+ dn.open("POST",aD,true);dn.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dq=m&&a6(dk,dl,dj);if(!dq&&dj){cp(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dl==="function")){dl({request:dk,trackerUrl:aD,success:true,xhr:this})}}};dn.setRequestHeader("Content-Type",cw);dn.withCredentials=true;dn.send(dk)}catch(dm){dp=m&&a6(dk,dl,dj);if(!dp&&dj){cp(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aD,success:false})}}}},50)}function cf(dk){var dj=new Date();var dl=dj.getTime()+dk;if(!r||dl>r){r=dl}}function cn(dj){if(cb||!a5||!bA){return}cb=setTimeout(function dk(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dl=new Date(),dm=a5-(dl.getTime()-cY);dm=Math.min(a5,dm);cn(dm)},dj||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cR=new Date().getTime()}function dd(){var dj=new Date().getTime();
46
+ return !cR||(dj-cR)>a5}function ay(){if(dd()){bQ()}bJ()}function dg(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dd()){bQ()}}})}function cB(dn){var dk=new Date();var dj=dk.getTime();cY=dj;if(cA&&dj<cA){var dl=cA-dj;setTimeout(dn,dl);cf(dl+50);cA+=50;return}if(cA===false){var dm=800;cA=dj+dm}dn()}function aO(){if(aC(cL)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dk,dj,dl){aO();if(!bA){cJ.push(dk);return}if(!cP&&dk){if(cz&&bA){dk+="&consent=1"}cB(function(){if(cW&&a6(dk,dl,true)){cf(100);return}if(cC(dk)){c4(dk,dl)}else{cp(dk,dl)}cf(dj)})}if(!aN){dg()}}function cj(dj){if(cP){return false}return(dj&&dj.length)}function c3(dj,dn){if(!dn||dn>=dj.length){return[dj]}var dk=0;var dl=dj.length;var dm=[];for(dk;dk<dl;dk+=dn){dm.push(dj.slice(dk,dk+dn))}return dm}function df(dk,dj){if(!cj(dk)){return}if(!bA){cJ.push(dk);return}cB(function(){var dn=c3(dk,50);var dl=0,dm;for(dl;dl<dn.length;dl++){dm='{"requests":["?'+dn[dl].join('","?')+'"]}';
47
+ if(cW&&a6(dm,null,false)){cf(100)}else{c4(dm,null,false)}}cf(dj)})}function aT(dj){return bj+dj+"."+b5+"."+bn}function bX(dl,dk,dj){de(dl,"",-86400,dk,dj)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var dj=bj+"testcookie";de(dj,"1",undefined,bo,cX,bR);var dk=aC(dj)==="1"?"1":"0";bX(dj);return dk}function bh(){bn=b6((cX||cU)+(bo||"/")).slice(0,4)}function cG(){if(J(c8.res)){return c8}var dk,dm,dn={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dk in dn){if(Object.prototype.hasOwnProperty.call(dn,dk)){dm=h.mimeTypes[dn[dk]];c8[dk]=(dm&&dm.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c8.java="1"
48
+ }if(A(T.GearsFactory)){c8.gears="1"}c8.cookie=b4()}var dl=parseInt(X.width,10);var dj=parseInt(X.height,10);c8.res=parseInt(dl,10)+"x"+parseInt(dj,10);return c8}function bW(){var dk=aT("cvar"),dj=aC(dk);if(dj.length){dj=JSON_PIWIK.parse(dj);if(W(dj)){return dj}}return{}}function cD(){if(aQ===false){aQ=bW()}}function cQ(){var dj=cG();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(dj)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var dj=cG();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(dj)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dk=bf();var dl=az();var dj=String(dk)+dl;return dj}function c2(dl){dl=String(dl);var dp=az();var dm=dp.length;var dn=dl.substr(-1*dm,dm);var dk=parseInt(dl.substr(0,dl.length-dm),10);if(dk&&dn&&dn===dp){var dj=bf();if(aZ<=0){return true}if(dj>=dk&&dj<=(dk+aZ)){return true}}return false}function dh(dj){if(!cM){return""}var dn=f(dj,av);if(!dn){return""}dn=String(dn);
49
+ var dl=new RegExp("^[a-zA-Z0-9]+$");if(dn.length===32&&dl.test(dn)){var dk=dn.substr(16,32);if(c2(dk)){var dm=dn.substr(0,16);return dm}}return""}function cN(){if(!bN){bN=dh(bM)}var dl=new Date(),dj=Math.round(dl.getTime()/1000),dk=aT("id"),dp=aC(dk),dn,dm;if(dp){dn=dp.split(".");dn.unshift("0");if(bN.length){dn[1]=bN}return dn}if(bN.length){dm=bN}else{if("0"===b4()){dm=""}else{dm=cQ()}}dn=["1",dm,dj,0,dj,"",""];return dn}function aY(){var dr=cN(),dm=dr[0],dn=dr[1],dk=dr[2],dj=dr[3],dp=dr[4],dl=dr[5];if(!J(dr[6])){dr[6]=""}var dq=dr[6];return{newVisitor:dm,uuid:dn,createTs:dk,visitCount:dj,currentVisitTs:dp,lastVisitTs:dl,lastEcommerceOrderTs:dq}}function aG(){var dm=new Date(),dk=dm.getTime(),dn=aY().createTs;var dj=parseInt(dn,10);var dl=(dj*1000)+cI-dk;return dl}function aL(dj){if(!b5){return}var dl=new Date(),dk=Math.round(dl.getTime()/1000);if(!J(dj)){dj=aY()}var dm=dj.uuid+"."+dj.createTs+"."+dj.visitCount+"."+dk+"."+dj.lastVisitTs+"."+dj.lastEcommerceOrderTs;de(aT("id"),dm,aG(),bo,cX,bR)
50
+ }function bL(){var dj=aC(aT("ref"));if(dj.length){try{dj=JSON_PIWIK.parse(dj);if(W(dj)){return dj}}catch(dk){}}return["","",0,""]}function bv(dk){var dj="testvalue";de("test",dj,10000,null,dk);if(aC("test")===dj){bX("test",null,dk);return true}return false}function aE(){var dk=bk;bk=false;var dj,dl;for(dj=0;dj<bt.length;dj++){dl=aT(bt[dj]);if(dl!==cL&&dl!==bd&&0!==aC(dl)){bX(dl,bo,cX)}}bk=dk}function b2(dj){b5=dj;aL()}function di(dn){if(!dn||!W(dn)){return}var dm=[];var dl;for(dl in dn){if(Object.prototype.hasOwnProperty.call(dn,dl)){dm.push(dl)}}var dp={};dm.sort();var dj=dm.length;var dk;for(dk=0;dk<dj;dk++){dp[dm[dk]]=dn[dm[dk]]}return dp}function cc(){de(aT("ses"),"1",co,bo,cX,bR)}function bg(){var dm="";var dk="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dl=dk.length;var dj;for(dj=0;dj<6;dj++){dm+=dk.charAt(Math.floor(Math.random()*dl))}return dm}function cs(dl,dH,dI,dm){var dG,dk=new Date(),du=Math.round(dk.getTime()/1000),dr,dF,dn=1024,dO,dv,dD=aQ,dp=aT("ses"),dB=aT("ref"),dy=aT("cvar"),dz=aC(dp),dE=bL(),dK=a4||bM,ds,dj;
51
+ if(bk){aE()}if(cP){return""}var dA=aY();if(!J(dm)){dm=""}var dx=G.characterSet||G.charset;if(!dx||dx.toLowerCase()==="utf-8"){dx=null}ds=dE[0];dj=dE[1];dr=dE[2];dF=dE[3];if(!dz){var dJ=co/1000;if(!dA.lastVisitTs||(du-dA.lastVisitTs)>dJ){dA.visitCount++;dA.lastVisitTs=dA.currentVisitTs}if(!bu||!ds.length){for(dG in cq){if(Object.prototype.hasOwnProperty.call(cq,dG)){ds=f(dK,cq[dG]);if(ds.length){break}}}for(dG in bF){if(Object.prototype.hasOwnProperty.call(bF,dG)){dj=f(dK,bF[dG]);if(dj.length){break}}}}dO=d(bm);dv=dF.length?d(dF):"";if(dO.length&&!aV(dO)&&(!bu||!dv.length||aV(dv))){dF=bm}if(dF.length||ds.length){dr=du;dE=[ds,dj,dr,b1(dF.slice(0,dn))];de(dB,JSON_PIWIK.stringify(dE),c5,bo,cX)}}dl+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dk.getHours()+"&m="+dk.getMinutes()+"&s="+dk.getSeconds()+"&url="+t(b1(dK))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dA.uuid+"&_idts="+dA.createTs+"&_idvc="+dA.visitCount+"&_idn="+dA.newVisitor+(ds.length?"&_rcn="+t(ds):"")+(dj.length?"&_rck="+t(dj):"")+"&_refts="+dr+"&_viewts="+dA.lastVisitTs+(String(dA.lastEcommerceOrderTs).length?"&_ects="+dA.lastEcommerceOrderTs:"")+(String(dF).length?"&_ref="+t(b1(dF.slice(0,dn))):"")+(dx?"&cs="+t(dx):"")+"&send_image=0";
52
+ var dN=cG();for(dG in dN){if(Object.prototype.hasOwnProperty.call(dN,dG)){dl+="&"+dG+"="+dN[dG]}}var dM=[];if(dH){for(dG in dH){if(Object.prototype.hasOwnProperty.call(dH,dG)&&/^dimension\d+$/.test(dG)){var dq=dG.replace("dimension","");dM.push(parseInt(dq,10));dM.push(String(dq));dl+="&"+dG+"="+t(dH[dG]);delete dH[dG]}}}if(dH&&B(dH)){dH=null}for(dG in bl){if(Object.prototype.hasOwnProperty.call(bl,dG)){var dw=(-1===M(dM,dG));if(dw){dl+="&dimension"+dG+"="+t(bl[dG])}}}if(dH){dl+="&data="+t(JSON_PIWIK.stringify(dH))}else{if(ao){dl+="&data="+t(JSON_PIWIK.stringify(ao))}}function dt(dP,dQ){var dR=JSON_PIWIK.stringify(dP);if(dR.length>2){return"&"+dQ+"="+t(dR)}return""}var dL=di(bV);var dC=di(cl);dl+=dt(dL,"cvar");dl+=dt(dC,"e_cvar");if(aQ){dl+=dt(aQ,"_cvar");for(dG in dD){if(Object.prototype.hasOwnProperty.call(dD,dG)){if(aQ[dG][0]===""||aQ[dG][1]===""){delete aQ[dG]}}}if(bP){de(dy,JSON_PIWIK.stringify(aQ),co,bo,cX)}}if(a2){if(cm){dl+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dl+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
53
+ }}}if(aK){dl+="&pv_id="+aK}dA.lastEcommerceOrderTs=J(dm)&&String(dm).length?dm:dA.lastEcommerceOrderTs;aL(dA);cc();dl+=ac(dI,{tracker:bH,request:dl});if(cZ.length){dl+="&"+cZ}if(A(ca)){dl=ca(dl)}return dl}bQ=function a7(){var dj=new Date();dj=dj.getTime();if(!cY){return false}if((cY+(1000*c7))<=dj){return false}if(cY+a5<=dj){bH.ping();return true}return false};function bp(dm,dl,ds,dn,dj,dv){var dq="idgoal=0",dr,dk=new Date(),dt=[],du,dp=String(dm).length;if(dp){dq+="&ec_id="+t(dm);dr=Math.round(dk.getTime()/1000)}dq+="&revenue="+dl;if(String(ds).length){dq+="&ec_st="+ds}if(String(dn).length){dq+="&ec_tx="+dn}if(String(dj).length){dq+="&ec_sh="+dj}if(String(dv).length){dq+="&ec_dt="+dv}if(c0){for(du in c0){if(Object.prototype.hasOwnProperty.call(c0,du)){if(!J(c0[du][1])){c0[du][1]=""}if(!J(c0[du][2])){c0[du][2]=""}if(!J(c0[du][3])||String(c0[du][3]).length===0){c0[du][3]=0}if(!J(c0[du][4])||String(c0[du][4]).length===0){c0[du][4]=1}dt.push(c0[du])}}dq+="&ec_items="+t(JSON_PIWIK.stringify(dt))
54
+ }dq=cs(dq,ao,"ecommerce",dr);bE(dq,bI);if(dp){c0={}}}function bY(dj,dn,dm,dl,dk,dp){if(String(dj).length&&J(dn)){bp(dj,dn,dm,dl,dk,dp)}}function br(dj){if(J(dj)){bp("",dj,"","","","")}}function bZ(dk,dm,dl){aK=bg();var dj=cs("action_name="+t(al(dk||bi)),dm,"log");bE(dj,bI,dl)}function a0(dl,dk){var dm,dj="(^| )(piwik[_-]"+dk;if(dl){for(dm=0;dm<dl.length;dm++){dj+="|"+dl[dm]}}dj+=")( |$)";return new RegExp(dj)}function aU(dj){return(aD&&dj&&0===String(dj).indexOf(aD))}function cu(dn,dj,dp,dk){if(aU(dj)){return 0}var dm=a0(bK,"download"),dl=a0(a8,"link"),dq=new RegExp("\\.("+c6.join("|")+")([?&#]|$)","i");if(dl.test(dn)){return"link"}if(dk||dm.test(dn)||dq.test(dj)){return"download"}if(dp){return 0}return"link"}function au(dk){var dj;dj=dk.parentNode;while(dj!==null&&J(dj)){if(ae.isLinkElement(dk)){break}dk=dj;dj=dk.parentNode}return dk}function dc(dp){dp=au(dp);if(!ae.hasNodeAttribute(dp,"href")){return}if(!J(dp.href)){return}var dn=ae.getAttributeValueFromNode(dp,"href");if(aU(dn)){return
55
+ }var dk=dp.pathname||ck(dp.href);var dq=dp.hostname||d(dp.href);var dr=dq.toLowerCase();var dl=dp.href.replace(dq,dr);var dm=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dm.test(dl)){var dj=cu(dp.className,dl,ar(dr,dk),ae.hasNodeAttribute(dp,"download"));if(dj){return{type:dj,href:dl}}}}function aP(dj,dk,dl,dm){var dn=v.buildInteractionRequestParams(dj,dk,dl,dm);if(!dn){return}return cs(dn,null,"contentInteraction")}function cK(dl,dm,dr,dj,dk){if(!J(dl)){return}if(aU(dl)){return dl}var dp=v.toAbsoluteUrl(dl);var dn="redirecturl="+t(dp)+"&";dn+=aP(dm,dr,dj,(dk||dl));var dq="&";if(aD.indexOf("?")<0){dq="?"}return aD+dq+dn}function bb(dj,dk){if(!dj||!dk){return false}var dl=v.findTargetNode(dj);if(v.shouldIgnoreInteraction(dl)){return false}dl=v.findTargetNodeNoDefault(dj);if(dl&&!V(dl,dk)){return false}return true}function ct(dl,dk,dn){if(!dl){return}var dj=v.findParentContentNode(dl);if(!dj){return}if(!bb(dj,dl)){return}var dm=v.buildContentBlock(dj);
56
+ if(!dm){return}if(!dm.target&&dn){dm.target=dn}return v.buildInteractionRequestParams(dk,dm.name,dm.piece,dm.target)}function aW(dk){if(!b9||!b9.length){return false}var dj,dl;for(dj=0;dj<b9.length;dj++){dl=b9[dj];if(dl&&dl.name===dk.name&&dl.piece===dk.piece&&dl.target===dk.target){return true}}return false}function bD(dm){if(!dm){return false}var dq=v.findTargetNode(dm);if(!dq||v.shouldIgnoreInteraction(dq)){return false}var dr=dc(dq);if(c9&&dr&&dr.type){return false}if(ae.isLinkElement(dq)&&ae.hasNodeAttributeWithValue(dq,"href")){var dj=String(ae.getAttributeValueFromNode(dq,"href"));if(0===dj.indexOf("#")){return false}if(aU(dj)){return true}if(!v.isUrlToCurrentDomain(dj)){return false}var dn=v.buildContentBlock(dm);if(!dn){return}var dl=dn.name;var ds=dn.piece;var dp=dn.target;if(!ae.hasNodeAttributeWithValue(dq,v.CONTENT_TARGET_ATTR)||dq.wasContentTargetAttrReplaced){dq.wasContentTargetAttrReplaced=true;dp=v.toAbsoluteUrl(dj);ae.setAnyAttribute(dq,v.CONTENT_TARGET_ATTR,dp)}var dk=cK(dj,"click",dl,ds,dp);
57
+ v.setHrefAttribute(dq,dk);return true}return false}function aM(dk){if(!dk||!dk.length){return}var dj;for(dj=0;dj<dk.length;dj++){bD(dk[dj])}}function aX(dj){return function(dk){if(!dj){return}var dn=v.findParentContentNode(dj);var dp;if(dk){dp=dk.target||dk.srcElement}if(!dp){dp=dj}if(!bb(dn,dp)){return}cf(bI);if(ae.isLinkElement(dj)&&ae.hasNodeAttributeWithValue(dj,"href")&&ae.hasNodeAttributeWithValue(dj,v.CONTENT_TARGET_ATTR)){var dl=ae.getAttributeValueFromNode(dj,"href");if(!aU(dl)&&dj.wasContentTargetAttrReplaced){ae.setAnyAttribute(dj,v.CONTENT_TARGET_ATTR,"")}}var dt=dc(dj);if(ap&&dt&&dt.type){return dt.type}if(bD(dn)){return"href"}var dq=v.buildContentBlock(dn);if(!dq){return}var dm=dq.name;var du=dq.piece;var ds=dq.target;var dr=aP("click",dm,du,ds);if(dr){bE(dr,bI)}return dr}}function b0(dl){if(!dl||!dl.length){return}var dj,dk;for(dj=0;dj<dl.length;dj++){dk=v.findTargetNode(dl[dj]);if(dk&&!dk.contentInteractionTrackingSetupDone){dk.contentInteractionTrackingSetupDone=true;an(dk,"click",aX(dk))
58
+ }}}function bw(dl,dm){if(!dl||!dl.length){return[]}var dj,dk;for(dj=0;dj<dl.length;dj++){if(aW(dl[dj])){dl.splice(dj,1);dj--}else{b9.push(dl[dj])}}if(!dl||!dl.length){return[]}aM(dm);b0(dm);var dn=[];for(dj=0;dj<dl.length;dj++){dk=cs(v.buildImpressionRequestParams(dl[dj].name,dl[dj].piece,dl[dj].target),undefined,"contentImpressions");if(dk){dn.push(dk)}}return dn}function cy(dk){var dj=v.collectContent(dk);return bw(dj,dk)}function a9(dk){if(!dk||!dk.length){return[]}var dj;for(dj=0;dj<dk.length;dj++){if(!v.isNodeVisible(dk[dj])){dk.splice(dj,1);dj--}}if(!dk||!dk.length){return[]}return cy(dk)}function aF(dl,dj,dk){var dm=v.buildImpressionRequestParams(dl,dj,dk);return cs(dm,null,"contentImpression")}function db(dm,dk){if(!dm){return}var dj=v.findParentContentNode(dm);var dl=v.buildContentBlock(dj);if(!dl){return}if(!dk){dk="Unknown"}return aP(dk,dl.name,dl.piece,dl.target)}function cO(dk,dm,dj,dl){return"e_c="+t(dk)+"&e_a="+t(dm)+(J(dj)?"&e_n="+t(dj):"")+(J(dl)?"&e_v="+t(dl):"")}function at(dl,dn,dj,dm,dq,dp){if(a(String(dl)).length===0||a(String(dn)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
59
+ return false}var dk=cs(cO(dl,dn,dj,dm),dq,"event");bE(dk,bI,dp)}function b7(dj,dm,dk,dn){var dl=cs("search="+t(dj)+(dm?"&search_cat="+t(dm):"")+(J(dk)?"&search_count="+dk:""),dn,"sitesearch");bE(dl,bI)}function cT(dj,dn,dm,dl){var dk=cs("idgoal="+dj+(dn?"&revenue="+dn:""),dm,"goal");bE(dk,bI,dl)}function c1(dm,dj,dr,dq,dl){var dp=dj+"="+t(b1(dm));var dk=ct(dl,"click",dm);if(dk){dp+="&"+dk}var dn=cs(dp,dr,"link");bE(dn,bI,dq)}function bT(dk,dj){if(dk!==""){return dk+dj.charAt(0).toUpperCase()+dj.slice(1)}return dj}function cg(dp){var dn,dj,dm=["","webkit","ms","moz"],dl;if(!be){for(dj=0;dj<dm.length;dj++){dl=dm[dj];if(Object.prototype.hasOwnProperty.call(G,bT(dl,"hidden"))){if(G[bT(dl,"visibilityState")]==="prerender"){dn=true}break}}}if(dn){an(G,dl+"visibilitychange",function dk(){G.removeEventListener(dl+"visibilitychange",dk,false);dp()});return}dp()}function bq(){var dk=aY().uuid;var dj=aI();return dk+dj}function ci(dj){if(!dj){return}if(!ae.hasNodeAttribute(dj,"href")){return}var dk=ae.getAttributeValueFromNode(dj,"href");
60
+ if(!dk||aU(dk)){return}dk=k(dk,av);var dl=bq();dk=F(dk,av,dl);ae.setAnyAttribute(dj,"href",dk)}function aA(dm){var dn=ae.getAttributeValueFromNode(dm,"href");if(!dn){return false}dn=String(dn);var dk=dn.indexOf("//")===0||dn.indexOf("http://")===0||dn.indexOf("https://")===0;if(!dk){return false}var dj=dm.pathname||ck(dm.href);var dl=(dm.hostname||d(dm.href)).toLowerCase();if(ar(dl,dj)){if(!cF(cU,L(dl))){return true}return false}return false}function cE(dj){var dk=dc(dj);if(dk&&dk.type){dk.href=p(dk.href);c1(dk.href,dk.type,undefined,null,dj);return}if(cM){dj=au(dj);if(aA(dj)){ci(dj)}}}function cv(){return G.all&&!G.addEventListener}function cV(dj){var dl=dj.which;var dk=(typeof dj.button);if(!dl&&dk!=="undefined"){if(cv()){if(dj.button&1){dl=1}else{if(dj.button&2){dl=3}else{if(dj.button&4){dl=2}}}}else{if(dj.button===0||dj.button==="0"){dl=1}else{if(dj.button&1){dl=2}else{if(dj.button&2){dl=3}}}}}return dl}function bS(dj){switch(cV(dj)){case 1:return"left";case 2:return"middle";case 3:return"right"
61
+ }}function a1(dj){return dj.target||dj.srcElement}function aB(dj){return function(dm){dm=dm||T.event;var dl=bS(dm);var dn=a1(dm);if(dm.type==="click"){var dk=false;if(dj&&dl==="middle"){dk=true}if(dn&&!dk){cE(dn)}}else{if(dm.type==="mousedown"){if(dl==="middle"&&dn){aR=dl;bz=dn}else{aR=bz=null}}else{if(dm.type==="mouseup"){if(dl===aR&&dn===bz){cE(dn)}aR=bz=null}else{if(dm.type==="contextmenu"){cE(dn)}}}}}}function aq(dl,dk){var dj=typeof dk;if(dj==="undefined"){dk=true}an(dl,"click",aB(dk),false);if(dk){an(dl,"mouseup",aB(dk),false);an(dl,"mousedown",aB(dk),false);an(dl,"contextmenu",aB(dk),false)}}function bC(dl,dn){ap=true;var dm,dk=a0(by,"ignore"),dp=G.links,dj=null,dq=null;if(dp){for(dm=0;dm<dp.length;dm++){dj=dp[dm];if(!dk.test(dj.className)){dq=typeof dj.piwikTrackers;if("undefined"===dq){dj.piwikTrackers=[]}if(-1===M(dj.piwikTrackers,dn)){dj.piwikTrackers.push(dn);aq(dj,dl)}}}}}function aS(dk,dn,dp){if(ce){return true}ce=true;var dq=false;var dm,dl;function dj(){dq=true}n(function(){function dr(dt){setTimeout(function(){if(!ce){return
62
+ }dq=false;dp.trackVisibleContentImpressions();dr(dt)},dt)}function ds(dt){setTimeout(function(){if(!ce){return}if(dq){dq=false;dp.trackVisibleContentImpressions()}ds(dt)},dt)}if(dk){dm=["scroll","resize"];for(dl=0;dl<dm.length;dl++){if(G.addEventListener){G.addEventListener(dm[dl],dj,false)}else{T.attachEvent("on"+dm[dl],dj)}}ds(100)}if(dn&&dn>0){dn=parseInt(dn,10);dr(dn)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dj=this.requests;this.requests=[];if(dj.length===1){bE(dj[0],bI)}else{df(dj,bI)}},push:function(dj){if(!dj){return}if(m||!this.enabled){bE(dj,bI);return}bB.requests.push(dj);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dk="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dk)){b[dk]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
63
+ };this.getVisitorInfo=function(){return cN()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(dj){aD=dj};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(dj,dl){if(!J(dj)||null===dj){dj=this.getTrackerUrl()}var dk=new Q(dj,dl);I.push(dk);e.trigger("TrackerAdded",[this]);return dk};this.getSiteId=function(){return b5};this.setSiteId=function(dj){b2(dj)};this.resetUserId=function(){bx=""};this.setUserId=function(dj){if(Y(dj)){bx=dj}};this.getUserId=function(){return bx};this.setCustomData=function(dj,dk){if(W(dj)){ao=dj}else{if(!ao){ao={}}ao[dj]=dk}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dj){ca=dj};this.appendToTrackingUrl=function(dj){cZ=dj
64
+ };this.getRequest=function(dj){return cs(dj)};this.addPlugin=function(dj,dk){b[dj]=dk};this.setCustomDimension=function(dj,dk){dj=parseInt(dj,10);if(dj>0){if(!J(dk)){dk=""}if(!w(dk)){dk=String(dk)}bl[dj]=dk}};this.getCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0&&Object.prototype.hasOwnProperty.call(bl,dj)){return bl[dj]}};this.deleteCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0){delete bl[dj]}};this.setCustomVariable=function(dk,dj,dn,dl){var dm;if(!J(dl)){dl="visit"}if(!J(dj)){return}if(!J(dn)){dn=""}if(dk>0){dj=!w(dj)?String(dj):dj;dn=!w(dn)?String(dn):dn;dm=[dj.slice(0,bs),dn.slice(0,bs)];if(dl==="visit"||dl===2){cD();aQ[dk]=dm}else{if(dl==="page"||dl===3){bV[dk]=dm}else{if(dl==="event"){cl[dk]=dm}}}}};this.getCustomVariable=function(dk,dl){var dj;if(!J(dl)){dl="visit"}if(dl==="page"||dl===3){dj=bV[dk]}else{if(dl==="event"){dj=cl[dk]}else{if(dl==="visit"||dl===2){cD();dj=aQ[dk]}}}if(!J(dj)||(dj&&dj[0]==="")){return false}return dj};this.deleteCustomVariable=function(dj,dk){if(this.getCustomVariable(dj,dk)){this.setCustomVariable(dj,"","",dk)
65
+ }};this.deleteCustomVariables=function(dj){if(dj==="page"||dj===3){bV={}}else{if(dj==="event"){cl={}}else{if(dj==="visit"||dj===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(dj){bI=dj};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(dj){if(w(dj)){dj=dj.split("|")}c6=dj};this.addDownloadExtensions=function(dk){var dj;if(w(dk)){dk=dk.split("|")}for(dj=0;dj<dk.length;dj++){c6.push(dk[dj])}};this.removeDownloadExtensions=function(dl){var dk,dj=[];if(w(dl)){dl=dl.split("|")}for(dk=0;dk<c6.length;dk++){if(M(dl,c6[dk])===-1){dj.push(c6[dk])}}c6=dj};this.setDomains=function(dj){ax=w(dj)?[dj]:dj;var dn=false,dl=0,dk;for(dl;dl<ax.length;dl++){dk=String(ax[dl]);if(cF(cU,L(dk))){dn=true;break}var dm=ck(dk);if(dm&&dm!=="/"&&dm!=="/*"){dn=true;break}}if(!dn){ax.push(cU)}};this.enableCrossDomainLinking=function(){cM=true};this.disableCrossDomainLinking=function(){cM=false};this.isCrossDomainLinkingEnabled=function(){return cM
66
+ };this.setCrossDomainLinkingTimeout=function(dj){aZ=dj};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(dj){by=w(dj)?[dj]:dj};this.setRequestMethod=function(dj){da=dj||ch};this.setRequestContentType=function(dj){cw=dj||aH};this.setReferrerUrl=function(dj){bm=dj};this.setCustomUrl=function(dj){a4=bU(bM,dj)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(dj){bi=dj};this.setAPIUrl=function(dj){bG=dj};this.setDownloadClasses=function(dj){bK=w(dj)?[dj]:dj};this.setLinkClasses=function(dj){a8=w(dj)?[dj]:dj};this.setCampaignNameKey=function(dj){cq=w(dj)?[dj]:dj};this.setCampaignKeywordKey=function(dj){bF=w(dj)?[dj]:dj};this.discardHashTag=function(dj){bO=dj};this.setCookieNamePrefix=function(dj){bj=dj;aQ=bW()};this.setCookieDomain=function(dj){var dk=L(dj);if(bv(dk)){cX=dk;bh()}};this.getCookieDomain=function(){return cX};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dl,dk,dj){if(!dl){throw new Error("Missing cookie name")
67
+ }if(!J(dj)){dj=co}bt.push(dl);de(aT(dl),dk,dj,bo,cX)};this.getCookie=function(dk){var dj=aC(aT(dk));if(dj===0){return null}return dj};this.setCookiePath=function(dj){bo=dj;bh()};this.getCookiePath=function(dj){return bo};this.setVisitorCookieTimeout=function(dj){cI=dj*1000};this.setSessionCookieTimeout=function(dj){co=dj*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(dj){c5=dj*1000};this.setConversionAttributionFirstReferrer=function(dj){bu=dj};this.setSecureCookie=function(dj){bR=dj};this.disableCookies=function(){bk=true;c8.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dk){var dj=h.doNotTrack||h.msDoNotTrack;cP=dk&&(dj==="yes"||dj==="1");if(cP){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cW=true};this.addListener=function(dk,dj){aq(dk,dj)};this.enableLinkTracking=function(dk){c9=true;var dj=this;cg(function(){q(function(){bC(dk,dj)})})};this.enableJSErrorTracking=function(){if(cS){return
68
+ }cS=true;var dj=T.onerror;T.onerror=function(dp,dm,dl,dn,dk){cg(function(){var dq="JavaScript Errors";var dr=dm+":"+dl;if(dn){dr+=":"+dn}at(dq,dr,dp)});if(dj){return dj(dp,dm,dl,dn,dk)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(dj){cm=parseInt(dj,10)};this.setVisitStandardLength=function(dj){dj=Math.max(dj,5);c7=dj};this.enableHeartBeatTimer=function(dj){dj=Math.max(dj,5);a5=(dj||15)*1000;if(cY!==null){dg()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(dj){if(T.location.protocol==="file:"){T.location=dj}};this.setCountPreRendered=function(dj){be=dj};this.trackGoal=function(dj,dm,dl,dk){cg(function(){cT(dj,dm,dl,dk)})};this.trackLink=function(dk,dj,dm,dl){cg(function(){c1(dk,dj,dm,dl)
69
+ })};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(dj,dl,dk){b9=[];cJ=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(dj,dl,dk)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var dj=v.findContentNodes();var dk=cy(dj);df(dk,bI)})})};this.trackVisibleContentImpressions=function(dj,dk){if(N(b5)){return}if(!J(dj)){dj=true}if(!J(dk)){dk=750}aS(dj,dk,this);cg(function(){n(function(){var dl=v.findContentNodes();var dm=a9(dl);df(dm,bI)})})};this.trackContentImpression=function(dl,dj,dk){if(N(b5)){return}dl=a(dl);dj=a(dj);dk=a(dk);if(!dl){return}dj=dj||"Unknown";cg(function(){var dm=aF(dl,dj,dk);bE(dm,bI)})};this.trackContentImpressionsWithinNode=function(dj){if(N(b5)||!dj){return}cg(function(){if(ce){n(function(){var dk=v.findContentNodesWithinNode(dj);var dl=a9(dk);df(dl,bI)})}else{q(function(){var dk=v.findContentNodesWithinNode(dj);var dl=cy(dk);df(dl,bI)})}})};this.trackContentInteraction=function(dl,dm,dj,dk){if(N(b5)){return
70
+ }dl=a(dl);dm=a(dm);dj=a(dj);dk=a(dk);if(!dl||!dm){return}dj=dj||"Unknown";cg(function(){var dn=aP(dl,dm,dj,dk);if(dn){bE(dn,bI)}})};this.trackContentInteractionNode=function(dk,dj){if(N(b5)||!dk){return}cg(function(){var dl=db(dk,dj);if(dl){bE(dl,bI)}})};this.logAllContentBlocksOnPage=function(){var dl=v.findContentNodes();var dj=v.collectContent(dl);var dk=typeof console;if(dk!=="undefined"&&console&&console.log){console.log(dj)}};this.trackEvent=function(dk,dm,dj,dl,dp,dn){cg(function(){at(dk,dm,dj,dl,dp,dn)})};this.trackSiteSearch=function(dj,dl,dk,dm){b9=[];cg(function(){b7(dj,dl,dk,dm)})};this.setEcommerceView=function(dm,dj,dl,dk){if(Y(dl)){dl=String(dl)}if(!J(dl)||dl===null||dl===false||!dl.length){dl=""}else{if(dl instanceof Array){dl=JSON_PIWIK.stringify(dl)}}bV[5]=["_pkc",dl];if(J(dk)&&dk!==null&&dk!==false&&String(dk).length){bV[2]=["_pkp",dk]}if(!Y(dm)&&!Y(dj)){return}if(Y(dm)){bV[3]=["_pks",dm]}if(!Y(dj)){dj=""}bV[4]=["_pkn",dj]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c0))
71
+ };this.addEcommerceItem=function(dn,dj,dl,dk,dm){if(Y(dn)){c0[dn]=[String(dn),dj,dl,dk,dm]}};this.removeEcommerceItem=function(dj){if(Y(dj)){dj=String(dj);delete c0[dj]}};this.clearEcommerceCart=function(){c0={}};this.trackEcommerceOrder=function(dj,dn,dm,dl,dk,dp){bY(dj,dn,dm,dl,dk,dp)};this.trackEcommerceCartUpdate=function(dj){br(dj)};this.trackRequest=function(dk,dm,dl,dj){cg(function(){var dn=cs(dk,dm,dj);bE(dn,bI,dl)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(dj){if(dj<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=dj};this.queueRequest=function(dj){cg(function(){var dk=cs(dj);bB.push(dk)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var dj=aC(bd);if(aC(cL)){if(dj){bX(bd,bo,cX)}return null}if(!dj||dj===0){return null}return dj};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
72
+ };this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cL,bo,cX);var dk,dj;for(dk=0;dk<cJ.length;dk++){dj=typeof cJ[dk];if(dj==="string"){bE(cJ[dk],bI)}else{if(dj==="object"){df(cJ[dk],bI)}}}cJ=[]};this.rememberConsentGiven=function(dk){if(dk){dk=dk*60*60*1000}else{dk=30*365*24*60*60*1000}this.setConsentGiven();var dj=new Date().getTime();de(bd,dj,dk,bo,cX,bR)};this.forgetConsentGiven=function(){var dj=30*365*24*60*60*1000;bX(bd,bo,cX);de(cL,new Date().getTime(),dj,bo,cX,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
73
  if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
74
  if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
75
  }y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
app/piwik.js CHANGED
@@ -8,7 +8,7 @@
8
  * @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
9
  * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
10
  */
11
- ;if(typeof JSON_PIWIK!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON_PIWIK=window.JSON}else{(function(){var a={};
12
  /*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
13
  (function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
14
  var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
@@ -38,38 +38,38 @@ if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq
38
  if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
- if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
42
- try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
43
- if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
44
- var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
45
- dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
46
- }function ay(){if(dc()){bQ()}bJ()}function df(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dc()){bQ()}}})}function cB(dm){var dj=new Date();var di=dj.getTime();cX=di;if(cA&&di<cA){var dk=cA-di;setTimeout(dm,dk);cf(dk+50);cA+=50;return}if(cA===false){var dl=800;cA=di+dl}dm()}function aO(){if(aC(cK)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dj,di,dk){aO();if(!bA){cI.push(dj);return}if(!cO&&dj){if(cz&&bA){dj+="&consent=1"}cB(function(){if(cV&&a6(dj,dk)){cf(100);return}if(c9==="POST"||String(dj).length>2000){c3(dj,dk)}else{cp(dj,dk)}cf(di)})}if(!aN){df()}}function cj(di){if(cO){return false}return(di&&di.length)}function c2(di,dm){if(!dm||dm>=di.length){return[di]}var dj=0;var dk=di.length;var dl=[];for(dj;dj<dk;dj+=dm){dl.push(di.slice(dj,dj+dm))}return dl}function de(dj,di){if(!cj(dj)){return}if(!bA){cI.push(dj);return}cB(function(){var dm=c2(dj,50);var dk=0,dl;for(dk;dk<dm.length;dk++){dl='{"requests":["?'+dm[dk].join('","?')+'"]}';
47
- c3(dl,null,false)}cf(di)})}function aT(di){return bj+di+"."+b5+"."+bn}function bX(dk,dj,di){dd(dk,"",-86400,dj,di)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var di=bj+"testcookie";dd(di,"1",undefined,bo,cW,bR);var dj=aC(di)==="1"?"1":"0";bX(di);return dj}function bh(){bn=b6((cW||cT)+(bo||"/")).slice(0,4)}function cF(){if(J(c7.res)){return c7}var dj,dl,dm={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dj in dm){if(Object.prototype.hasOwnProperty.call(dm,dj)){dl=h.mimeTypes[dm[dj]];c7[dj]=(dl&&dl.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c7.java="1"
48
- }if(A(T.GearsFactory)){c7.gears="1"}c7.cookie=b4()}var dk=parseInt(X.width,10);var di=parseInt(X.height,10);c7.res=parseInt(dk,10)+"x"+parseInt(di,10);return c7}function bW(){var dj=aT("cvar"),di=aC(dj);if(di.length){di=JSON_PIWIK.parse(di);if(W(di)){return di}}return{}}function cC(){if(aQ===false){aQ=bW()}}function cP(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dj=bf();var dk=az();var di=String(dj)+dk;return di}function c1(dk){dk=String(dk);var dn=az();var dl=dn.length;var dm=dk.substr(-1*dl,dl);var dj=parseInt(dk.substr(0,dk.length-dl),10);if(dj&&dm&&dm===dn){var di=bf();if(aZ<=0){return true}if(di>=dj&&di<=(dj+aZ)){return true}}return false}function dg(di){if(!cL){return""}var dm=f(di,av);if(!dm){return""}dm=String(dm);
49
- var dk=new RegExp("^[a-zA-Z0-9]+$");if(dm.length===32&&dk.test(dm)){var dj=dm.substr(16,32);if(c1(dj)){var dl=dm.substr(0,16);return dl}}return""}function cM(){if(!bN){bN=dg(bM)}var dk=new Date(),di=Math.round(dk.getTime()/1000),dj=aT("id"),dn=aC(dj),dm,dl;if(dn){dm=dn.split(".");dm.unshift("0");if(bN.length){dm[1]=bN}return dm}if(bN.length){dl=bN}else{if("0"===b4()){dl=""}else{dl=cP()}}dm=["1",dl,di,0,di,"",""];return dm}function aY(){var dq=cM(),dl=dq[0],dm=dq[1],dj=dq[2],di=dq[3],dn=dq[4],dk=dq[5];if(!J(dq[6])){dq[6]=""}var dp=dq[6];return{newVisitor:dl,uuid:dm,createTs:dj,visitCount:di,currentVisitTs:dn,lastVisitTs:dk,lastEcommerceOrderTs:dp}}function aG(){var dl=new Date(),dj=dl.getTime(),dm=aY().createTs;var di=parseInt(dm,10);var dk=(di*1000)+cH-dj;return dk}function aL(di){if(!b5){return}var dk=new Date(),dj=Math.round(dk.getTime()/1000);if(!J(di)){di=aY()}var dl=di.uuid+"."+di.createTs+"."+di.visitCount+"."+dj+"."+di.lastVisitTs+"."+di.lastEcommerceOrderTs;dd(aT("id"),dl,aG(),bo,cW,bR)
50
- }function bL(){var di=aC(aT("ref"));if(di.length){try{di=JSON_PIWIK.parse(di);if(W(di)){return di}}catch(dj){}}return["","",0,""]}function bv(dj){var di="testvalue";dd("test",di,10000,null,dj);if(aC("test")===di){bX("test",null,dj);return true}return false}function aE(){var dj=bk;bk=false;var di,dk;for(di=0;di<bt.length;di++){dk=aT(bt[di]);if(dk!==cK&&dk!==bd&&0!==aC(dk)){bX(dk,bo,cW)}}bk=dj}function b2(di){b5=di;aL()}function dh(dm){if(!dm||!W(dm)){return}var dl=[];var dk;for(dk in dm){if(Object.prototype.hasOwnProperty.call(dm,dk)){dl.push(dk)}}var dn={};dl.sort();var di=dl.length;var dj;for(dj=0;dj<di;dj++){dn[dl[dj]]=dm[dl[dj]]}return dn}function cc(){dd(aT("ses"),"1",co,bo,cW,bR)}function bg(){var dl="";var dj="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dk=dj.length;var di;for(di=0;di<6;di++){dl+=dj.charAt(Math.floor(Math.random()*dk))}return dl}function cs(dk,dG,dH,dl){var dF,dj=new Date(),dt=Math.round(dj.getTime()/1000),dq,dE,dm=1024,dN,du,dC=aQ,dn=aT("ses"),dA=aT("ref"),dx=aT("cvar"),dy=aC(dn),dD=bL(),dJ=a4||bM,dr,di;
51
- if(bk){aE()}if(cO){return""}var dz=aY();if(!J(dl)){dl=""}var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dD[0];di=dD[1];dq=dD[2];dE=dD[3];if(!dy){var dI=co/1000;if(!dz.lastVisitTs||(dt-dz.lastVisitTs)>dI){dz.visitCount++;dz.lastVisitTs=dz.currentVisitTs}if(!bu||!dr.length){for(dF in cq){if(Object.prototype.hasOwnProperty.call(cq,dF)){dr=f(dJ,cq[dF]);if(dr.length){break}}}for(dF in bF){if(Object.prototype.hasOwnProperty.call(bF,dF)){di=f(dJ,bF[dF]);if(di.length){break}}}}dN=d(bm);du=dE.length?d(dE):"";if(dN.length&&!aV(dN)&&(!bu||!du.length||aV(du))){dE=bm}if(dE.length||dr.length){dq=dt;dD=[dr,di,dq,b1(dE.slice(0,dm))];dd(dA,JSON_PIWIK.stringify(dD),c4,bo,cW)}}dk+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dj.getHours()+"&m="+dj.getMinutes()+"&s="+dj.getSeconds()+"&url="+t(b1(dJ))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dz.uuid+"&_idts="+dz.createTs+"&_idvc="+dz.visitCount+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+t(dr):"")+(di.length?"&_rck="+t(di):"")+"&_refts="+dq+"&_viewts="+dz.lastVisitTs+(String(dz.lastEcommerceOrderTs).length?"&_ects="+dz.lastEcommerceOrderTs:"")+(String(dE).length?"&_ref="+t(b1(dE.slice(0,dm))):"")+(dw?"&cs="+t(dw):"")+"&send_image=0";
52
- var dM=cF();for(dF in dM){if(Object.prototype.hasOwnProperty.call(dM,dF)){dk+="&"+dF+"="+dM[dF]}}var dL=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dL.push(parseInt(dp,10));dL.push(String(dp));dk+="&"+dF+"="+t(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in bl){if(Object.prototype.hasOwnProperty.call(bl,dF)){var dv=(-1===M(dL,dF));if(dv){dk+="&dimension"+dF+"="+t(bl[dF])}}}if(dG){dk+="&data="+t(JSON_PIWIK.stringify(dG))}else{if(ao){dk+="&data="+t(JSON_PIWIK.stringify(ao))}}function ds(dO,dP){var dQ=JSON_PIWIK.stringify(dO);if(dQ.length>2){return"&"+dP+"="+t(dQ)}return""}var dK=dh(bV);var dB=dh(cl);dk+=ds(dK,"cvar");dk+=ds(dB,"e_cvar");if(aQ){dk+=ds(aQ,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aQ[dF][0]===""||aQ[dF][1]===""){delete aQ[dF]}}}if(bP){dd(dx,JSON_PIWIK.stringify(aQ),co,bo,cW)}}if(a2){if(cm){dk+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dk+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
53
- }}}if(aK){dk+="&pv_id="+aK}dz.lastEcommerceOrderTs=J(dl)&&String(dl).length?dl:dz.lastEcommerceOrderTs;aL(dz);cc();dk+=ac(dH,{tracker:bH,request:dk});if(cY.length){dk+="&"+cY}if(A(ca)){dk=ca(dk)}return dk}bQ=function a7(){var di=new Date();di=di.getTime();if(!cX){return false}if((cX+(1000*c6))<=di){return false}if(cX+a5<=di){bH.ping();return true}return false};function bp(dl,dk,dr,dm,di,du){var dp="idgoal=0",dq,dj=new Date(),ds=[],dt,dn=String(dl).length;if(dn){dp+="&ec_id="+t(dl);dq=Math.round(dj.getTime()/1000)}dp+="&revenue="+dk;if(String(dr).length){dp+="&ec_st="+dr}if(String(dm).length){dp+="&ec_tx="+dm}if(String(di).length){dp+="&ec_sh="+di}if(String(du).length){dp+="&ec_dt="+du}if(cZ){for(dt in cZ){if(Object.prototype.hasOwnProperty.call(cZ,dt)){if(!J(cZ[dt][1])){cZ[dt][1]=""}if(!J(cZ[dt][2])){cZ[dt][2]=""}if(!J(cZ[dt][3])||String(cZ[dt][3]).length===0){cZ[dt][3]=0}if(!J(cZ[dt][4])||String(cZ[dt][4]).length===0){cZ[dt][4]=1}ds.push(cZ[dt])}}dp+="&ec_items="+t(JSON_PIWIK.stringify(ds))
54
- }dp=cs(dp,ao,"ecommerce",dq);bE(dp,bI);if(dn){cZ={}}}function bY(di,dm,dl,dk,dj,dn){if(String(di).length&&J(dm)){bp(di,dm,dl,dk,dj,dn)}}function br(di){if(J(di)){bp("",di,"","","","")}}function bZ(dj,dl,dk){aK=bg();var di=cs("action_name="+t(al(dj||bi)),dl,"log");bE(di,bI,dk)}function a0(dk,dj){var dl,di="(^| )(piwik[_-]"+dj;if(dk){for(dl=0;dl<dk.length;dl++){di+="|"+dk[dl]}}di+=")( |$)";return new RegExp(di)}function aU(di){return(aD&&di&&0===String(di).indexOf(aD))}function cu(dm,di,dn,dj){if(aU(di)){return 0}var dl=a0(bK,"download"),dk=a0(a8,"link"),dp=new RegExp("\\.("+c5.join("|")+")([?&#]|$)","i");if(dk.test(dm)){return"link"}if(dj||dl.test(dm)||dp.test(di)){return"download"}if(dn){return 0}return"link"}function au(dj){var di;di=dj.parentNode;while(di!==null&&J(di)){if(ae.isLinkElement(dj)){break}dj=di;di=dj.parentNode}return dj}function db(dn){dn=au(dn);if(!ae.hasNodeAttribute(dn,"href")){return}if(!J(dn.href)){return}var dm=ae.getAttributeValueFromNode(dn,"href");if(aU(dm)){return
55
- }var dj=dn.pathname||ck(dn.href);var dp=dn.hostname||d(dn.href);var dq=dp.toLowerCase();var dk=dn.href.replace(dp,dq);var dl=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dl.test(dk)){var di=cu(dn.className,dk,ar(dq,dj),ae.hasNodeAttribute(dn,"download"));if(di){return{type:di,href:dk}}}}function aP(di,dj,dk,dl){var dm=v.buildInteractionRequestParams(di,dj,dk,dl);if(!dm){return}return cs(dm,null,"contentInteraction")}function cJ(dk,dl,dq,di,dj){if(!J(dk)){return}if(aU(dk)){return dk}var dn=v.toAbsoluteUrl(dk);var dm="redirecturl="+t(dn)+"&";dm+=aP(dl,dq,di,(dj||dk));var dp="&";if(aD.indexOf("?")<0){dp="?"}return aD+dp+dm}function bb(di,dj){if(!di||!dj){return false}var dk=v.findTargetNode(di);if(v.shouldIgnoreInteraction(dk)){return false}dk=v.findTargetNodeNoDefault(di);if(dk&&!V(dk,dj)){return false}return true}function ct(dk,dj,dm){if(!dk){return}var di=v.findParentContentNode(dk);if(!di){return}if(!bb(di,dk)){return}var dl=v.buildContentBlock(di);
56
- if(!dl){return}if(!dl.target&&dm){dl.target=dm}return v.buildInteractionRequestParams(dj,dl.name,dl.piece,dl.target)}function aW(dj){if(!b9||!b9.length){return false}var di,dk;for(di=0;di<b9.length;di++){dk=b9[di];if(dk&&dk.name===dj.name&&dk.piece===dj.piece&&dk.target===dj.target){return true}}return false}function bD(dl){if(!dl){return false}var dp=v.findTargetNode(dl);if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dq=db(dp);if(c8&&dq&&dq.type){return false}if(ae.isLinkElement(dp)&&ae.hasNodeAttributeWithValue(dp,"href")){var di=String(ae.getAttributeValueFromNode(dp,"href"));if(0===di.indexOf("#")){return false}if(aU(di)){return true}if(!v.isUrlToCurrentDomain(di)){return false}var dm=v.buildContentBlock(dl);if(!dm){return}var dk=dm.name;var dr=dm.piece;var dn=dm.target;if(!ae.hasNodeAttributeWithValue(dp,v.CONTENT_TARGET_ATTR)||dp.wasContentTargetAttrReplaced){dp.wasContentTargetAttrReplaced=true;dn=v.toAbsoluteUrl(di);ae.setAnyAttribute(dp,v.CONTENT_TARGET_ATTR,dn)}var dj=cJ(di,"click",dk,dr,dn);
57
- v.setHrefAttribute(dp,dj);return true}return false}function aM(dj){if(!dj||!dj.length){return}var di;for(di=0;di<dj.length;di++){bD(dj[di])}}function aX(di){return function(dj){if(!di){return}var dm=v.findParentContentNode(di);var dn;if(dj){dn=dj.target||dj.srcElement}if(!dn){dn=di}if(!bb(dm,dn)){return}cf(bI);if(ae.isLinkElement(di)&&ae.hasNodeAttributeWithValue(di,"href")&&ae.hasNodeAttributeWithValue(di,v.CONTENT_TARGET_ATTR)){var dk=ae.getAttributeValueFromNode(di,"href");if(!aU(dk)&&di.wasContentTargetAttrReplaced){ae.setAnyAttribute(di,v.CONTENT_TARGET_ATTR,"")}}var ds=db(di);if(ap&&ds&&ds.type){return ds.type}if(bD(dm)){return"href"}var dp=v.buildContentBlock(dm);if(!dp){return}var dl=dp.name;var dt=dp.piece;var dr=dp.target;var dq=aP("click",dl,dt,dr);if(dq){bE(dq,bI)}return dq}}function b0(dk){if(!dk||!dk.length){return}var di,dj;for(di=0;di<dk.length;di++){dj=v.findTargetNode(dk[di]);if(dj&&!dj.contentInteractionTrackingSetupDone){dj.contentInteractionTrackingSetupDone=true;an(dj,"click",aX(dj))
58
- }}}function bw(dk,dl){if(!dk||!dk.length){return[]}var di,dj;for(di=0;di<dk.length;di++){if(aW(dk[di])){dk.splice(di,1);di--}else{b9.push(dk[di])}}if(!dk||!dk.length){return[]}aM(dl);b0(dl);var dm=[];for(di=0;di<dk.length;di++){dj=cs(v.buildImpressionRequestParams(dk[di].name,dk[di].piece,dk[di].target),undefined,"contentImpressions");if(dj){dm.push(dj)}}return dm}function cy(dj){var di=v.collectContent(dj);return bw(di,dj)}function a9(dj){if(!dj||!dj.length){return[]}var di;for(di=0;di<dj.length;di++){if(!v.isNodeVisible(dj[di])){dj.splice(di,1);di--}}if(!dj||!dj.length){return[]}return cy(dj)}function aF(dk,di,dj){var dl=v.buildImpressionRequestParams(dk,di,dj);return cs(dl,null,"contentImpression")}function da(dl,dj){if(!dl){return}var di=v.findParentContentNode(dl);var dk=v.buildContentBlock(di);if(!dk){return}if(!dj){dj="Unknown"}return aP(dj,dk.name,dk.piece,dk.target)}function cN(dj,dl,di,dk){return"e_c="+t(dj)+"&e_a="+t(dl)+(J(di)?"&e_n="+t(di):"")+(J(dk)?"&e_v="+t(dk):"")}function at(dk,dm,di,dl,dp,dn){if(a(String(dk)).length===0||a(String(dm)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
59
- return false}var dj=cs(cN(dk,dm,di,dl),dp,"event");bE(dj,bI,dn)}function b7(di,dl,dj,dm){var dk=cs("search="+t(di)+(dl?"&search_cat="+t(dl):"")+(J(dj)?"&search_count="+dj:""),dm,"sitesearch");bE(dk,bI)}function cS(di,dm,dl,dk){var dj=cs("idgoal="+di+(dm?"&revenue="+dm:""),dl,"goal");bE(dj,bI,dk)}function c0(dl,di,dq,dp,dk){var dn=di+"="+t(b1(dl));var dj=ct(dk,"click",dl);if(dj){dn+="&"+dj}var dm=cs(dn,dq,"link");bE(dm,bI,dp)}function bT(dj,di){if(dj!==""){return dj+di.charAt(0).toUpperCase()+di.slice(1)}return di}function cg(dn){var dm,di,dl=["","webkit","ms","moz"],dk;if(!be){for(di=0;di<dl.length;di++){dk=dl[di];if(Object.prototype.hasOwnProperty.call(G,bT(dk,"hidden"))){if(G[bT(dk,"visibilityState")]==="prerender"){dm=true}break}}}if(dm){an(G,dk+"visibilitychange",function dj(){G.removeEventListener(dk+"visibilitychange",dj,false);dn()});return}dn()}function bq(){var dj=aY().uuid;var di=aI();return dj+di}function ci(di){if(!di){return}if(!ae.hasNodeAttribute(di,"href")){return}var dj=ae.getAttributeValueFromNode(di,"href");
60
- if(!dj||aU(dj)){return}dj=k(dj,av);var dk=bq();dj=F(dj,av,dk);ae.setAnyAttribute(di,"href",dj)}function aA(dl){var dm=ae.getAttributeValueFromNode(dl,"href");if(!dm){return false}dm=String(dm);var dj=dm.indexOf("//")===0||dm.indexOf("http://")===0||dm.indexOf("https://")===0;if(!dj){return false}var di=dl.pathname||ck(dl.href);var dk=(dl.hostname||d(dl.href)).toLowerCase();if(ar(dk,di)){if(!cE(cT,L(dk))){return true}return false}return false}function cD(di){var dj=db(di);if(dj&&dj.type){dj.href=p(dj.href);c0(dj.href,dj.type,undefined,null,di);return}if(cL){di=au(di);if(aA(di)){ci(di)}}}function cv(){return G.all&&!G.addEventListener}function cU(di){var dk=di.which;var dj=(typeof di.button);if(!dk&&dj!=="undefined"){if(cv()){if(di.button&1){dk=1}else{if(di.button&2){dk=3}else{if(di.button&4){dk=2}}}}else{if(di.button===0||di.button==="0"){dk=1}else{if(di.button&1){dk=2}else{if(di.button&2){dk=3}}}}}return dk}function bS(di){switch(cU(di)){case 1:return"left";case 2:return"middle";case 3:return"right"
61
- }}function a1(di){return di.target||di.srcElement}function aB(di){return function(dl){dl=dl||T.event;var dk=bS(dl);var dm=a1(dl);if(dl.type==="click"){var dj=false;if(di&&dk==="middle"){dj=true}if(dm&&!dj){cD(dm)}}else{if(dl.type==="mousedown"){if(dk==="middle"&&dm){aR=dk;bz=dm}else{aR=bz=null}}else{if(dl.type==="mouseup"){if(dk===aR&&dm===bz){cD(dm)}aR=bz=null}else{if(dl.type==="contextmenu"){cD(dm)}}}}}}function aq(dk,dj){var di=typeof dj;if(di==="undefined"){dj=true}an(dk,"click",aB(dj),false);if(dj){an(dk,"mouseup",aB(dj),false);an(dk,"mousedown",aB(dj),false);an(dk,"contextmenu",aB(dj),false)}}function bC(dk,dm){ap=true;var dl,dj=a0(by,"ignore"),dn=G.links,di=null,dp=null;if(dn){for(dl=0;dl<dn.length;dl++){di=dn[dl];if(!dj.test(di.className)){dp=typeof di.piwikTrackers;if("undefined"===dp){di.piwikTrackers=[]}if(-1===M(di.piwikTrackers,dm)){di.piwikTrackers.push(dm);aq(di,dk)}}}}}function aS(dj,dm,dn){if(ce){return true}ce=true;var dp=false;var dl,dk;function di(){dp=true}n(function(){function dq(ds){setTimeout(function(){if(!ce){return
62
- }dp=false;dn.trackVisibleContentImpressions();dq(ds)},ds)}function dr(ds){setTimeout(function(){if(!ce){return}if(dp){dp=false;dn.trackVisibleContentImpressions()}dr(ds)},ds)}if(dj){dl=["scroll","resize"];for(dk=0;dk<dl.length;dk++){if(G.addEventListener){G.addEventListener(dl[dk],di,false)}else{T.attachEvent("on"+dl[dk],di)}}dr(100)}if(dm&&dm>0){dm=parseInt(dm,10);dq(dm)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var di=this.requests;this.requests=[];if(di.length===1){bE(di[0],bI)}else{de(di,bI)}},push:function(di){if(!di){return}if(m||!this.enabled){bE(di,bI);return}bB.requests.push(di);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dj="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dj)){b[dj]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
63
- };this.getVisitorInfo=function(){return cM()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(di){aD=di};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(di,dk){if(!J(di)||null===di){di=this.getTrackerUrl()}var dj=new Q(di,dk);I.push(dj);e.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b5};this.setSiteId=function(di){b2(di)};this.resetUserId=function(){bx=""};this.setUserId=function(di){if(Y(di)){bx=di}};this.getUserId=function(){return bx};this.setCustomData=function(di,dj){if(W(di)){ao=di}else{if(!ao){ao={}}ao[di]=dj}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(di){ca=di};this.appendToTrackingUrl=function(di){cY=di
64
- };this.getRequest=function(di){return cs(di)};this.addPlugin=function(di,dj){b[di]=dj};this.setCustomDimension=function(di,dj){di=parseInt(di,10);if(di>0){if(!J(dj)){dj=""}if(!w(dj)){dj=String(dj)}bl[di]=dj}};this.getCustomDimension=function(di){di=parseInt(di,10);if(di>0&&Object.prototype.hasOwnProperty.call(bl,di)){return bl[di]}};this.deleteCustomDimension=function(di){di=parseInt(di,10);if(di>0){delete bl[di]}};this.setCustomVariable=function(dj,di,dm,dk){var dl;if(!J(dk)){dk="visit"}if(!J(di)){return}if(!J(dm)){dm=""}if(dj>0){di=!w(di)?String(di):di;dm=!w(dm)?String(dm):dm;dl=[di.slice(0,bs),dm.slice(0,bs)];if(dk==="visit"||dk===2){cC();aQ[dj]=dl}else{if(dk==="page"||dk===3){bV[dj]=dl}else{if(dk==="event"){cl[dj]=dl}}}}};this.getCustomVariable=function(dj,dk){var di;if(!J(dk)){dk="visit"}if(dk==="page"||dk===3){di=bV[dj]}else{if(dk==="event"){di=cl[dj]}else{if(dk==="visit"||dk===2){cC();di=aQ[dj]}}}if(!J(di)||(di&&di[0]==="")){return false}return di};this.deleteCustomVariable=function(di,dj){if(this.getCustomVariable(di,dj)){this.setCustomVariable(di,"","",dj)
65
- }};this.deleteCustomVariables=function(di){if(di==="page"||di===3){bV={}}else{if(di==="event"){cl={}}else{if(di==="visit"||di===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(di){bI=di};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(di){if(w(di)){di=di.split("|")}c5=di};this.addDownloadExtensions=function(dj){var di;if(w(dj)){dj=dj.split("|")}for(di=0;di<dj.length;di++){c5.push(dj[di])}};this.removeDownloadExtensions=function(dk){var dj,di=[];if(w(dk)){dk=dk.split("|")}for(dj=0;dj<c5.length;dj++){if(M(dk,c5[dj])===-1){di.push(c5[dj])}}c5=di};this.setDomains=function(di){ax=w(di)?[di]:di;var dm=false,dk=0,dj;for(dk;dk<ax.length;dk++){dj=String(ax[dk]);if(cE(cT,L(dj))){dm=true;break}var dl=ck(dj);if(dl&&dl!=="/"&&dl!=="/*"){dm=true;break}}if(!dm){ax.push(cT)}};this.enableCrossDomainLinking=function(){cL=true};this.disableCrossDomainLinking=function(){cL=false};this.isCrossDomainLinkingEnabled=function(){return cL
66
- };this.setCrossDomainLinkingTimeout=function(di){aZ=di};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(di){by=w(di)?[di]:di};this.setRequestMethod=function(di){c9=di||ch};this.setRequestContentType=function(di){cw=di||aH};this.setReferrerUrl=function(di){bm=di};this.setCustomUrl=function(di){a4=bU(bM,di)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(di){bi=di};this.setAPIUrl=function(di){bG=di};this.setDownloadClasses=function(di){bK=w(di)?[di]:di};this.setLinkClasses=function(di){a8=w(di)?[di]:di};this.setCampaignNameKey=function(di){cq=w(di)?[di]:di};this.setCampaignKeywordKey=function(di){bF=w(di)?[di]:di};this.discardHashTag=function(di){bO=di};this.setCookieNamePrefix=function(di){bj=di;aQ=bW()};this.setCookieDomain=function(di){var dj=L(di);if(bv(dj)){cW=dj;bh()}};this.getCookieDomain=function(){return cW};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dk,dj,di){if(!dk){throw new Error("Missing cookie name")
67
- }if(!J(di)){di=co}bt.push(dk);dd(aT(dk),dj,di,bo,cW)};this.getCookie=function(dj){var di=aC(aT(dj));if(di===0){return null}return di};this.setCookiePath=function(di){bo=di;bh()};this.getCookiePath=function(di){return bo};this.setVisitorCookieTimeout=function(di){cH=di*1000};this.setSessionCookieTimeout=function(di){co=di*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(di){c4=di*1000};this.setConversionAttributionFirstReferrer=function(di){bu=di};this.setSecureCookie=function(di){bR=di};this.disableCookies=function(){bk=true;c7.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dj){var di=h.doNotTrack||h.msDoNotTrack;cO=dj&&(di==="yes"||di==="1");if(cO){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cV=true};this.addListener=function(dj,di){aq(dj,di)};this.enableLinkTracking=function(dj){c8=true;var di=this;cg(function(){q(function(){bC(dj,di)})})};this.enableJSErrorTracking=function(){if(cR){return
68
- }cR=true;var di=T.onerror;T.onerror=function(dn,dl,dk,dm,dj){cg(function(){var dp="JavaScript Errors";var dq=dl+":"+dk;if(dm){dq+=":"+dm}at(dp,dq,dn)});if(di){return di(dn,dl,dk,dm,dj)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(di){cm=parseInt(di,10)};this.setVisitStandardLength=function(di){di=Math.max(di,5);c6=di};this.enableHeartBeatTimer=function(di){di=Math.max(di,5);a5=(di||15)*1000;if(cX!==null){df()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(di){if(T.location.protocol==="file:"){T.location=di}};this.setCountPreRendered=function(di){be=di};this.trackGoal=function(di,dl,dk,dj){cg(function(){cS(di,dl,dk,dj)})};this.trackLink=function(dj,di,dl,dk){cg(function(){c0(dj,di,dl,dk)
69
- })};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(di,dk,dj){b9=[];cI=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(di,dk,dj)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var di=v.findContentNodes();var dj=cy(di);de(dj,bI)})})};this.trackVisibleContentImpressions=function(di,dj){if(N(b5)){return}if(!J(di)){di=true}if(!J(dj)){dj=750}aS(di,dj,this);cg(function(){n(function(){var dk=v.findContentNodes();var dl=a9(dk);de(dl,bI)})})};this.trackContentImpression=function(dk,di,dj){if(N(b5)){return}dk=a(dk);di=a(di);dj=a(dj);if(!dk){return}di=di||"Unknown";cg(function(){var dl=aF(dk,di,dj);bE(dl,bI)})};this.trackContentImpressionsWithinNode=function(di){if(N(b5)||!di){return}cg(function(){if(ce){n(function(){var dj=v.findContentNodesWithinNode(di);var dk=a9(dj);de(dk,bI)})}else{q(function(){var dj=v.findContentNodesWithinNode(di);var dk=cy(dj);de(dk,bI)})}})};this.trackContentInteraction=function(dk,dl,di,dj){if(N(b5)){return
70
- }dk=a(dk);dl=a(dl);di=a(di);dj=a(dj);if(!dk||!dl){return}di=di||"Unknown";cg(function(){var dm=aP(dk,dl,di,dj);if(dm){bE(dm,bI)}})};this.trackContentInteractionNode=function(dj,di){if(N(b5)||!dj){return}cg(function(){var dk=da(dj,di);if(dk){bE(dk,bI)}})};this.logAllContentBlocksOnPage=function(){var dk=v.findContentNodes();var di=v.collectContent(dk);var dj=typeof console;if(dj!=="undefined"&&console&&console.log){console.log(di)}};this.trackEvent=function(dj,dl,di,dk,dn,dm){cg(function(){at(dj,dl,di,dk,dn,dm)})};this.trackSiteSearch=function(di,dk,dj,dl){b9=[];cg(function(){b7(di,dk,dj,dl)})};this.setEcommerceView=function(dl,di,dk,dj){if(Y(dk)){dk=String(dk)}if(!J(dk)||dk===null||dk===false||!dk.length){dk=""}else{if(dk instanceof Array){dk=JSON_PIWIK.stringify(dk)}}bV[5]=["_pkc",dk];if(J(dj)&&dj!==null&&dj!==false&&String(dj).length){bV[2]=["_pkp",dj]}if(!Y(dl)&&!Y(di)){return}if(Y(dl)){bV[3]=["_pks",dl]}if(!Y(di)){di=""}bV[4]=["_pkn",di]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cZ))
71
- };this.addEcommerceItem=function(dm,di,dk,dj,dl){if(Y(dm)){cZ[dm]=[String(dm),di,dk,dj,dl]}};this.removeEcommerceItem=function(di){if(Y(di)){di=String(di);delete cZ[di]}};this.clearEcommerceCart=function(){cZ={}};this.trackEcommerceOrder=function(di,dm,dl,dk,dj,dn){bY(di,dm,dl,dk,dj,dn)};this.trackEcommerceCartUpdate=function(di){br(di)};this.trackRequest=function(dj,dl,dk,di){cg(function(){var dm=cs(dj,dl,di);bE(dm,bI,dk)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(di){if(di<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=di};this.queueRequest=function(di){cg(function(){var dj=cs(di);bB.push(dj)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var di=aC(bd);if(aC(cK)){if(di){bX(bd,bo,cW)}return null}if(!di||di===0){return null}return di};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
72
- };this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cK,bo,cW);var dj,di;for(dj=0;dj<cI.length;dj++){di=typeof cI[dj];if(di==="string"){bE(cI[dj],bI)}else{if(di==="object"){de(cI[dj],bI)}}}cI=[]};this.rememberConsentGiven=function(dj){if(dj){dj=dj*60*60*1000}else{dj=30*365*24*60*60*1000}this.setConsentGiven();var di=new Date().getTime();dd(bd,di,dj,bo,cW,bR)};this.forgetConsentGiven=function(){var di=30*365*24*60*60*1000;bX(bd,bo,cW);dd(cK,new Date().getTime(),di,bo,cW,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
73
  if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
74
  if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
75
  }y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
8
  * @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
9
  * @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
10
  */
11
+ ;if(typeof window.JSON==="object"&&typeof window.JSON.stringify==="function"&&typeof window.JSON.parse==="function"){JSON_PIWIK=window.JSON}else{(function(){var a={};
12
  /*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
13
  (function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
14
  var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
38
  if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
39
  }var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
40
  }var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
41
+ if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cL="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cU=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cS=false,ch="GET",da=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cZ="",b5=b8||"",bx="",bN="",a4,bi="",c6=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cU],by=[],bK=[],a8=[],bI=500,cW=false,cH,a5,bQ,c7=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cX,bo,bR=false,bk=false,cP,be,bu,cI=33955200000,co=1800000,c5=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,c0={},c8={},b9=[],ce=false,cA=false,ap=false,c9=false,cM=false,aN=false,bc=u(),cR=null,cY=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cJ=[],aw=U++;
42
+ try{bi=G.title}catch(cx){bi=""}function de(dq,dn,dm,dp,dl,dk){if(bk){return}var dj;if(dm){dj=new Date();dj.setTime(dj.getTime()+dm)}G.cookie=dq+"="+t(dn)+(dm?";expires="+dj.toGMTString():"")+";path="+(dp||"/")+(dl?";domain="+dl:"")+(dk?";secure":"")+";SameSite=Lax"}function aC(dl){if(bk){return 0}var dj=new RegExp("(^|;)[ ]*"+dl+"=([^;]*)"),dk=dj.exec(G.cookie);return dk?S(dk[2]):0}bA=!aC(cL);function b1(dj){var dk;dj=k(dj,av);if(bO){dk=new RegExp("#.*");return dj.replace(dk,"")}return dj}function bU(dl,dj){var dm=s(dj),dk;if(dm){return dj}if(dj.slice(0,1)==="/"){return s(dl)+"://"+d(dl)+dj}dl=b1(dl);dk=dl.indexOf("?");if(dk>=0){dl=dl.slice(0,dk)}dk=dl.lastIndexOf("/");if(dk!==dl.length-1){dl=dl.slice(0,dk+1)}return dl+dj}function cF(dl,dj){var dk;dl=String(dl).toLowerCase();dj=String(dj).toLowerCase();if(dl===dj){return true}if(dj.slice(0,1)==="."){if(dl===dj.slice(1)){return true}dk=dl.length-dj.length;if((dk>0)&&(dl.slice(dk)===dj)){return true}}return false}function ck(dj){var dk=document.createElement("a");
43
+ if(dj.indexOf("//")!==0&&dj.indexOf("http")!==0){if(dj.indexOf("*")===0){dj=dj.substr(1)}if(dj.indexOf(".")===0){dj=dj.substr(1)}dj="http://"+dj}dk.href=v.toAbsoluteUrl(dj);if(dk.pathname){return dk.pathname}return""}function a3(dk,dj){if(!aj(dj,"/")){dj="/"+dj}if(!aj(dk,"/")){dk="/"+dk}var dl=(dj==="/"||dj==="/*");if(dl){return true}if(dk===dj){return true}dj=String(dj).toLowerCase();dk=String(dk).toLowerCase();if(R(dj,"*")){dj=dj.slice(0,-1);dl=(!dj||dj==="/");if(dl){return true}if(dk===dj){return true}return dk.indexOf(dj)===0}if(!R(dk,"/")){dk+="/"}if(!R(dj,"/")){dj+="/"}return dk.indexOf(dj)===0}function ar(dn,dq){var dk,dj,dl,dm,dp;for(dk=0;dk<ax.length;dk++){dm=L(ax[dk]);dp=ck(ax[dk]);if(cF(dn,dm)&&a3(dq,dp)){return true}}return false}function aV(dm){var dk,dj,dl;for(dk=0;dk<ax.length;dk++){dj=L(ax[dk].toLowerCase());if(dm===dj){return true}if(dj.slice(0,1)==="."){if(dm===dj.slice(1)){return true}dl=dm.length-dj.length;if((dl>0)&&(dm.slice(dl)===dj)){return true}}}return false}function cp(dj,dl){dj=dj.replace("send_image=0","send_image=1");
44
+ var dk=new Image(1,1);dk.onload=function(){E=0;if(typeof dl==="function"){dl({request:dj,trackerUrl:aD,success:true})}};dk.onerror=function(){if(typeof dl==="function"){dl({request:dj,trackerUrl:aD,success:false})}};dk.src=aD+(aD.indexOf("?")<0?"?":"&")+dj}function cC(dj){if(da==="POST"){return true}return dj&&(dj.length>2000||dj.indexOf('{"requests"')===0)}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dn,dr,dq){var dl=aJ();if(!dl){return false}var dm={type:"application/x-www-form-urlencoded; charset=UTF-8"};var ds=false;var dk=aD;try{var dj=new Blob([dn],dm);if(dq&&!cC(dn)){dj=new Blob([],dm);dk=dk+(dk.indexOf("?")<0?"?":"&")+dn}ds=h.sendBeacon(dk,dj)}catch(dp){return false}if(ds&&typeof dr==="function"){dr({request:dn,trackerUrl:aD,success:true,isSendBeacon:true})}return ds}function c4(dk,dl,dj){if(!J(dj)||null===dj){dj=true}if(m&&a6(dk,dl,dj)){return}setTimeout(function(){if(m&&a6(dk,dl,dj)){return}var dp;try{var dn=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;
45
+ dn.open("POST",aD,true);dn.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dq=m&&a6(dk,dl,dj);if(!dq&&dj){cp(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dl==="function")){dl({request:dk,trackerUrl:aD,success:true,xhr:this})}}};dn.setRequestHeader("Content-Type",cw);dn.withCredentials=true;dn.send(dk)}catch(dm){dp=m&&a6(dk,dl,dj);if(!dp&&dj){cp(dk,dl)}else{if(typeof dl==="function"){dl({request:dk,trackerUrl:aD,success:false})}}}},50)}function cf(dk){var dj=new Date();var dl=dj.getTime()+dk;if(!r||dl>r){r=dl}}function cn(dj){if(cb||!a5||!bA){return}cb=setTimeout(function dk(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dl=new Date(),dm=a5-(dl.getTime()-cY);dm=Math.min(a5,dm);cn(dm)},dj||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cR=new Date().getTime()}function dd(){var dj=new Date().getTime();
46
+ return !cR||(dj-cR)>a5}function ay(){if(dd()){bQ()}bJ()}function dg(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dd()){bQ()}}})}function cB(dn){var dk=new Date();var dj=dk.getTime();cY=dj;if(cA&&dj<cA){var dl=cA-dj;setTimeout(dn,dl);cf(dl+50);cA+=50;return}if(cA===false){var dm=800;cA=dj+dm}dn()}function aO(){if(aC(cL)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dk,dj,dl){aO();if(!bA){cJ.push(dk);return}if(!cP&&dk){if(cz&&bA){dk+="&consent=1"}cB(function(){if(cW&&a6(dk,dl,true)){cf(100);return}if(cC(dk)){c4(dk,dl)}else{cp(dk,dl)}cf(dj)})}if(!aN){dg()}}function cj(dj){if(cP){return false}return(dj&&dj.length)}function c3(dj,dn){if(!dn||dn>=dj.length){return[dj]}var dk=0;var dl=dj.length;var dm=[];for(dk;dk<dl;dk+=dn){dm.push(dj.slice(dk,dk+dn))}return dm}function df(dk,dj){if(!cj(dk)){return}if(!bA){cJ.push(dk);return}cB(function(){var dn=c3(dk,50);var dl=0,dm;for(dl;dl<dn.length;dl++){dm='{"requests":["?'+dn[dl].join('","?')+'"]}';
47
+ if(cW&&a6(dm,null,false)){cf(100)}else{c4(dm,null,false)}}cf(dj)})}function aT(dj){return bj+dj+"."+b5+"."+bn}function bX(dl,dk,dj){de(dl,"",-86400,dk,dj)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var dj=bj+"testcookie";de(dj,"1",undefined,bo,cX,bR);var dk=aC(dj)==="1"?"1":"0";bX(dj);return dk}function bh(){bn=b6((cX||cU)+(bo||"/")).slice(0,4)}function cG(){if(J(c8.res)){return c8}var dk,dm,dn={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dk in dn){if(Object.prototype.hasOwnProperty.call(dn,dk)){dm=h.mimeTypes[dn[dk]];c8[dk]=(dm&&dm.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c8.java="1"
48
+ }if(A(T.GearsFactory)){c8.gears="1"}c8.cookie=b4()}var dl=parseInt(X.width,10);var dj=parseInt(X.height,10);c8.res=parseInt(dl,10)+"x"+parseInt(dj,10);return c8}function bW(){var dk=aT("cvar"),dj=aC(dk);if(dj.length){dj=JSON_PIWIK.parse(dj);if(W(dj)){return dj}}return{}}function cD(){if(aQ===false){aQ=bW()}}function cQ(){var dj=cG();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(dj)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var dj=cG();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(dj)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dk=bf();var dl=az();var dj=String(dk)+dl;return dj}function c2(dl){dl=String(dl);var dp=az();var dm=dp.length;var dn=dl.substr(-1*dm,dm);var dk=parseInt(dl.substr(0,dl.length-dm),10);if(dk&&dn&&dn===dp){var dj=bf();if(aZ<=0){return true}if(dj>=dk&&dj<=(dk+aZ)){return true}}return false}function dh(dj){if(!cM){return""}var dn=f(dj,av);if(!dn){return""}dn=String(dn);
49
+ var dl=new RegExp("^[a-zA-Z0-9]+$");if(dn.length===32&&dl.test(dn)){var dk=dn.substr(16,32);if(c2(dk)){var dm=dn.substr(0,16);return dm}}return""}function cN(){if(!bN){bN=dh(bM)}var dl=new Date(),dj=Math.round(dl.getTime()/1000),dk=aT("id"),dp=aC(dk),dn,dm;if(dp){dn=dp.split(".");dn.unshift("0");if(bN.length){dn[1]=bN}return dn}if(bN.length){dm=bN}else{if("0"===b4()){dm=""}else{dm=cQ()}}dn=["1",dm,dj,0,dj,"",""];return dn}function aY(){var dr=cN(),dm=dr[0],dn=dr[1],dk=dr[2],dj=dr[3],dp=dr[4],dl=dr[5];if(!J(dr[6])){dr[6]=""}var dq=dr[6];return{newVisitor:dm,uuid:dn,createTs:dk,visitCount:dj,currentVisitTs:dp,lastVisitTs:dl,lastEcommerceOrderTs:dq}}function aG(){var dm=new Date(),dk=dm.getTime(),dn=aY().createTs;var dj=parseInt(dn,10);var dl=(dj*1000)+cI-dk;return dl}function aL(dj){if(!b5){return}var dl=new Date(),dk=Math.round(dl.getTime()/1000);if(!J(dj)){dj=aY()}var dm=dj.uuid+"."+dj.createTs+"."+dj.visitCount+"."+dk+"."+dj.lastVisitTs+"."+dj.lastEcommerceOrderTs;de(aT("id"),dm,aG(),bo,cX,bR)
50
+ }function bL(){var dj=aC(aT("ref"));if(dj.length){try{dj=JSON_PIWIK.parse(dj);if(W(dj)){return dj}}catch(dk){}}return["","",0,""]}function bv(dk){var dj="testvalue";de("test",dj,10000,null,dk);if(aC("test")===dj){bX("test",null,dk);return true}return false}function aE(){var dk=bk;bk=false;var dj,dl;for(dj=0;dj<bt.length;dj++){dl=aT(bt[dj]);if(dl!==cL&&dl!==bd&&0!==aC(dl)){bX(dl,bo,cX)}}bk=dk}function b2(dj){b5=dj;aL()}function di(dn){if(!dn||!W(dn)){return}var dm=[];var dl;for(dl in dn){if(Object.prototype.hasOwnProperty.call(dn,dl)){dm.push(dl)}}var dp={};dm.sort();var dj=dm.length;var dk;for(dk=0;dk<dj;dk++){dp[dm[dk]]=dn[dm[dk]]}return dp}function cc(){de(aT("ses"),"1",co,bo,cX,bR)}function bg(){var dm="";var dk="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dl=dk.length;var dj;for(dj=0;dj<6;dj++){dm+=dk.charAt(Math.floor(Math.random()*dl))}return dm}function cs(dl,dH,dI,dm){var dG,dk=new Date(),du=Math.round(dk.getTime()/1000),dr,dF,dn=1024,dO,dv,dD=aQ,dp=aT("ses"),dB=aT("ref"),dy=aT("cvar"),dz=aC(dp),dE=bL(),dK=a4||bM,ds,dj;
51
+ if(bk){aE()}if(cP){return""}var dA=aY();if(!J(dm)){dm=""}var dx=G.characterSet||G.charset;if(!dx||dx.toLowerCase()==="utf-8"){dx=null}ds=dE[0];dj=dE[1];dr=dE[2];dF=dE[3];if(!dz){var dJ=co/1000;if(!dA.lastVisitTs||(du-dA.lastVisitTs)>dJ){dA.visitCount++;dA.lastVisitTs=dA.currentVisitTs}if(!bu||!ds.length){for(dG in cq){if(Object.prototype.hasOwnProperty.call(cq,dG)){ds=f(dK,cq[dG]);if(ds.length){break}}}for(dG in bF){if(Object.prototype.hasOwnProperty.call(bF,dG)){dj=f(dK,bF[dG]);if(dj.length){break}}}}dO=d(bm);dv=dF.length?d(dF):"";if(dO.length&&!aV(dO)&&(!bu||!dv.length||aV(dv))){dF=bm}if(dF.length||ds.length){dr=du;dE=[ds,dj,dr,b1(dF.slice(0,dn))];de(dB,JSON_PIWIK.stringify(dE),c5,bo,cX)}}dl+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dk.getHours()+"&m="+dk.getMinutes()+"&s="+dk.getSeconds()+"&url="+t(b1(dK))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dA.uuid+"&_idts="+dA.createTs+"&_idvc="+dA.visitCount+"&_idn="+dA.newVisitor+(ds.length?"&_rcn="+t(ds):"")+(dj.length?"&_rck="+t(dj):"")+"&_refts="+dr+"&_viewts="+dA.lastVisitTs+(String(dA.lastEcommerceOrderTs).length?"&_ects="+dA.lastEcommerceOrderTs:"")+(String(dF).length?"&_ref="+t(b1(dF.slice(0,dn))):"")+(dx?"&cs="+t(dx):"")+"&send_image=0";
52
+ var dN=cG();for(dG in dN){if(Object.prototype.hasOwnProperty.call(dN,dG)){dl+="&"+dG+"="+dN[dG]}}var dM=[];if(dH){for(dG in dH){if(Object.prototype.hasOwnProperty.call(dH,dG)&&/^dimension\d+$/.test(dG)){var dq=dG.replace("dimension","");dM.push(parseInt(dq,10));dM.push(String(dq));dl+="&"+dG+"="+t(dH[dG]);delete dH[dG]}}}if(dH&&B(dH)){dH=null}for(dG in bl){if(Object.prototype.hasOwnProperty.call(bl,dG)){var dw=(-1===M(dM,dG));if(dw){dl+="&dimension"+dG+"="+t(bl[dG])}}}if(dH){dl+="&data="+t(JSON_PIWIK.stringify(dH))}else{if(ao){dl+="&data="+t(JSON_PIWIK.stringify(ao))}}function dt(dP,dQ){var dR=JSON_PIWIK.stringify(dP);if(dR.length>2){return"&"+dQ+"="+t(dR)}return""}var dL=di(bV);var dC=di(cl);dl+=dt(dL,"cvar");dl+=dt(dC,"e_cvar");if(aQ){dl+=dt(aQ,"_cvar");for(dG in dD){if(Object.prototype.hasOwnProperty.call(dD,dG)){if(aQ[dG][0]===""||aQ[dG][1]===""){delete aQ[dG]}}}if(bP){de(dy,JSON_PIWIK.stringify(aQ),co,bo,cX)}}if(a2){if(cm){dl+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dl+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
53
+ }}}if(aK){dl+="&pv_id="+aK}dA.lastEcommerceOrderTs=J(dm)&&String(dm).length?dm:dA.lastEcommerceOrderTs;aL(dA);cc();dl+=ac(dI,{tracker:bH,request:dl});if(cZ.length){dl+="&"+cZ}if(A(ca)){dl=ca(dl)}return dl}bQ=function a7(){var dj=new Date();dj=dj.getTime();if(!cY){return false}if((cY+(1000*c7))<=dj){return false}if(cY+a5<=dj){bH.ping();return true}return false};function bp(dm,dl,ds,dn,dj,dv){var dq="idgoal=0",dr,dk=new Date(),dt=[],du,dp=String(dm).length;if(dp){dq+="&ec_id="+t(dm);dr=Math.round(dk.getTime()/1000)}dq+="&revenue="+dl;if(String(ds).length){dq+="&ec_st="+ds}if(String(dn).length){dq+="&ec_tx="+dn}if(String(dj).length){dq+="&ec_sh="+dj}if(String(dv).length){dq+="&ec_dt="+dv}if(c0){for(du in c0){if(Object.prototype.hasOwnProperty.call(c0,du)){if(!J(c0[du][1])){c0[du][1]=""}if(!J(c0[du][2])){c0[du][2]=""}if(!J(c0[du][3])||String(c0[du][3]).length===0){c0[du][3]=0}if(!J(c0[du][4])||String(c0[du][4]).length===0){c0[du][4]=1}dt.push(c0[du])}}dq+="&ec_items="+t(JSON_PIWIK.stringify(dt))
54
+ }dq=cs(dq,ao,"ecommerce",dr);bE(dq,bI);if(dp){c0={}}}function bY(dj,dn,dm,dl,dk,dp){if(String(dj).length&&J(dn)){bp(dj,dn,dm,dl,dk,dp)}}function br(dj){if(J(dj)){bp("",dj,"","","","")}}function bZ(dk,dm,dl){aK=bg();var dj=cs("action_name="+t(al(dk||bi)),dm,"log");bE(dj,bI,dl)}function a0(dl,dk){var dm,dj="(^| )(piwik[_-]"+dk;if(dl){for(dm=0;dm<dl.length;dm++){dj+="|"+dl[dm]}}dj+=")( |$)";return new RegExp(dj)}function aU(dj){return(aD&&dj&&0===String(dj).indexOf(aD))}function cu(dn,dj,dp,dk){if(aU(dj)){return 0}var dm=a0(bK,"download"),dl=a0(a8,"link"),dq=new RegExp("\\.("+c6.join("|")+")([?&#]|$)","i");if(dl.test(dn)){return"link"}if(dk||dm.test(dn)||dq.test(dj)){return"download"}if(dp){return 0}return"link"}function au(dk){var dj;dj=dk.parentNode;while(dj!==null&&J(dj)){if(ae.isLinkElement(dk)){break}dk=dj;dj=dk.parentNode}return dk}function dc(dp){dp=au(dp);if(!ae.hasNodeAttribute(dp,"href")){return}if(!J(dp.href)){return}var dn=ae.getAttributeValueFromNode(dp,"href");if(aU(dn)){return
55
+ }var dk=dp.pathname||ck(dp.href);var dq=dp.hostname||d(dp.href);var dr=dq.toLowerCase();var dl=dp.href.replace(dq,dr);var dm=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dm.test(dl)){var dj=cu(dp.className,dl,ar(dr,dk),ae.hasNodeAttribute(dp,"download"));if(dj){return{type:dj,href:dl}}}}function aP(dj,dk,dl,dm){var dn=v.buildInteractionRequestParams(dj,dk,dl,dm);if(!dn){return}return cs(dn,null,"contentInteraction")}function cK(dl,dm,dr,dj,dk){if(!J(dl)){return}if(aU(dl)){return dl}var dp=v.toAbsoluteUrl(dl);var dn="redirecturl="+t(dp)+"&";dn+=aP(dm,dr,dj,(dk||dl));var dq="&";if(aD.indexOf("?")<0){dq="?"}return aD+dq+dn}function bb(dj,dk){if(!dj||!dk){return false}var dl=v.findTargetNode(dj);if(v.shouldIgnoreInteraction(dl)){return false}dl=v.findTargetNodeNoDefault(dj);if(dl&&!V(dl,dk)){return false}return true}function ct(dl,dk,dn){if(!dl){return}var dj=v.findParentContentNode(dl);if(!dj){return}if(!bb(dj,dl)){return}var dm=v.buildContentBlock(dj);
56
+ if(!dm){return}if(!dm.target&&dn){dm.target=dn}return v.buildInteractionRequestParams(dk,dm.name,dm.piece,dm.target)}function aW(dk){if(!b9||!b9.length){return false}var dj,dl;for(dj=0;dj<b9.length;dj++){dl=b9[dj];if(dl&&dl.name===dk.name&&dl.piece===dk.piece&&dl.target===dk.target){return true}}return false}function bD(dm){if(!dm){return false}var dq=v.findTargetNode(dm);if(!dq||v.shouldIgnoreInteraction(dq)){return false}var dr=dc(dq);if(c9&&dr&&dr.type){return false}if(ae.isLinkElement(dq)&&ae.hasNodeAttributeWithValue(dq,"href")){var dj=String(ae.getAttributeValueFromNode(dq,"href"));if(0===dj.indexOf("#")){return false}if(aU(dj)){return true}if(!v.isUrlToCurrentDomain(dj)){return false}var dn=v.buildContentBlock(dm);if(!dn){return}var dl=dn.name;var ds=dn.piece;var dp=dn.target;if(!ae.hasNodeAttributeWithValue(dq,v.CONTENT_TARGET_ATTR)||dq.wasContentTargetAttrReplaced){dq.wasContentTargetAttrReplaced=true;dp=v.toAbsoluteUrl(dj);ae.setAnyAttribute(dq,v.CONTENT_TARGET_ATTR,dp)}var dk=cK(dj,"click",dl,ds,dp);
57
+ v.setHrefAttribute(dq,dk);return true}return false}function aM(dk){if(!dk||!dk.length){return}var dj;for(dj=0;dj<dk.length;dj++){bD(dk[dj])}}function aX(dj){return function(dk){if(!dj){return}var dn=v.findParentContentNode(dj);var dp;if(dk){dp=dk.target||dk.srcElement}if(!dp){dp=dj}if(!bb(dn,dp)){return}cf(bI);if(ae.isLinkElement(dj)&&ae.hasNodeAttributeWithValue(dj,"href")&&ae.hasNodeAttributeWithValue(dj,v.CONTENT_TARGET_ATTR)){var dl=ae.getAttributeValueFromNode(dj,"href");if(!aU(dl)&&dj.wasContentTargetAttrReplaced){ae.setAnyAttribute(dj,v.CONTENT_TARGET_ATTR,"")}}var dt=dc(dj);if(ap&&dt&&dt.type){return dt.type}if(bD(dn)){return"href"}var dq=v.buildContentBlock(dn);if(!dq){return}var dm=dq.name;var du=dq.piece;var ds=dq.target;var dr=aP("click",dm,du,ds);if(dr){bE(dr,bI)}return dr}}function b0(dl){if(!dl||!dl.length){return}var dj,dk;for(dj=0;dj<dl.length;dj++){dk=v.findTargetNode(dl[dj]);if(dk&&!dk.contentInteractionTrackingSetupDone){dk.contentInteractionTrackingSetupDone=true;an(dk,"click",aX(dk))
58
+ }}}function bw(dl,dm){if(!dl||!dl.length){return[]}var dj,dk;for(dj=0;dj<dl.length;dj++){if(aW(dl[dj])){dl.splice(dj,1);dj--}else{b9.push(dl[dj])}}if(!dl||!dl.length){return[]}aM(dm);b0(dm);var dn=[];for(dj=0;dj<dl.length;dj++){dk=cs(v.buildImpressionRequestParams(dl[dj].name,dl[dj].piece,dl[dj].target),undefined,"contentImpressions");if(dk){dn.push(dk)}}return dn}function cy(dk){var dj=v.collectContent(dk);return bw(dj,dk)}function a9(dk){if(!dk||!dk.length){return[]}var dj;for(dj=0;dj<dk.length;dj++){if(!v.isNodeVisible(dk[dj])){dk.splice(dj,1);dj--}}if(!dk||!dk.length){return[]}return cy(dk)}function aF(dl,dj,dk){var dm=v.buildImpressionRequestParams(dl,dj,dk);return cs(dm,null,"contentImpression")}function db(dm,dk){if(!dm){return}var dj=v.findParentContentNode(dm);var dl=v.buildContentBlock(dj);if(!dl){return}if(!dk){dk="Unknown"}return aP(dk,dl.name,dl.piece,dl.target)}function cO(dk,dm,dj,dl){return"e_c="+t(dk)+"&e_a="+t(dm)+(J(dj)?"&e_n="+t(dj):"")+(J(dl)?"&e_v="+t(dl):"")}function at(dl,dn,dj,dm,dq,dp){if(a(String(dl)).length===0||a(String(dn)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
59
+ return false}var dk=cs(cO(dl,dn,dj,dm),dq,"event");bE(dk,bI,dp)}function b7(dj,dm,dk,dn){var dl=cs("search="+t(dj)+(dm?"&search_cat="+t(dm):"")+(J(dk)?"&search_count="+dk:""),dn,"sitesearch");bE(dl,bI)}function cT(dj,dn,dm,dl){var dk=cs("idgoal="+dj+(dn?"&revenue="+dn:""),dm,"goal");bE(dk,bI,dl)}function c1(dm,dj,dr,dq,dl){var dp=dj+"="+t(b1(dm));var dk=ct(dl,"click",dm);if(dk){dp+="&"+dk}var dn=cs(dp,dr,"link");bE(dn,bI,dq)}function bT(dk,dj){if(dk!==""){return dk+dj.charAt(0).toUpperCase()+dj.slice(1)}return dj}function cg(dp){var dn,dj,dm=["","webkit","ms","moz"],dl;if(!be){for(dj=0;dj<dm.length;dj++){dl=dm[dj];if(Object.prototype.hasOwnProperty.call(G,bT(dl,"hidden"))){if(G[bT(dl,"visibilityState")]==="prerender"){dn=true}break}}}if(dn){an(G,dl+"visibilitychange",function dk(){G.removeEventListener(dl+"visibilitychange",dk,false);dp()});return}dp()}function bq(){var dk=aY().uuid;var dj=aI();return dk+dj}function ci(dj){if(!dj){return}if(!ae.hasNodeAttribute(dj,"href")){return}var dk=ae.getAttributeValueFromNode(dj,"href");
60
+ if(!dk||aU(dk)){return}dk=k(dk,av);var dl=bq();dk=F(dk,av,dl);ae.setAnyAttribute(dj,"href",dk)}function aA(dm){var dn=ae.getAttributeValueFromNode(dm,"href");if(!dn){return false}dn=String(dn);var dk=dn.indexOf("//")===0||dn.indexOf("http://")===0||dn.indexOf("https://")===0;if(!dk){return false}var dj=dm.pathname||ck(dm.href);var dl=(dm.hostname||d(dm.href)).toLowerCase();if(ar(dl,dj)){if(!cF(cU,L(dl))){return true}return false}return false}function cE(dj){var dk=dc(dj);if(dk&&dk.type){dk.href=p(dk.href);c1(dk.href,dk.type,undefined,null,dj);return}if(cM){dj=au(dj);if(aA(dj)){ci(dj)}}}function cv(){return G.all&&!G.addEventListener}function cV(dj){var dl=dj.which;var dk=(typeof dj.button);if(!dl&&dk!=="undefined"){if(cv()){if(dj.button&1){dl=1}else{if(dj.button&2){dl=3}else{if(dj.button&4){dl=2}}}}else{if(dj.button===0||dj.button==="0"){dl=1}else{if(dj.button&1){dl=2}else{if(dj.button&2){dl=3}}}}}return dl}function bS(dj){switch(cV(dj)){case 1:return"left";case 2:return"middle";case 3:return"right"
61
+ }}function a1(dj){return dj.target||dj.srcElement}function aB(dj){return function(dm){dm=dm||T.event;var dl=bS(dm);var dn=a1(dm);if(dm.type==="click"){var dk=false;if(dj&&dl==="middle"){dk=true}if(dn&&!dk){cE(dn)}}else{if(dm.type==="mousedown"){if(dl==="middle"&&dn){aR=dl;bz=dn}else{aR=bz=null}}else{if(dm.type==="mouseup"){if(dl===aR&&dn===bz){cE(dn)}aR=bz=null}else{if(dm.type==="contextmenu"){cE(dn)}}}}}}function aq(dl,dk){var dj=typeof dk;if(dj==="undefined"){dk=true}an(dl,"click",aB(dk),false);if(dk){an(dl,"mouseup",aB(dk),false);an(dl,"mousedown",aB(dk),false);an(dl,"contextmenu",aB(dk),false)}}function bC(dl,dn){ap=true;var dm,dk=a0(by,"ignore"),dp=G.links,dj=null,dq=null;if(dp){for(dm=0;dm<dp.length;dm++){dj=dp[dm];if(!dk.test(dj.className)){dq=typeof dj.piwikTrackers;if("undefined"===dq){dj.piwikTrackers=[]}if(-1===M(dj.piwikTrackers,dn)){dj.piwikTrackers.push(dn);aq(dj,dl)}}}}}function aS(dk,dn,dp){if(ce){return true}ce=true;var dq=false;var dm,dl;function dj(){dq=true}n(function(){function dr(dt){setTimeout(function(){if(!ce){return
62
+ }dq=false;dp.trackVisibleContentImpressions();dr(dt)},dt)}function ds(dt){setTimeout(function(){if(!ce){return}if(dq){dq=false;dp.trackVisibleContentImpressions()}ds(dt)},dt)}if(dk){dm=["scroll","resize"];for(dl=0;dl<dm.length;dl++){if(G.addEventListener){G.addEventListener(dm[dl],dj,false)}else{T.attachEvent("on"+dm[dl],dj)}}ds(100)}if(dn&&dn>0){dn=parseInt(dn,10);dr(dn)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var dj=this.requests;this.requests=[];if(dj.length===1){bE(dj[0],bI)}else{df(dj,bI)}},push:function(dj){if(!dj){return}if(m||!this.enabled){bE(dj,bI);return}bB.requests.push(dj);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dk="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dk)){b[dk]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
63
+ };this.getVisitorInfo=function(){return cN()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(dj){aD=dj};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(dj,dl){if(!J(dj)||null===dj){dj=this.getTrackerUrl()}var dk=new Q(dj,dl);I.push(dk);e.trigger("TrackerAdded",[this]);return dk};this.getSiteId=function(){return b5};this.setSiteId=function(dj){b2(dj)};this.resetUserId=function(){bx=""};this.setUserId=function(dj){if(Y(dj)){bx=dj}};this.getUserId=function(){return bx};this.setCustomData=function(dj,dk){if(W(dj)){ao=dj}else{if(!ao){ao={}}ao[dj]=dk}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(dj){ca=dj};this.appendToTrackingUrl=function(dj){cZ=dj
64
+ };this.getRequest=function(dj){return cs(dj)};this.addPlugin=function(dj,dk){b[dj]=dk};this.setCustomDimension=function(dj,dk){dj=parseInt(dj,10);if(dj>0){if(!J(dk)){dk=""}if(!w(dk)){dk=String(dk)}bl[dj]=dk}};this.getCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0&&Object.prototype.hasOwnProperty.call(bl,dj)){return bl[dj]}};this.deleteCustomDimension=function(dj){dj=parseInt(dj,10);if(dj>0){delete bl[dj]}};this.setCustomVariable=function(dk,dj,dn,dl){var dm;if(!J(dl)){dl="visit"}if(!J(dj)){return}if(!J(dn)){dn=""}if(dk>0){dj=!w(dj)?String(dj):dj;dn=!w(dn)?String(dn):dn;dm=[dj.slice(0,bs),dn.slice(0,bs)];if(dl==="visit"||dl===2){cD();aQ[dk]=dm}else{if(dl==="page"||dl===3){bV[dk]=dm}else{if(dl==="event"){cl[dk]=dm}}}}};this.getCustomVariable=function(dk,dl){var dj;if(!J(dl)){dl="visit"}if(dl==="page"||dl===3){dj=bV[dk]}else{if(dl==="event"){dj=cl[dk]}else{if(dl==="visit"||dl===2){cD();dj=aQ[dk]}}}if(!J(dj)||(dj&&dj[0]==="")){return false}return dj};this.deleteCustomVariable=function(dj,dk){if(this.getCustomVariable(dj,dk)){this.setCustomVariable(dj,"","",dk)
65
+ }};this.deleteCustomVariables=function(dj){if(dj==="page"||dj===3){bV={}}else{if(dj==="event"){cl={}}else{if(dj==="visit"||dj===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(dj){bI=dj};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(dj){if(w(dj)){dj=dj.split("|")}c6=dj};this.addDownloadExtensions=function(dk){var dj;if(w(dk)){dk=dk.split("|")}for(dj=0;dj<dk.length;dj++){c6.push(dk[dj])}};this.removeDownloadExtensions=function(dl){var dk,dj=[];if(w(dl)){dl=dl.split("|")}for(dk=0;dk<c6.length;dk++){if(M(dl,c6[dk])===-1){dj.push(c6[dk])}}c6=dj};this.setDomains=function(dj){ax=w(dj)?[dj]:dj;var dn=false,dl=0,dk;for(dl;dl<ax.length;dl++){dk=String(ax[dl]);if(cF(cU,L(dk))){dn=true;break}var dm=ck(dk);if(dm&&dm!=="/"&&dm!=="/*"){dn=true;break}}if(!dn){ax.push(cU)}};this.enableCrossDomainLinking=function(){cM=true};this.disableCrossDomainLinking=function(){cM=false};this.isCrossDomainLinkingEnabled=function(){return cM
66
+ };this.setCrossDomainLinkingTimeout=function(dj){aZ=dj};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(dj){by=w(dj)?[dj]:dj};this.setRequestMethod=function(dj){da=dj||ch};this.setRequestContentType=function(dj){cw=dj||aH};this.setReferrerUrl=function(dj){bm=dj};this.setCustomUrl=function(dj){a4=bU(bM,dj)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(dj){bi=dj};this.setAPIUrl=function(dj){bG=dj};this.setDownloadClasses=function(dj){bK=w(dj)?[dj]:dj};this.setLinkClasses=function(dj){a8=w(dj)?[dj]:dj};this.setCampaignNameKey=function(dj){cq=w(dj)?[dj]:dj};this.setCampaignKeywordKey=function(dj){bF=w(dj)?[dj]:dj};this.discardHashTag=function(dj){bO=dj};this.setCookieNamePrefix=function(dj){bj=dj;aQ=bW()};this.setCookieDomain=function(dj){var dk=L(dj);if(bv(dk)){cX=dk;bh()}};this.getCookieDomain=function(){return cX};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dl,dk,dj){if(!dl){throw new Error("Missing cookie name")
67
+ }if(!J(dj)){dj=co}bt.push(dl);de(aT(dl),dk,dj,bo,cX)};this.getCookie=function(dk){var dj=aC(aT(dk));if(dj===0){return null}return dj};this.setCookiePath=function(dj){bo=dj;bh()};this.getCookiePath=function(dj){return bo};this.setVisitorCookieTimeout=function(dj){cI=dj*1000};this.setSessionCookieTimeout=function(dj){co=dj*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(dj){c5=dj*1000};this.setConversionAttributionFirstReferrer=function(dj){bu=dj};this.setSecureCookie=function(dj){bR=dj};this.disableCookies=function(){bk=true;c8.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dk){var dj=h.doNotTrack||h.msDoNotTrack;cP=dk&&(dj==="yes"||dj==="1");if(cP){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cW=true};this.addListener=function(dk,dj){aq(dk,dj)};this.enableLinkTracking=function(dk){c9=true;var dj=this;cg(function(){q(function(){bC(dk,dj)})})};this.enableJSErrorTracking=function(){if(cS){return
68
+ }cS=true;var dj=T.onerror;T.onerror=function(dp,dm,dl,dn,dk){cg(function(){var dq="JavaScript Errors";var dr=dm+":"+dl;if(dn){dr+=":"+dn}at(dq,dr,dp)});if(dj){return dj(dp,dm,dl,dn,dk)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(dj){cm=parseInt(dj,10)};this.setVisitStandardLength=function(dj){dj=Math.max(dj,5);c7=dj};this.enableHeartBeatTimer=function(dj){dj=Math.max(dj,5);a5=(dj||15)*1000;if(cY!==null){dg()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(dj){if(T.location.protocol==="file:"){T.location=dj}};this.setCountPreRendered=function(dj){be=dj};this.trackGoal=function(dj,dm,dl,dk){cg(function(){cT(dj,dm,dl,dk)})};this.trackLink=function(dk,dj,dm,dl){cg(function(){c1(dk,dj,dm,dl)
69
+ })};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(dj,dl,dk){b9=[];cJ=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(dj,dl,dk)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var dj=v.findContentNodes();var dk=cy(dj);df(dk,bI)})})};this.trackVisibleContentImpressions=function(dj,dk){if(N(b5)){return}if(!J(dj)){dj=true}if(!J(dk)){dk=750}aS(dj,dk,this);cg(function(){n(function(){var dl=v.findContentNodes();var dm=a9(dl);df(dm,bI)})})};this.trackContentImpression=function(dl,dj,dk){if(N(b5)){return}dl=a(dl);dj=a(dj);dk=a(dk);if(!dl){return}dj=dj||"Unknown";cg(function(){var dm=aF(dl,dj,dk);bE(dm,bI)})};this.trackContentImpressionsWithinNode=function(dj){if(N(b5)||!dj){return}cg(function(){if(ce){n(function(){var dk=v.findContentNodesWithinNode(dj);var dl=a9(dk);df(dl,bI)})}else{q(function(){var dk=v.findContentNodesWithinNode(dj);var dl=cy(dk);df(dl,bI)})}})};this.trackContentInteraction=function(dl,dm,dj,dk){if(N(b5)){return
70
+ }dl=a(dl);dm=a(dm);dj=a(dj);dk=a(dk);if(!dl||!dm){return}dj=dj||"Unknown";cg(function(){var dn=aP(dl,dm,dj,dk);if(dn){bE(dn,bI)}})};this.trackContentInteractionNode=function(dk,dj){if(N(b5)||!dk){return}cg(function(){var dl=db(dk,dj);if(dl){bE(dl,bI)}})};this.logAllContentBlocksOnPage=function(){var dl=v.findContentNodes();var dj=v.collectContent(dl);var dk=typeof console;if(dk!=="undefined"&&console&&console.log){console.log(dj)}};this.trackEvent=function(dk,dm,dj,dl,dp,dn){cg(function(){at(dk,dm,dj,dl,dp,dn)})};this.trackSiteSearch=function(dj,dl,dk,dm){b9=[];cg(function(){b7(dj,dl,dk,dm)})};this.setEcommerceView=function(dm,dj,dl,dk){if(Y(dl)){dl=String(dl)}if(!J(dl)||dl===null||dl===false||!dl.length){dl=""}else{if(dl instanceof Array){dl=JSON_PIWIK.stringify(dl)}}bV[5]=["_pkc",dl];if(J(dk)&&dk!==null&&dk!==false&&String(dk).length){bV[2]=["_pkp",dk]}if(!Y(dm)&&!Y(dj)){return}if(Y(dm)){bV[3]=["_pks",dm]}if(!Y(dj)){dj=""}bV[4]=["_pkn",dj]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(c0))
71
+ };this.addEcommerceItem=function(dn,dj,dl,dk,dm){if(Y(dn)){c0[dn]=[String(dn),dj,dl,dk,dm]}};this.removeEcommerceItem=function(dj){if(Y(dj)){dj=String(dj);delete c0[dj]}};this.clearEcommerceCart=function(){c0={}};this.trackEcommerceOrder=function(dj,dn,dm,dl,dk,dp){bY(dj,dn,dm,dl,dk,dp)};this.trackEcommerceCartUpdate=function(dj){br(dj)};this.trackRequest=function(dk,dm,dl,dj){cg(function(){var dn=cs(dk,dm,dj);bE(dn,bI,dl)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(dj){if(dj<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=dj};this.queueRequest=function(dj){cg(function(){var dk=cs(dj);bB.push(dk)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var dj=aC(bd);if(aC(cL)){if(dj){bX(bd,bo,cX)}return null}if(!dj||dj===0){return null}return dj};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
72
+ };this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cL,bo,cX);var dk,dj;for(dk=0;dk<cJ.length;dk++){dj=typeof cJ[dk];if(dj==="string"){bE(cJ[dk],bI)}else{if(dj==="object"){df(cJ[dk],bI)}}}cJ=[]};this.rememberConsentGiven=function(dk){if(dk){dk=dk*60*60*1000}else{dk=30*365*24*60*60*1000}this.setConsentGiven();var dj=new Date().getTime();de(bd,dj,dk,bo,cX,bR)};this.forgetConsentGiven=function(){var dj=30*365*24*60*60*1000;bX(bd,bo,cX);de(cL,new Date().getTime(),dj,bo,cX,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
73
  if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
74
  if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
75
  }y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
app/plugins/API/API.php CHANGED
@@ -10,6 +10,7 @@ namespace Piwik\Plugins\API;
10
 
11
  use Piwik\API\Proxy;
12
  use Piwik\API\Request;
 
13
  use Piwik\Cache;
14
  use Piwik\CacheId;
15
  use Piwik\Category\CategoryList;
@@ -29,6 +30,7 @@ use Piwik\Plugin\SettingsProvider;
29
  use Piwik\Plugins\API\DataTable\MergeDataTables;
30
  use Piwik\Plugins\CoreAdminHome\CustomLogo;
31
  use Piwik\Plugins\CorePluginsAdmin\SettingsMetadata;
 
32
  use Piwik\Site;
33
  use Piwik\Translation\Translator;
34
  use Piwik\Measurable\Type\TypeManager;
@@ -580,6 +582,61 @@ class API extends \Piwik\Plugin\API
580
 
581
  // if segment has suggested values callback then return result from it instead
582
  $suggestedValuesCallbackRequiresTable = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
583
  if (isset($segment['suggestedValuesCallback'])) {
584
  $suggestedValuesCallbackRequiresTable = $this->doesSuggestedValuesCallbackNeedData(
585
  $segment['suggestedValuesCallback']);
10
 
11
  use Piwik\API\Proxy;
12
  use Piwik\API\Request;
13
+ use Piwik\ArchiveProcessor\Rules;
14
  use Piwik\Cache;
15
  use Piwik\CacheId;
16
  use Piwik\Category\CategoryList;
30
  use Piwik\Plugins\API\DataTable\MergeDataTables;
31
  use Piwik\Plugins\CoreAdminHome\CustomLogo;
32
  use Piwik\Plugins\CorePluginsAdmin\SettingsMetadata;
33
+ use Piwik\Segment;
34
  use Piwik\Site;
35
  use Piwik\Translation\Translator;
36
  use Piwik\Measurable\Type\TypeManager;
582
 
583
  // if segment has suggested values callback then return result from it instead
584
  $suggestedValuesCallbackRequiresTable = false;
585
+
586
+ if (!empty($segment['suggestedValuesApi']) && is_string($segment['suggestedValuesApi']) && !Rules::isBrowserTriggerEnabled()) {
587
+ $now = Date::now()->setTimezone(Site::getTimezoneFor($idSite));
588
+ if (self::$_autoSuggestLookBack != 60) {
589
+ // in Auto suggest tests we need to assume now is in 2018...
590
+ // we do - 20 to make sure the year is still correct otherwise could end up being 2017-12-31 and the recorded visits are over several days in the tests we make sure to select the last day a visit was recorded
591
+ $now = $now->subDay(self::$_autoSuggestLookBack - 20);
592
+ }
593
+ // we want to avoid launching the archiver should browser archiving be enabled as this can be very slow... we then rather
594
+ // use the live api.
595
+ $period = 'year';
596
+ $date = $now->toString();
597
+ if ($now->toString('m') == '01') {
598
+ if (Rules::isArchivingDisabledFor(array($idSite), new Segment('', array($idSite)), 'range')) {
599
+ $date = $now->subYear(1)->toString(); // use previous year data to avoid using range
600
+ } else {
601
+ $period = 'range';
602
+ $date = $now->subMonth(1)->toString() . ',' . $now->addDay(1)->toString();
603
+ }
604
+ }
605
+
606
+ $apiParts = explode('.', $segment['suggestedValuesApi']);
607
+ $meta = $this->getMetadata($idSite, $apiParts[0], $apiParts[1]);
608
+ $flat = !empty($meta[0]['actionToLoadSubTables']) && $meta[0]['actionToLoadSubTables'] == $apiParts[1];
609
+
610
+ $table = Request::processRequest($segment['suggestedValuesApi'], array(
611
+ 'idSite' => $idSite,
612
+ 'period' => $period,
613
+ 'date' => $date,
614
+ 'segment' => '',
615
+ 'filter_offset' => 0,
616
+ 'flat' => (int) $flat,
617
+ 'filter_limit' => $maxSuggestionsToReturn
618
+ ));
619
+ if ($table && $table instanceof DataTable && $table->getRowsCount()) {
620
+ $values = [];
621
+ foreach ($table->getRowsWithoutSummaryRow() as $row) {
622
+ $segment = $row->getMetadata('segment');
623
+ $remove = array(
624
+ $segmentName . Segment\SegmentExpression::MATCH_EQUAL,
625
+ $segmentName . Segment\SegmentExpression::MATCH_STARTS_WITH
626
+ );
627
+ // we don't look at row columns since this could include rows that won't work eg Other summary rows. etc
628
+ // and it is generally not reliable.
629
+ if (!empty($segment) && preg_match('/^' . implode('|',$remove) . '/', $segment)) {
630
+ $values[] = urldecode(urldecode(str_replace($remove, '', $segment)));
631
+ }
632
+ }
633
+
634
+ $values = array_slice($values, 0, $maxSuggestionsToReturn);
635
+ $values = array_map(array('Piwik\Common', 'unsanitizeInputValue'), $values);
636
+ return $values;
637
+ }
638
+ }
639
+
640
  if (isset($segment['suggestedValuesCallback'])) {
641
  $suggestedValuesCallbackRequiresTable = $this->doesSuggestedValuesCallbackNeedData(
642
  $segment['suggestedValuesCallback']);
app/plugins/API/SegmentMetadata.php CHANGED
@@ -94,6 +94,10 @@ class SegmentMetadata
94
  ) {
95
  unset($segment['suggestedValuesCallback']);
96
  }
 
 
 
 
97
  }
98
  }
99
 
94
  ) {
95
  unset($segment['suggestedValuesCallback']);
96
  }
97
+
98
+ if (isset($segment['suggestedValuesApi'])) {
99
+ unset($segment['suggestedValuesApi']);
100
+ }
101
  }
102
  }
103
 
app/plugins/Actions/Columns/ClickedUrl.php CHANGED
@@ -20,6 +20,7 @@ class ClickedUrl extends ActionDimension
20
  protected $nameSingular = 'Actions_ColumnClickedURL';
21
  protected $namePlural = 'Actions_ColumnClickedURLs';
22
  protected $category = 'General_Actions';
 
23
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
24
  protected $type = self::TYPE_URL;
25
 
20
  protected $nameSingular = 'Actions_ColumnClickedURL';
21
  protected $namePlural = 'Actions_ColumnClickedURLs';
22
  protected $category = 'General_Actions';
23
+ protected $suggestedValuesApi = 'Actions.getOutlinks';
24
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
25
  protected $type = self::TYPE_URL;
26
 
app/plugins/Actions/Columns/DownloadUrl.php CHANGED
@@ -20,6 +20,7 @@ class DownloadUrl extends ActionDimension
20
  protected $namePlural = 'Actions_ColumnDownloadURLs';
21
  protected $columnName = 'idaction_url';
22
  protected $category = 'General_Actions';
 
23
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
24
  protected $type = self::TYPE_URL;
25
 
20
  protected $namePlural = 'Actions_ColumnDownloadURLs';
21
  protected $columnName = 'idaction_url';
22
  protected $category = 'General_Actions';
23
+ protected $suggestedValuesApi = 'Actions.getDownloads';
24
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
25
  protected $type = self::TYPE_URL;
26
 
app/plugins/Actions/Columns/EntryPageTitle.php CHANGED
@@ -21,6 +21,7 @@ class EntryPageTitle extends VisitDimension
21
  protected $columnType = 'INTEGER(10) UNSIGNED NULL';
22
  protected $type = self::TYPE_TEXT;
23
  protected $segmentName = 'entryPageTitle';
 
24
  protected $nameSingular = 'Actions_ColumnEntryPageTitle';
25
  protected $namePlural = 'Actions_WidgetEntryPageTitles';
26
  protected $category = 'General_Actions';
21
  protected $columnType = 'INTEGER(10) UNSIGNED NULL';
22
  protected $type = self::TYPE_TEXT;
23
  protected $segmentName = 'entryPageTitle';
24
+ protected $suggestedValuesApi = 'Actions.getEntryPageTitles';
25
  protected $nameSingular = 'Actions_ColumnEntryPageTitle';
26
  protected $namePlural = 'Actions_WidgetEntryPageTitles';
27
  protected $category = 'General_Actions';
app/plugins/Actions/Columns/EntryPageUrl.php CHANGED
@@ -22,6 +22,7 @@ class EntryPageUrl extends VisitDimension
22
  protected $segmentName = 'entryPageUrl';
23
  protected $nameSingular = 'Actions_ColumnEntryPageURL';
24
  protected $namePlural = 'Actions_ColumnEntryPageURLs';
 
25
  protected $category = 'General_Actions';
26
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
27
  protected $type = self::TYPE_URL;
22
  protected $segmentName = 'entryPageUrl';
23
  protected $nameSingular = 'Actions_ColumnEntryPageURL';
24
  protected $namePlural = 'Actions_ColumnEntryPageURLs';
25
+ protected $suggestedValuesApi = 'Actions.getEntryPageUrls';
26
  protected $category = 'General_Actions';
27
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
28
  protected $type = self::TYPE_URL;
app/plugins/Actions/Columns/ExitPageTitle.php CHANGED
@@ -23,6 +23,7 @@ class ExitPageTitle extends VisitDimension
23
  protected $nameSingular = 'Actions_ColumnExitPageTitle';
24
  protected $namePlural = 'Actions_WidgetExitPageTitles';
25
  protected $category = 'General_Actions';
 
26
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
27
  protected $type = self::TYPE_TEXT;
28
 
23
  protected $nameSingular = 'Actions_ColumnExitPageTitle';
24
  protected $namePlural = 'Actions_WidgetExitPageTitles';
25
  protected $category = 'General_Actions';
26
+ protected $suggestedValuesApi = 'Actions.getExitPageTitles';
27
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
28
  protected $type = self::TYPE_TEXT;
29
 
app/plugins/Actions/Columns/ExitPageUrl.php CHANGED
@@ -27,6 +27,7 @@ class ExitPageUrl extends VisitDimension
27
  protected $nameSingular = 'Actions_ColumnExitPageURL';
28
  protected $namePlural = 'Actions_ColumnExitPageURLs';
29
  protected $category = 'General_Actions';
 
30
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
31
 
32
  public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
27
  protected $nameSingular = 'Actions_ColumnExitPageURL';
28
  protected $namePlural = 'Actions_ColumnExitPageURLs';
29
  protected $category = 'General_Actions';
30
+ protected $suggestedValuesApi = 'Actions.getExitPageUrls';
31
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
32
 
33
  public function configureMetrics(MetricsList $metricsList, DimensionMetricFactory $dimensionMetricFactory)
app/plugins/Actions/Columns/PageTitle.php CHANGED
@@ -22,6 +22,7 @@ class PageTitle extends ActionDimension
22
  protected $nameSingular = 'Goals_PageTitle';
23
  protected $namePlural = 'Actions_WidgetPageTitles';
24
  protected $category = 'General_Actions';
 
25
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
26
 
27
  public function getDbColumnJoin()
22
  protected $nameSingular = 'Goals_PageTitle';
23
  protected $namePlural = 'Actions_WidgetPageTitles';
24
  protected $category = 'General_Actions';
25
+ protected $suggestedValuesApi = 'Actions.getPageTitles';
26
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
27
 
28
  public function getDbColumnJoin()
app/plugins/Actions/Columns/PageUrl.php CHANGED
@@ -25,6 +25,7 @@ class PageUrl extends ActionDimension
25
  protected $acceptValues = 'All these segments must be URL encoded, for example: http%3A%2F%2Fexample.com%2Fpath%2Fpage%3Fquery';
26
  protected $category = 'General_Actions';
27
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
 
28
 
29
  public function getDbColumnJoin()
30
  {
25
  protected $acceptValues = 'All these segments must be URL encoded, for example: http%3A%2F%2Fexample.com%2Fpath%2Fpage%3Fquery';
26
  protected $category = 'General_Actions';
27
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
28
+ protected $suggestedValuesApi = 'Actions.getPageUrls';
29
 
30
  public function getDbColumnJoin()
31
  {
app/plugins/Actions/DataTable/Filter/Actions.php CHANGED
@@ -13,6 +13,7 @@ use Piwik\Config;
13
  use Piwik\DataTable\BaseFilter;
14
  use Piwik\DataTable\Row;
15
  use Piwik\DataTable;
 
16
  use Piwik\Tracker\Action;
17
 
18
  class Actions extends BaseFilter
@@ -54,6 +55,9 @@ class Actions extends BaseFilter
54
  }
55
  }
56
 
 
 
 
57
  foreach ($dataTable->getRows() as $row) {
58
  if (!$row->isSummaryRow()) {
59
  $url = $row->getMetadata('url');
@@ -75,10 +79,19 @@ class Actions extends BaseFilter
75
  if ($row->getIdSubDataTable()) {
76
  $row->setMetadata('segment', 'pageTitle=^' . urlencode(urlencode(trim($label))));
77
  } else {
78
- $row->setMetadata('segmentValue', urlencode(trim($label)));
 
 
 
 
 
79
  }
80
  } else if ($this->actionType == Action::TYPE_PAGE_URL && $urlPrefix) { // folder for older data w/ no folder URL metadata
81
- $row->setMetadata('segment', 'pageUrl=^' . urlencode(urlencode($urlPrefix . '/' . $label)));
 
 
 
 
82
  }
83
  }
84
 
13
  use Piwik\DataTable\BaseFilter;
14
  use Piwik\DataTable\Row;
15
  use Piwik\DataTable;
16
+ use Piwik\Plugins\Actions\ArchivingHelper;
17
  use Piwik\Tracker\Action;
18
 
19
  class Actions extends BaseFilter
55
  }
56
  }
57
 
58
+ $notDefinedUrl = ArchivingHelper::getUnknownActionName(Action::TYPE_PAGE_URL);
59
+ $notDefinedTitle = ArchivingHelper::getUnknownActionName(Action::TYPE_PAGE_TITLE);
60
+
61
  foreach ($dataTable->getRows() as $row) {
62
  if (!$row->isSummaryRow()) {
63
  $url = $row->getMetadata('url');
79
  if ($row->getIdSubDataTable()) {
80
  $row->setMetadata('segment', 'pageTitle=^' . urlencode(urlencode(trim($label))));
81
  } else {
82
+ $notDefinedName = ArchivingHelper::getUnknownActionName(Action::TYPE_PAGE_TITLE);
83
+ if (trim($label) == $notDefinedName) {
84
+ $row->setMetadata('segmentValue', '');
85
+ } else {
86
+ $row->setMetadata('segmentValue', urlencode(trim($label)));
87
+ }
88
  }
89
  } else if ($this->actionType == Action::TYPE_PAGE_URL && $urlPrefix) { // folder for older data w/ no folder URL metadata
90
+ if ($label === $notDefinedUrl) {
91
+ $row->setMetadata('segmentValue', '');
92
+ } else {
93
+ $row->setMetadata('segment', 'pageUrl=^' . urlencode(urlencode($urlPrefix . '/' . $label)));
94
+ }
95
  }
96
  }
97
 
app/plugins/Contents/Columns/ContentName.php CHANGED
@@ -24,6 +24,7 @@ class ContentName extends ActionDimension
24
  protected $nameSingular = 'Contents_ContentName';
25
  protected $namePlural = 'Contents_ContentNames';
26
  protected $acceptValues = 'The name of a content block, for instance "Ad Sale"';
 
27
  protected $type = self::TYPE_TEXT;
28
  protected $category = 'General_Actions';
29
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
24
  protected $nameSingular = 'Contents_ContentName';
25
  protected $namePlural = 'Contents_ContentNames';
26
  protected $acceptValues = 'The name of a content block, for instance "Ad Sale"';
27
+ protected $suggestedValuesApi = 'Contents.getContentNames';
28
  protected $type = self::TYPE_TEXT;
29
  protected $category = 'General_Actions';
30
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
app/plugins/Contents/Columns/ContentPiece.php CHANGED
@@ -23,6 +23,7 @@ class ContentPiece extends ActionDimension
23
  protected $nameSingular = 'Contents_ContentPiece';
24
  protected $namePlural = 'Contents_ContentPieces';
25
  protected $acceptValues = 'The actual content. For instance "ad.jpg" or "My text ad"';
 
26
  protected $type = self::TYPE_TEXT;
27
  protected $category = 'General_Actions';
28
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
23
  protected $nameSingular = 'Contents_ContentPiece';
24
  protected $namePlural = 'Contents_ContentPieces';
25
  protected $acceptValues = 'The actual content. For instance "ad.jpg" or "My text ad"';
26
+ protected $suggestedValuesApi = 'Contents.getContentPieces';
27
  protected $type = self::TYPE_TEXT;
28
  protected $category = 'General_Actions';
29
  protected $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
app/plugins/CoreAdminHome/Tasks.php CHANGED
@@ -195,6 +195,7 @@ class Tasks extends \Piwik\Plugin\Tasks
195
  */
196
  public function notifyTrackingFailures()
197
  {
 
198
  $failures = $this->trackingFailures->getAllFailures();
199
  $general = Config::getInstance()->General;
200
  if (!empty($failures) && $general['enable_tracking_failures_notification']) {
@@ -251,11 +252,30 @@ class Tasks extends \Piwik\Plugin\Tasks
251
 
252
  public function purgeInvalidatedArchives()
253
  {
 
 
254
  $archivesToPurge = new ArchivesToPurgeDistributedList();
255
  foreach ($archivesToPurge->getAllAsDates() as $date) {
256
  $this->archivePurger->purgeInvalidatedArchivesFrom($date);
257
 
258
  $archivesToPurge->removeDate($date);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
259
  }
260
  }
261
 
195
  */
196
  public function notifyTrackingFailures()
197
  {
198
+ $this->cleanupTrackingFailures();
199
  $failures = $this->trackingFailures->getAllFailures();
200
  $general = Config::getInstance()->General;
201
  if (!empty($failures) && $general['enable_tracking_failures_notification']) {
252
 
253
  public function purgeInvalidatedArchives()
254
  {
255
+ $purgedDates = [];
256
+
257
  $archivesToPurge = new ArchivesToPurgeDistributedList();
258
  foreach ($archivesToPurge->getAllAsDates() as $date) {
259
  $this->archivePurger->purgeInvalidatedArchivesFrom($date);
260
 
261
  $archivesToPurge->removeDate($date);
262
+
263
+ $purgedDates[$date->toString('Y-m')] = true;
264
+ }
265
+
266
+ // purge from today if not done already since we will have many archives to remove
267
+ $today = Date::today();
268
+ $todayStr = $today->toString('Y-m');
269
+ if (empty($purgedDates[$todayStr])) {
270
+ $this->archivePurger->purgeInvalidatedArchivesFrom($today);
271
+ $purgedDates[$todayStr] = true;
272
+ }
273
+
274
+ // handle yesterday if it belongs to a different month
275
+ $yesterday = Date::yesterday();
276
+ $yesterdayStr = $yesterday->toString('Y-m');
277
+ if (empty($purgedDates[$yesterdayStr])) {
278
+ $this->archivePurger->purgeInvalidatedArchivesFrom($yesterday);
279
  }
280
  }
281
 
app/plugins/CoreHome/Columns/UserId.php CHANGED
@@ -12,6 +12,7 @@ use Piwik\Cache;
12
  use Piwik\DataTable;
13
  use Piwik\DataTable\Map;
14
  use Piwik\Metrics;
 
15
  use Piwik\Plugin\Dimension\VisitDimension;
16
  use Piwik\Plugins\VisitsSummary\API as VisitsSummaryApi;
17
  use Piwik\Tracker\Request;
@@ -39,6 +40,13 @@ class UserId extends VisitDimension
39
  */
40
  protected $columnType = 'VARCHAR(200) NULL';
41
 
 
 
 
 
 
 
 
42
  /**
43
  * @param Request $request
44
  * @param Visitor $visitor
12
  use Piwik\DataTable;
13
  use Piwik\DataTable\Map;
14
  use Piwik\Metrics;
15
+ use Piwik\Plugin;
16
  use Piwik\Plugin\Dimension\VisitDimension;
17
  use Piwik\Plugins\VisitsSummary\API as VisitsSummaryApi;
18
  use Piwik\Tracker\Request;
40
  */
41
  protected $columnType = 'VARCHAR(200) NULL';
42
 
43
+ public function __construct()
44
+ {
45
+ if (Plugin\Manager::getInstance()->isPluginActivated('UserId')) {
46
+ $this->suggestedValuesApi = 'UserId.getUsers';
47
+ }
48
+ }
49
+
50
  /**
51
  * @param Request $request
52
  * @param Visitor $visitor
app/plugins/CoreUpdater/Controller.php CHANGED
@@ -12,6 +12,7 @@ use Exception;
12
  use Piwik\AssetManager;
13
  use Piwik\Common;
14
  use Piwik\Config;
 
15
  use Piwik\DbHelper;
16
  use Piwik\Filechecks;
17
  use Piwik\FileIntegrity;
@@ -172,6 +173,17 @@ class Controller extends \Piwik\Plugin\Controller
172
  return $view->render();
173
  }
174
 
 
 
 
 
 
 
 
 
 
 
 
175
  public function oneClickResults()
176
  {
177
  Filesystem::deleteAllCacheOnUpdate();
12
  use Piwik\AssetManager;
13
  use Piwik\Common;
14
  use Piwik\Config;
15
+ use Piwik\DataTable\Renderer\Json;
16
  use Piwik\DbHelper;
17
  use Piwik\Filechecks;
18
  use Piwik\FileIntegrity;
173
  return $view->render();
174
  }
175
 
176
+ public function oneClickUpdatePartTwo()
177
+ {
178
+ Piwik::checkUserHasSuperUserAccess();
179
+
180
+ Json::sendHeaderJSON();
181
+
182
+ $messages = $this->updater->oneClickUpdatePartTwo();
183
+
184
+ echo json_encode($messages);
185
+ }
186
+
187
  public function oneClickResults()
188
  {
189
  Filesystem::deleteAllCacheOnUpdate();
app/plugins/CoreUpdater/Updater.php CHANGED
@@ -23,6 +23,7 @@ use Piwik\Plugins\Marketplace\Marketplace;
23
  use Piwik\SettingsServer;
24
  use Piwik\Translation\Translator;
25
  use Piwik\Unzip;
 
26
  use Piwik\Version;
27
 
28
  class Updater
@@ -114,21 +115,6 @@ class Updater
114
  $this->verifyDecompressedArchive($extractedArchiveDirectory);
115
  $messages[] = $this->translator->translate('CoreUpdater_VerifyingUnpackedFiles');
116
 
117
- if (Marketplace::isMarketplaceEnabled()) {
118
- // we need to load the marketplace already here, otherwise it will use the new, updated file in Piwik 3
119
-
120
- // we also need to make sure to create a new instance here as otherwise we would change the "global"
121
- // environment, but we only want to change piwik version temporarily for this task here
122
- $environment = StaticContainer::getContainer()->make('Piwik\Plugins\Marketplace\Environment');
123
- $environment->setPiwikVersion($newVersion);
124
- /** @var \Piwik\Plugins\Marketplace\Api\Client $marketplaceClient */
125
- $marketplaceClient = StaticContainer::getContainer()->make('Piwik\Plugins\Marketplace\Api\Client', array(
126
- 'environment' => $environment
127
- ));
128
- require_once PIWIK_DOCUMENT_ROOT . '/plugins/CorePluginsAdmin/PluginInstaller.php';
129
- require_once PIWIK_DOCUMENT_ROOT . '/plugins/Marketplace/Api/Exception.php';
130
- }
131
-
132
  $this->installNewFiles($extractedArchiveDirectory);
133
  $messages[] = $this->translator->translate('CoreUpdater_InstallingTheLatestVersion');
134
 
@@ -138,9 +124,45 @@ class Updater
138
  throw new UpdaterException($e, $messages);
139
  }
140
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  try {
142
 
143
- if (Marketplace::isMarketplaceEnabled() && !empty($marketplaceClient)) {
144
  $messages[] = $this->translator->translate('CoreUpdater_CheckingForPluginUpdates');
145
  $pluginManager = PluginManager::getInstance();
146
  $pluginManager->loadAllPluginsAndGetTheirInfo();
@@ -152,7 +174,7 @@ class Updater
152
  foreach ($pluginsWithUpdate as $pluginWithUpdate) {
153
  $pluginName = $pluginWithUpdate['name'];
154
  $messages[] = $this->translator->translate('CoreUpdater_UpdatingPluginXToVersionY',
155
- array($pluginName, $pluginWithUpdate['version']));
156
  $pluginInstaller = new PluginInstaller($marketplaceClient);
157
  $pluginInstaller->installOrUpdatePluginFromMarketplace($pluginName);
158
  }
@@ -163,15 +185,6 @@ class Updater
163
  throw new UpdaterException($e, $messages);
164
  }
165
 
166
- try {
167
- $disabledPluginNames = $this->disableIncompatiblePlugins($newVersion);
168
- if (!empty($disabledPluginNames)) {
169
- $messages[] = $this->translator->translate('CoreUpdater_DisablingIncompatiblePlugins', implode(', ', $disabledPluginNames));
170
- }
171
- } catch (Exception $e) {
172
- throw new UpdaterException($e, $messages);
173
- }
174
-
175
  return $messages;
176
  }
177
 
23
  use Piwik\SettingsServer;
24
  use Piwik\Translation\Translator;
25
  use Piwik\Unzip;
26
+ use Piwik\Url;
27
  use Piwik\Version;
28
 
29
  class Updater
115
  $this->verifyDecompressedArchive($extractedArchiveDirectory);
116
  $messages[] = $this->translator->translate('CoreUpdater_VerifyingUnpackedFiles');
117
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  $this->installNewFiles($extractedArchiveDirectory);
119
  $messages[] = $this->translator->translate('CoreUpdater_InstallingTheLatestVersion');
120
 
124
  throw new UpdaterException($e, $messages);
125
  }
126
 
127
+ $partTwoUrl = Url::getCurrentUrlWithoutQueryString() . Url::getCurrentQueryStringWithParametersModified([
128
+ 'action' => 'oneClickUpdatePartTwo',
129
+ ]);
130
+
131
+ $response = Http::sendHttpRequest($partTwoUrl, 300);
132
+ $response = @json_decode($response, $assoc = true);
133
+
134
+ $messages = array_merge($messages, $response);
135
+
136
+ try {
137
+ $disabledPluginNames = $this->disableIncompatiblePlugins($newVersion);
138
+ if (!empty($disabledPluginNames)) {
139
+ $messages[] = $this->translator->translate('CoreUpdater_DisablingIncompatiblePlugins', implode(', ', $disabledPluginNames));
140
+ }
141
+ } catch (Exception $e) {
142
+ throw new UpdaterException($e, $messages);
143
+ }
144
+
145
+ return $messages;
146
+ }
147
+
148
+ public function oneClickUpdatePartTwo()
149
+ {
150
+ $messages = [];
151
+
152
+ $newVersion = Version::VERSION;
153
+
154
+ // we also need to make sure to create a new instance here as otherwise we would change the "global"
155
+ // environment, but we only want to change piwik version temporarily for this task here
156
+ $environment = StaticContainer::getContainer()->make('Piwik\Plugins\Marketplace\Environment');
157
+ $environment->setPiwikVersion($newVersion);
158
+ /** @var \Piwik\Plugins\Marketplace\Api\Client $marketplaceClient */
159
+ $marketplaceClient = StaticContainer::getContainer()->make('Piwik\Plugins\Marketplace\Api\Client', array(
160
+ 'environment' => $environment
161
+ ));
162
+
163
  try {
164
 
165
+ if (Marketplace::isMarketplaceEnabled()) {
166
  $messages[] = $this->translator->translate('CoreUpdater_CheckingForPluginUpdates');
167
  $pluginManager = PluginManager::getInstance();
168
  $pluginManager->loadAllPluginsAndGetTheirInfo();
174
  foreach ($pluginsWithUpdate as $pluginWithUpdate) {
175
  $pluginName = $pluginWithUpdate['name'];
176
  $messages[] = $this->translator->translate('CoreUpdater_UpdatingPluginXToVersionY',
177
+ array($pluginName, $pluginWithUpdate['version']));
178
  $pluginInstaller = new PluginInstaller($marketplaceClient);
179
  $pluginInstaller->installOrUpdatePluginFromMarketplace($pluginName);
180
  }
185
  throw new UpdaterException($e, $messages);
186
  }
187
 
 
 
 
 
 
 
 
 
 
188
  return $messages;
189
  }
190
 
app/plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php CHANGED
@@ -19,6 +19,23 @@ class JsTestPluginTrackerFiles extends PluginTrackerFiles
19
  $this->ignoreMinified = true;
20
  }
21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  protected function isPluginActivated($pluginName)
23
  {
24
  return true;
19
  $this->ignoreMinified = true;
20
  }
21
 
22
+ protected function getDirectoriesToLook()
23
+ {
24
+ $dirs = array();
25
+ $trackerFiles = \_glob(PIWIK_DOCUMENT_ROOT . '/plugins/*/' . self::TRACKER_FILE);
26
+ foreach ($trackerFiles as $trackerFile) {
27
+ $pluginName = $this->getPluginNameFromFile($trackerFile);
28
+ $dirs[$pluginName] = dirname($trackerFile) . '/';
29
+ }
30
+ return $dirs;
31
+ }
32
+
33
+ protected function getPluginNameFromFile($file)
34
+ {
35
+ $file = str_replace(array(PIWIK_DOCUMENT_ROOT . '/plugins/', self::TRACKER_FILE), '', $file);
36
+ return trim($file, '/');
37
+ }
38
+
39
  protected function isPluginActivated($pluginName)
40
  {
41
  return true;
app/plugins/Events/Columns/EventAction.php CHANGED
@@ -24,6 +24,7 @@ class EventAction extends ActionDimension
24
  protected $segmentName = 'eventAction';
25
  protected $nameSingular = 'Events_EventAction';
26
  protected $namePlural = 'Events_EventActions';
 
27
  protected $category = 'Events_Events';
28
  protected $sqlFilter = '\Piwik\Tracker\TableLogAction::getIdActionFromSegment';
29
 
24
  protected $segmentName = 'eventAction';
25
  protected $nameSingular = 'Events_EventAction';
26
  protected $namePlural = 'Events_EventActions';
27
+ protected $suggestedValuesApi = 'Events.getAction';
28
  protected $category = 'Events_Events';
29
  protected $sqlFilter = '\Piwik\Tracker\TableLogAction::getIdActionFromSegment';
30
 
app/plugins/Events/Columns/EventCategory.php CHANGED
@@ -24,6 +24,7 @@ class EventCategory extends ActionDimension
24
  protected $category = 'Events_Events';
25
  protected $sqlFilter = '\Piwik\Tracker\TableLogAction::getIdActionFromSegment';
26
  protected $segmentName = 'eventCategory';
 
27
  protected $nameSingular = 'Events_EventCategory';
28
  protected $namePlural = 'Events_EventCategories';
29
 
24
  protected $category = 'Events_Events';
25
  protected $sqlFilter = '\Piwik\Tracker\TableLogAction::getIdActionFromSegment';
26
  protected $segmentName = 'eventCategory';
27
+ protected $suggestedValuesApi = 'Events.getCategory';
28
  protected $nameSingular = 'Events_EventCategory';
29
  protected $namePlural = 'Events_EventCategories';
30
 
app/plugins/Events/Columns/EventName.php CHANGED
@@ -22,6 +22,8 @@ class EventName extends ActionDimension
22
  protected $category = 'Events_Events';
23
  protected $sqlFilter = '\Piwik\Tracker\TableLogAction::getIdActionFromSegment';
24
  protected $segmentName = 'eventName';
 
 
25
  protected $nameSingular = 'Events_EventName';
26
  protected $namePlural = 'Events_EventNames';
27
 
22
  protected $category = 'Events_Events';
23
  protected $sqlFilter = '\Piwik\Tracker\TableLogAction::getIdActionFromSegment';
24
  protected $segmentName = 'eventName';
25
+ protected $suggestedValuesApi = 'Events.getName';
26
+
27
  protected $nameSingular = 'Events_EventName';
28
  protected $namePlural = 'Events_EventNames';
29
 
app/plugins/Live/Controller.php CHANGED
@@ -195,6 +195,8 @@ class Controller extends \Piwik\Plugin\Controller
195
  return '';
196
  }
197
 
 
 
198
  $view = new View('@Live/getVisitList.twig');
199
  $view->idSite = $this->idSite;
200
  $view->startCounter = $startCounter < $nextVisits->getRowsCount() ? $nextVisits->getRowsCount() : $startCounter;
195
  return '';
196
  }
197
 
198
+ VisitorLog::groupActionsByPageviewId($nextVisits);
199
+
200
  $view = new View('@Live/getVisitList.twig');
201
  $view->idSite = $this->idSite;
202
  $view->startCounter = $startCounter < $nextVisits->getRowsCount() ? $nextVisits->getRowsCount() : $startCounter;
app/plugins/Marketplace/Api/Client.php CHANGED
@@ -8,11 +8,9 @@
8
  */
9
  namespace Piwik\Plugins\Marketplace\Api;
10
 
11
- use Piwik\API\Request;
12
  use Piwik\Cache;
13
  use Piwik\Common;
14
  use Piwik\Container\StaticContainer;
15
- use Piwik\DataTable;
16
  use Piwik\Filesystem;
17
  use Piwik\Http;
18
  use Piwik\Piwik;
8
  */
9
  namespace Piwik\Plugins\Marketplace\Api;
10
 
 
11
  use Piwik\Cache;
12
  use Piwik\Common;
13
  use Piwik\Container\StaticContainer;
 
14
  use Piwik\Filesystem;
15
  use Piwik\Http;
16
  use Piwik\Piwik;
app/plugins/UserId/API.php CHANGED
@@ -40,6 +40,7 @@ class API extends \Piwik\Plugin\API
40
 
41
  $dataTable->queueFilter('ReplaceColumnNames');
42
  $dataTable->queueFilter('ReplaceSummaryRowLabel');
 
43
 
44
  return $dataTable;
45
  }
40
 
41
  $dataTable->queueFilter('ReplaceColumnNames');
42
  $dataTable->queueFilter('ReplaceSummaryRowLabel');
43
+ $dataTable->queueFilter('AddSegmentByLabel', array('userId'));
44
 
45
  return $dataTable;
46
  }
app/vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitd94bcb60246118fb0b76072b15fbc1cf::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInita7390451fa333dcc08d2dd84c32bbfc6::getLoader();
app/vendor/composer/autoload_classmap.php CHANGED
@@ -527,6 +527,7 @@ return array(
527
  'Piwik\\CronArchive\\SegmentArchivingRequestUrlProvider' => $baseDir . '/core/CronArchive/SegmentArchivingRequestUrlProvider.php',
528
  'Piwik\\CronArchive\\SharedSiteIds' => $baseDir . '/core/CronArchive/SharedSiteIds.php',
529
  'Piwik\\CronArchive\\SitesToReprocessDistributedList' => $baseDir . '/core/CronArchive/SitesToReprocessDistributedList.php',
 
530
  'Piwik\\DataAccess\\Actions' => $baseDir . '/core/DataAccess/Actions.php',
531
  'Piwik\\DataAccess\\ArchiveSelector' => $baseDir . '/core/DataAccess/ArchiveSelector.php',
532
  'Piwik\\DataAccess\\ArchiveTableCreator' => $baseDir . '/core/DataAccess/ArchiveTableCreator.php',
@@ -2604,6 +2605,7 @@ return array(
2604
  'Piwik\\Updates\\Updates_3_12_0_b7' => $baseDir . '/core/Updates/3.12.0-b7.php',
2605
  'Piwik\\Updates\\Updates_3_13_1_b2' => $baseDir . '/core/Updates/3.13.1-b2.php',
2606
  'Piwik\\Updates\\Updates_3_13_4_b1' => $baseDir . '/core/Updates/3.13.4-b1.php',
 
2607
  'Piwik\\Updates\\Updates_3_5_0_b2' => $baseDir . '/core/Updates/3.5.0-b2.php',
2608
  'Piwik\\Updates\\Updates_3_5_0_b4' => $baseDir . '/core/Updates/3.5.0-b4.php',
2609
  'Piwik\\Updates\\Updates_3_5_0_rc2' => $baseDir . '/core/Updates/3.5.0-rc2.php',
527
  'Piwik\\CronArchive\\SegmentArchivingRequestUrlProvider' => $baseDir . '/core/CronArchive/SegmentArchivingRequestUrlProvider.php',
528
  'Piwik\\CronArchive\\SharedSiteIds' => $baseDir . '/core/CronArchive/SharedSiteIds.php',
529
  'Piwik\\CronArchive\\SitesToReprocessDistributedList' => $baseDir . '/core/CronArchive/SitesToReprocessDistributedList.php',
530
+ 'Piwik\\CronArchive\\StopArchiverException' => $baseDir . '/core/CronArchive/StopArchiverException.php',
531
  'Piwik\\DataAccess\\Actions' => $baseDir . '/core/DataAccess/Actions.php',
532
  'Piwik\\DataAccess\\ArchiveSelector' => $baseDir . '/core/DataAccess/ArchiveSelector.php',
533
  'Piwik\\DataAccess\\ArchiveTableCreator' => $baseDir . '/core/DataAccess/ArchiveTableCreator.php',
2605
  'Piwik\\Updates\\Updates_3_12_0_b7' => $baseDir . '/core/Updates/3.12.0-b7.php',
2606
  'Piwik\\Updates\\Updates_3_13_1_b2' => $baseDir . '/core/Updates/3.13.1-b2.php',
2607
  'Piwik\\Updates\\Updates_3_13_4_b1' => $baseDir . '/core/Updates/3.13.4-b1.php',
2608
+ 'Piwik\\Updates\\Updates_3_13_5_rc1' => $baseDir . '/core/Updates/3.13.5-rc1.php',
2609
  'Piwik\\Updates\\Updates_3_5_0_b2' => $baseDir . '/core/Updates/3.5.0-b2.php',
2610
  'Piwik\\Updates\\Updates_3_5_0_b4' => $baseDir . '/core/Updates/3.5.0-b4.php',
2611
  'Piwik\\Updates\\Updates_3_5_0_rc2' => $baseDir . '/core/Updates/3.5.0-rc2.php',
app/vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitd94bcb60246118fb0b76072b15fbc1cf
6
  {
7
  private static $loader;
8
 
@@ -22,9 +22,9 @@ class ComposerAutoloaderInitd94bcb60246118fb0b76072b15fbc1cf
22
  return self::$loader;
23
  }
24
 
25
- spl_autoload_register(array('ComposerAutoloaderInitd94bcb60246118fb0b76072b15fbc1cf', 'loadClassLoader'), true, false);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
- spl_autoload_unregister(array('ComposerAutoloaderInitd94bcb60246118fb0b76072b15fbc1cf', 'loadClassLoader'));
28
 
29
  $includePaths = require __DIR__ . '/include_paths.php';
30
  $includePaths[] = get_include_path();
@@ -34,7 +34,7 @@ class ComposerAutoloaderInitd94bcb60246118fb0b76072b15fbc1cf
34
  if ($useStaticLoader) {
35
  require_once __DIR__ . '/autoload_static.php';
36
 
37
- call_user_func(\Composer\Autoload\ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf::getInitializer($loader));
38
  } else {
39
  $map = require __DIR__ . '/autoload_namespaces.php';
40
  foreach ($map as $namespace => $path) {
@@ -55,19 +55,19 @@ class ComposerAutoloaderInitd94bcb60246118fb0b76072b15fbc1cf
55
  $loader->register(false);
56
 
57
  if ($useStaticLoader) {
58
- $includeFiles = Composer\Autoload\ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf::$files;
59
  } else {
60
  $includeFiles = require __DIR__ . '/autoload_files.php';
61
  }
62
  foreach ($includeFiles as $fileIdentifier => $file) {
63
- composerRequired94bcb60246118fb0b76072b15fbc1cf($fileIdentifier, $file);
64
  }
65
 
66
  return $loader;
67
  }
68
  }
69
 
70
- function composerRequired94bcb60246118fb0b76072b15fbc1cf($fileIdentifier, $file)
71
  {
72
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
73
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInita7390451fa333dcc08d2dd84c32bbfc6
6
  {
7
  private static $loader;
8
 
22
  return self::$loader;
23
  }
24
 
25
+ spl_autoload_register(array('ComposerAutoloaderInita7390451fa333dcc08d2dd84c32bbfc6', 'loadClassLoader'), true, false);
26
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
27
+ spl_autoload_unregister(array('ComposerAutoloaderInita7390451fa333dcc08d2dd84c32bbfc6', 'loadClassLoader'));
28
 
29
  $includePaths = require __DIR__ . '/include_paths.php';
30
  $includePaths[] = get_include_path();
34
  if ($useStaticLoader) {
35
  require_once __DIR__ . '/autoload_static.php';
36
 
37
+ call_user_func(\Composer\Autoload\ComposerStaticInita7390451fa333dcc08d2dd84c32bbfc6::getInitializer($loader));
38
  } else {
39
  $map = require __DIR__ . '/autoload_namespaces.php';
40
  foreach ($map as $namespace => $path) {
55
  $loader->register(false);
56
 
57
  if ($useStaticLoader) {
58
+ $includeFiles = Composer\Autoload\ComposerStaticInita7390451fa333dcc08d2dd84c32bbfc6::$files;
59
  } else {
60
  $includeFiles = require __DIR__ . '/autoload_files.php';
61
  }
62
  foreach ($includeFiles as $fileIdentifier => $file) {
63
+ composerRequirea7390451fa333dcc08d2dd84c32bbfc6($fileIdentifier, $file);
64
  }
65
 
66
  return $loader;
67
  }
68
  }
69
 
70
+ function composerRequirea7390451fa333dcc08d2dd84c32bbfc6($fileIdentifier, $file)
71
  {
72
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
73
  require $file;
app/vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
@@ -769,6 +769,7 @@ class ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf
769
  'Piwik\\CronArchive\\SegmentArchivingRequestUrlProvider' => __DIR__ . '/../..' . '/core/CronArchive/SegmentArchivingRequestUrlProvider.php',
770
  'Piwik\\CronArchive\\SharedSiteIds' => __DIR__ . '/../..' . '/core/CronArchive/SharedSiteIds.php',
771
  'Piwik\\CronArchive\\SitesToReprocessDistributedList' => __DIR__ . '/../..' . '/core/CronArchive/SitesToReprocessDistributedList.php',
 
772
  'Piwik\\DataAccess\\Actions' => __DIR__ . '/../..' . '/core/DataAccess/Actions.php',
773
  'Piwik\\DataAccess\\ArchiveSelector' => __DIR__ . '/../..' . '/core/DataAccess/ArchiveSelector.php',
774
  'Piwik\\DataAccess\\ArchiveTableCreator' => __DIR__ . '/../..' . '/core/DataAccess/ArchiveTableCreator.php',
@@ -2846,6 +2847,7 @@ class ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf
2846
  'Piwik\\Updates\\Updates_3_12_0_b7' => __DIR__ . '/../..' . '/core/Updates/3.12.0-b7.php',
2847
  'Piwik\\Updates\\Updates_3_13_1_b2' => __DIR__ . '/../..' . '/core/Updates/3.13.1-b2.php',
2848
  'Piwik\\Updates\\Updates_3_13_4_b1' => __DIR__ . '/../..' . '/core/Updates/3.13.4-b1.php',
 
2849
  'Piwik\\Updates\\Updates_3_5_0_b2' => __DIR__ . '/../..' . '/core/Updates/3.5.0-b2.php',
2850
  'Piwik\\Updates\\Updates_3_5_0_b4' => __DIR__ . '/../..' . '/core/Updates/3.5.0-b4.php',
2851
  'Piwik\\Updates\\Updates_3_5_0_rc2' => __DIR__ . '/../..' . '/core/Updates/3.5.0-rc2.php',
@@ -3604,11 +3606,11 @@ class ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf
3604
  public static function getInitializer(ClassLoader $loader)
3605
  {
3606
  return \Closure::bind(function () use ($loader) {
3607
- $loader->prefixLengthsPsr4 = ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf::$prefixLengthsPsr4;
3608
- $loader->prefixDirsPsr4 = ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf::$prefixDirsPsr4;
3609
- $loader->prefixesPsr0 = ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf::$prefixesPsr0;
3610
- $loader->fallbackDirsPsr0 = ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf::$fallbackDirsPsr0;
3611
- $loader->classMap = ComposerStaticInitd94bcb60246118fb0b76072b15fbc1cf::$classMap;
3612
 
3613
  }, null, ClassLoader::class);
3614
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInita7390451fa333dcc08d2dd84c32bbfc6
8
  {
9
  public static $files = array (
10
  '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
769
  'Piwik\\CronArchive\\SegmentArchivingRequestUrlProvider' => __DIR__ . '/../..' . '/core/CronArchive/SegmentArchivingRequestUrlProvider.php',
770
  'Piwik\\CronArchive\\SharedSiteIds' => __DIR__ . '/../..' . '/core/CronArchive/SharedSiteIds.php',
771
  'Piwik\\CronArchive\\SitesToReprocessDistributedList' => __DIR__ . '/../..' . '/core/CronArchive/SitesToReprocessDistributedList.php',
772
+ 'Piwik\\CronArchive\\StopArchiverException' => __DIR__ . '/../..' . '/core/CronArchive/StopArchiverException.php',
773
  'Piwik\\DataAccess\\Actions' => __DIR__ . '/../..' . '/core/DataAccess/Actions.php',
774
  'Piwik\\DataAccess\\ArchiveSelector' => __DIR__ . '/../..' . '/core/DataAccess/ArchiveSelector.php',
775
  'Piwik\\DataAccess\\ArchiveTableCreator' => __DIR__ . '/../..' . '/core/DataAccess/ArchiveTableCreator.php',
2847
  'Piwik\\Updates\\Updates_3_12_0_b7' => __DIR__ . '/../..' . '/core/Updates/3.12.0-b7.php',
2848
  'Piwik\\Updates\\Updates_3_13_1_b2' => __DIR__ . '/../..' . '/core/Updates/3.13.1-b2.php',
2849
  'Piwik\\Updates\\Updates_3_13_4_b1' => __DIR__ . '/../..' . '/core/Updates/3.13.4-b1.php',
2850
+ 'Piwik\\Updates\\Updates_3_13_5_rc1' => __DIR__ . '/../..' . '/core/Updates/3.13.5-rc1.php',
2851
  'Piwik\\Updates\\Updates_3_5_0_b2' => __DIR__ . '/../..' . '/core/Updates/3.5.0-b2.php',
2852
  'Piwik\\Updates\\Updates_3_5_0_b4' => __DIR__ . '/../..' . '/core/Updates/3.5.0-b4.php',
2853
  'Piwik\\Updates\\Updates_3_5_0_rc2' => __DIR__ . '/../..' . '/core/Updates/3.5.0-rc2.php',
3606
  public static function getInitializer(ClassLoader $loader)
3607
  {
3608
  return \Closure::bind(function () use ($loader) {
3609
+ $loader->prefixLengthsPsr4 = ComposerStaticInita7390451fa333dcc08d2dd84c32bbfc6::$prefixLengthsPsr4;
3610
+ $loader->prefixDirsPsr4 = ComposerStaticInita7390451fa333dcc08d2dd84c32bbfc6::$prefixDirsPsr4;
3611
+ $loader->prefixesPsr0 = ComposerStaticInita7390451fa333dcc08d2dd84c32bbfc6::$prefixesPsr0;
3612
+ $loader->fallbackDirsPsr0 = ComposerStaticInita7390451fa333dcc08d2dd84c32bbfc6::$fallbackDirsPsr0;
3613
+ $loader->classMap = ComposerStaticInita7390451fa333dcc08d2dd84c32bbfc6::$classMap;
3614
 
3615
  }, null, ClassLoader::class);
3616
  }
app/vendor/composer/installed.json CHANGED
@@ -1164,17 +1164,17 @@
1164
  },
1165
  {
1166
  "name": "piwik/device-detector",
1167
- "version": "3.12.3",
1168
- "version_normalized": "3.12.3.0",
1169
  "source": {
1170
  "type": "git",
1171
  "url": "https://github.com/matomo-org/device-detector.git",
1172
- "reference": "22257883bd2c7c21d68112a907cdad7de4a2ba31"
1173
  },
1174
  "dist": {
1175
  "type": "zip",
1176
- "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/22257883bd2c7c21d68112a907cdad7de4a2ba31",
1177
- "reference": "22257883bd2c7c21d68112a907cdad7de4a2ba31",
1178
  "shasum": ""
1179
  },
1180
  "require": {
@@ -1192,7 +1192,7 @@
1192
  "doctrine/cache": "Can directly be used for caching purpose",
1193
  "ext-yaml": "Necessary for using the Pecl YAML parser"
1194
  },
1195
- "time": "2020-01-13T16:15:20+00:00",
1196
  "type": "library",
1197
  "installation-source": "dist",
1198
  "autoload": {
1164
  },
1165
  {
1166
  "name": "piwik/device-detector",
1167
+ "version": "3.12.4",
1168
+ "version_normalized": "3.12.4.0",
1169
  "source": {
1170
  "type": "git",
1171
  "url": "https://github.com/matomo-org/device-detector.git",
1172
+ "reference": "6a92e45a55eb507f53581e9add7dc82835ad6424"
1173
  },
1174
  "dist": {
1175
  "type": "zip",
1176
+ "url": "https://api.github.com/repos/matomo-org/device-detector/zipball/6a92e45a55eb507f53581e9add7dc82835ad6424",
1177
+ "reference": "6a92e45a55eb507f53581e9add7dc82835ad6424",
1178
  "shasum": ""
1179
  },
1180
  "require": {
1192
  "doctrine/cache": "Can directly be used for caching purpose",
1193
  "ext-yaml": "Necessary for using the Pecl YAML parser"
1194
  },
1195
+ "time": "2020-03-31T08:53:12+00:00",
1196
  "type": "library",
1197
  "installation-source": "dist",
1198
  "autoload": {
app/vendor/piwik/device-detector/DeviceDetector.php CHANGED
@@ -50,7 +50,7 @@ class DeviceDetector
50
  /**
51
  * Current version number of DeviceDetector
52
  */
53
- const VERSION = '3.12.3';
54
 
55
  /**
56
  * Holds all registered client types
50
  /**
51
  * Current version number of DeviceDetector
52
  */
53
+ const VERSION = '3.12.4';
54
 
55
  /**
56
  * Holds all registered client types
app/vendor/piwik/device-detector/Parser/Client/Browser.php CHANGED
@@ -242,6 +242,7 @@ class Browser extends ClientParserAbstract
242
  'TB' => 'Tenta Browser',
243
  'TZ' => 'Tizen Browser',
244
  'TS' => 'TweakStyle',
 
245
  'UB' => 'UBrowser',
246
  'UC' => 'UC Browser',
247
  'UM' => 'UC Browser Mini',
@@ -276,7 +277,7 @@ class Browser extends ClientParserAbstract
276
  'BlackBerry Browser' => array('BB'),
277
  'Baidu' => array('BD', 'BS'),
278
  'Amiga' => array('AV', 'AW'),
279
- 'Chrome' => array('CH', 'BA', 'BR', 'CC', 'CD', 'CM', 'CI', 'CF', 'CN', 'CR', 'CP', 'DD', 'IR', 'RM', 'AO', 'TS', 'VI', 'PT', 'AS', 'TB', 'AD', 'SB', 'WP', 'I3', 'CV', 'WH', 'SZ', 'QW', 'LF', 'KW', '2B', 'CE', 'EC', 'MT', 'MS', 'HA', 'OC', 'MZ', 'BM', 'KN', 'SW', 'M1', 'FA', 'TA', 'AH', 'CL', 'SU', 'EU', 'UB', 'LO', 'VG'),
280
  'Firefox' => array('FF', 'FE', 'FM', 'SX', 'FB', 'PX', 'MB', 'EI', 'WF', 'CU', 'TF', 'QM', 'FR', 'I4', 'GZ', 'MO', 'F1', 'BI', 'MN', 'BH', 'TO', 'OS', 'FY'),
281
  'Internet Explorer' => array('IE', 'IM', 'PS'),
282
  'Konqueror' => array('KO'),
242
  'TB' => 'Tenta Browser',
243
  'TZ' => 'Tizen Browser',
244
  'TS' => 'TweakStyle',
245
+ 'TV' => 'TV Bro',
246
  'UB' => 'UBrowser',
247
  'UC' => 'UC Browser',
248
  'UM' => 'UC Browser Mini',
277
  'BlackBerry Browser' => array('BB'),
278
  'Baidu' => array('BD', 'BS'),
279
  'Amiga' => array('AV', 'AW'),
280
+ 'Chrome' => array('CH', 'BA', 'BR', 'CC', 'CD', 'CM', 'CI', 'CF', 'CN', 'CR', 'CP', 'DD', 'IR', 'RM', 'AO', 'TS', 'VI', 'PT', 'AS', 'TB', 'AD', 'SB', 'WP', 'I3', 'CV', 'WH', 'SZ', 'QW', 'LF', 'KW', '2B', 'CE', 'EC', 'MT', 'MS', 'HA', 'OC', 'MZ', 'BM', 'KN', 'SW', 'M1', 'FA', 'TA', 'AH', 'CL', 'SU', 'EU', 'UB', 'LO', 'VG', 'TV'),
281
  'Firefox' => array('FF', 'FE', 'FM', 'SX', 'FB', 'PX', 'MB', 'EI', 'WF', 'CU', 'TF', 'QM', 'FR', 'I4', 'GZ', 'MO', 'F1', 'BI', 'MN', 'BH', 'TO', 'OS', 'FY'),
282
  'Internet Explorer' => array('IE', 'IM', 'PS'),
283
  'Konqueror' => array('KO'),
app/vendor/piwik/device-detector/Parser/Device/DeviceParserAbstract.php CHANGED
@@ -65,6 +65,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
65
  public static $deviceBrands = array(
66
  '3Q' => '3Q',
67
  '4G' => '4Good',
 
68
  'AA' => 'AllCall',
69
  'AC' => 'Acer',
70
  'A9' => 'Advan',
@@ -77,11 +78,14 @@ abstract class DeviceParserAbstract extends ParserAbstract
77
  'AK' => 'Akai',
78
  '1A' => 'Alba',
79
  'AL' => 'Alcatel',
 
 
80
  'A2' => 'Allview',
81
  'A7' => 'Allwinner',
82
  'A1' => 'Altech UEC',
83
  'A5' => 'altron',
84
  'AN' => 'Arnova',
 
85
  'KN' => 'Amazon',
86
  'AG' => 'AMGOO',
87
  'AO' => 'Amoi',
@@ -121,6 +125,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
121
  'B2' => 'Blackview',
122
  'B4' => 'bogo',
123
  'BW' => 'Boway',
 
124
  'BX' => 'bq',
125
  'BV' => 'Bravis',
126
  'BR' => 'Brondi',
@@ -135,7 +140,9 @@ abstract class DeviceParserAbstract extends ParserAbstract
135
  'CE' => 'Celkon',
136
  'CC' => 'ConCorde',
137
  'C2' => 'Changhong',
 
138
  'CH' => 'Cherry Mobile',
 
139
  'L8' => 'Clarmin',
140
  'CK' => 'Cricket',
141
  'C1' => 'Crosscall',
@@ -157,10 +164,12 @@ abstract class DeviceParserAbstract extends ParserAbstract
157
  'CX' => 'Crescent',
158
  'C4' => 'Cyrus',
159
  'CV' => 'CVTE',
 
160
  'DA' => 'Danew',
161
  'DT' => 'Datang',
162
  'D1' => 'Datsun',
163
  'DE' => 'Denver',
 
164
  'DX' => 'DEXP',
165
  'DS' => 'Desay',
166
  'DB' => 'Dbtel',
@@ -171,6 +180,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
171
  'D3' => 'Digicel',
172
  'DD' => 'Digiland',
173
  'D2' => 'Digma',
 
174
  'DL' => 'Dell',
175
  'DN' => 'DNS',
176
  'DM' => 'DMM',
@@ -234,6 +244,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
234
  'GG' => 'Gigabyte',
235
  'GS' => 'Gigaset',
236
  'GZ' => 'Ginzzu',
 
237
  'GC' => 'GOCLEVER',
238
  'GL' => 'Goly',
239
  'GO' => 'Google',
@@ -279,6 +290,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
279
  'IS' => 'Insignia',
280
  'I4' => 'Inoi',
281
  'IR' => 'iRola',
 
282
  'I6' => 'Irbis',
283
  'II' => 'Inkti',
284
  'IX' => 'Intex',
@@ -295,9 +307,13 @@ abstract class DeviceParserAbstract extends ParserAbstract
295
  'J5' => 'Just5',
296
  'KL' => 'Kalley',
297
  'K4' => 'Kaan',
 
 
298
  'KA' => 'Karbonn',
 
299
  'KD' => 'KDDI',
300
  'K1' => 'Kiano',
 
301
  'KI' => 'Kingsun',
302
  'KC' => 'Kocaso',
303
  'KG' => 'Kogan',
@@ -341,11 +357,14 @@ abstract class DeviceParserAbstract extends ParserAbstract
341
  'LX' => 'Lexibook',
342
  'LY' => 'LYF',
343
  'LU' => 'Lumus',
 
344
  'MN' => 'M4tel',
345
  'MJ' => 'Majestic',
346
  'MA' => 'Manta Multimedia',
 
347
  '2M' => 'Masstel',
348
  'MW' => 'Maxwest',
 
349
  'M0' => 'Maze',
350
  'MB' => 'Mobistel',
351
  '0M' => 'Mecool',
@@ -383,13 +402,16 @@ abstract class DeviceParserAbstract extends ParserAbstract
383
  '1M' => 'MYFON',
384
  'MG' => 'MyWigo',
385
  'M8' => 'Myria',
 
386
  'N3' => 'Navon',
 
387
  'N5' => 'NOA',
388
  'NE' => 'NEC',
389
  'NF' => 'Neffos',
390
  'NA' => 'Netgear',
391
  'NU' => 'NeuImage',
392
  'NG' => 'NGM',
 
393
  'N6' => 'Nobby',
394
  'NO' => 'Nous',
395
  'NI' => 'Nintendo',
@@ -399,10 +421,12 @@ abstract class DeviceParserAbstract extends ParserAbstract
399
  'NV' => 'Nvidia',
400
  'NB' => 'Noblex',
401
  'NM' => 'Nomi',
 
402
  'NL' => 'NUU Mobile',
403
  'NY' => 'NYX Mobile',
404
  'NN' => 'Nikon',
405
  'NW' => 'Newgen',
 
406
  'NX' => 'Nexian',
407
  'NT' => 'NextBook',
408
  'O3' => 'O+',
@@ -415,6 +439,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
415
  'OS' => 'Ordissimo',
416
  'OT' => 'O2',
417
  'OK' => 'Ouki',
 
418
  'OU' => 'OUYA',
419
  'OO' => 'Opsson',
420
  'OV' => 'Overmax',
@@ -433,6 +458,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
433
  'PL' => 'Polaroid',
434
  'P5' => 'Polytron',
435
  'P9' => 'Primepad',
 
436
  'PM' => 'Palm',
437
  'PO' => 'phoneOne',
438
  'PT' => 'Pantech',
@@ -452,6 +478,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
452
  'QM' => 'QMobile',
453
  'QA' => 'Quantum',
454
  'QU' => 'Quechua',
 
455
  'RA' => 'Ramos',
456
  'RC' => 'RCA Tablets',
457
  'RB' => 'Readboy',
@@ -467,9 +494,12 @@ abstract class DeviceParserAbstract extends ParserAbstract
467
  'R3' => 'Rombica',
468
  'RT' => 'RT Project',
469
  'RX' => 'Ritmix',
 
470
  'R5' => 'Ross&Moor',
471
  'R2' => 'R-TV',
472
- 'SQ' => 'Santin BiTBiZ',
 
 
473
  'SA' => 'Samsung',
474
  'S0' => 'Sanei',
475
  'SD' => 'Sega',
@@ -480,6 +510,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
480
  'SX' => 'SFR',
481
  'SG' => 'Sagem',
482
  'SH' => 'Sharp',
 
483
  '3S' => 'Shuttle',
484
  'SI' => 'Siemens',
485
  'SJ' => 'Silent Circle',
@@ -493,6 +524,8 @@ abstract class DeviceParserAbstract extends ParserAbstract
493
  'SO' => 'Sony',
494
  'OI' => 'Sonim',
495
  'SP' => 'Spice',
 
 
496
  'SU' => 'SuperSonic',
497
  'S5' => 'Supra',
498
  'SV' => 'Selevision',
@@ -548,6 +581,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
548
  'TZ' => 'teXet',
549
  'UC' => 'U.S. Cellular',
550
  'UH' => 'Uhappy',
 
551
  'UL' => 'Ulefone',
552
  'UO' => 'Unnecto',
553
  'UN' => 'Unowhy',
@@ -556,15 +590,20 @@ abstract class DeviceParserAbstract extends ParserAbstract
556
  'UM' => 'UMIDIGI',
557
  'UU' => 'Unonu',
558
  'UK' => 'UTOK',
 
559
  'UT' => 'UTStarcom',
 
560
  'VA' => 'Vastking',
561
  'VD' => 'Videocon',
562
  'VE' => 'Vertu',
563
  'VN' => 'Venso',
564
  'V5' => 'Vivax',
565
  'VI' => 'Vitelcom',
 
566
  'VK' => 'VK Mobile',
567
  'VS' => 'ViewSonic',
 
 
568
  'VT' => 'Vestel',
569
  'VR' => 'Vernee',
570
  'V4' => 'Verizon',
@@ -588,6 +627,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
588
  'WE' => 'WellcoM',
589
  'WY' => 'Wexler',
590
  'WI' => 'Wiko',
 
591
  'WL' => 'Wolder',
592
  'WG' => 'Wolfgang',
593
  'WO' => 'Wonu',
@@ -598,6 +638,7 @@ abstract class DeviceParserAbstract extends ParserAbstract
598
  'XL' => 'Xiaolajiao',
599
  'XN' => 'Xion',
600
  'XO' => 'Xolo',
 
601
  'YA' => 'Yarvik',
602
  'YD' => 'Yandex',
603
  'Y2' => 'Yes',
@@ -605,7 +646,9 @@ abstract class DeviceParserAbstract extends ParserAbstract
605
  'Y1' => 'Yu',
606
  'YU' => 'Yuandao',
607
  'YS' => 'Yusun',
 
608
  'YT' => 'Ytone',
 
609
  'ZE' => 'Zeemi',
610
  'ZK' => 'Zenek',
611
  'ZO' => 'Zonda',
65
  public static $deviceBrands = array(
66
  '3Q' => '3Q',
67
  '4G' => '4Good',
68
+ 'AE' => 'Ace',
69
  'AA' => 'AllCall',
70
  'AC' => 'Acer',
71
  'A9' => 'Advan',
78
  'AK' => 'Akai',
79
  '1A' => 'Alba',
80
  'AL' => 'Alcatel',
81
+ '4A' => 'Aligator',
82
+ '3A' => 'AllDocube',
83
  'A2' => 'Allview',
84
  'A7' => 'Allwinner',
85
  'A1' => 'Altech UEC',
86
  'A5' => 'altron',
87
  'AN' => 'Arnova',
88
+ '2A' => 'Atom',
89
  'KN' => 'Amazon',
90
  'AG' => 'AMGOO',
91
  'AO' => 'Amoi',
125
  'B2' => 'Blackview',
126
  'B4' => 'bogo',
127
  'BW' => 'Boway',
128
+ 'BZ' => 'Bezkam',
129
  'BX' => 'bq',
130
  'BV' => 'Bravis',
131
  'BR' => 'Brondi',
140
  'CE' => 'Celkon',
141
  'CC' => 'ConCorde',
142
  'C2' => 'Changhong',
143
+ '2C' => 'Ghong',
144
  'CH' => 'Cherry Mobile',
145
+ '1C' => 'Chuwi',
146
  'L8' => 'Clarmin',
147
  'CK' => 'Cricket',
148
  'C1' => 'Crosscall',
164
  'CX' => 'Crescent',
165
  'C4' => 'Cyrus',
166
  'CV' => 'CVTE',
167
+ 'D5' => 'Daewoo',
168
  'DA' => 'Danew',
169
  'DT' => 'Datang',
170
  'D1' => 'Datsun',
171
  'DE' => 'Denver',
172
+ 'DW' => 'DeWalt',
173
  'DX' => 'DEXP',
174
  'DS' => 'Desay',
175
  'DB' => 'Dbtel',
180
  'D3' => 'Digicel',
181
  'DD' => 'Digiland',
182
  'D2' => 'Digma',
183
+ 'D6' => 'Divisat',
184
  'DL' => 'Dell',
185
  'DN' => 'DNS',
186
  'DM' => 'DMM',
244
  'GG' => 'Gigabyte',
245
  'GS' => 'Gigaset',
246
  'GZ' => 'Ginzzu',
247
+ 'G4' => 'Globex',
248
  'GC' => 'GOCLEVER',
249
  'GL' => 'Goly',
250
  'GO' => 'Google',
290
  'IS' => 'Insignia',
291
  'I4' => 'Inoi',
292
  'IR' => 'iRola',
293
+ 'IU' => 'iRulu',
294
  'I6' => 'Irbis',
295
  'II' => 'Inkti',
296
  'IX' => 'Intex',
307
  'J5' => 'Just5',
308
  'KL' => 'Kalley',
309
  'K4' => 'Kaan',
310
+ 'K7' => 'Kaiomy',
311
+ 'K6' => 'Kanji',
312
  'KA' => 'Karbonn',
313
+ 'K5' => 'KATV1',
314
  'KD' => 'KDDI',
315
  'K1' => 'Kiano',
316
+ 'KV' => 'Kivi',
317
  'KI' => 'Kingsun',
318
  'KC' => 'Kocaso',
319
  'KG' => 'Kogan',
357
  'LX' => 'Lexibook',
358
  'LY' => 'LYF',
359
  'LU' => 'Lumus',
360
+ 'L9' => 'Luna',
361
  'MN' => 'M4tel',
362
  'MJ' => 'Majestic',
363
  'MA' => 'Manta Multimedia',
364
+ '5M' => 'Mann',
365
  '2M' => 'Masstel',
366
  'MW' => 'Maxwest',
367
+ '7M' => 'Maxcom',
368
  'M0' => 'Maze',
369
  'MB' => 'Mobistel',
370
  '0M' => 'Mecool',
402
  '1M' => 'MYFON',
403
  'MG' => 'MyWigo',
404
  'M8' => 'Myria',
405
+ '6M' => 'Mystery',
406
  'N3' => 'Navon',
407
+ 'N7' => 'National',
408
  'N5' => 'NOA',
409
  'NE' => 'NEC',
410
  'NF' => 'Neffos',
411
  'NA' => 'Netgear',
412
  'NU' => 'NeuImage',
413
  'NG' => 'NGM',
414
+ 'NZ' => 'NG Optics',
415
  'N6' => 'Nobby',
416
  'NO' => 'Nous',
417
  'NI' => 'Nintendo',
421
  'NV' => 'Nvidia',
422
  'NB' => 'Noblex',
423
  'NM' => 'Nomi',
424
+ 'N0' => 'Nuvo',
425
  'NL' => 'NUU Mobile',
426
  'NY' => 'NYX Mobile',
427
  'NN' => 'Nikon',
428
  'NW' => 'Newgen',
429
+ 'NS' => 'NewsMy',
430
  'NX' => 'Nexian',
431
  'NT' => 'NextBook',
432
  'O3' => 'O+',
439
  'OS' => 'Ordissimo',
440
  'OT' => 'O2',
441
  'OK' => 'Ouki',
442
+ 'OE' => 'Oukitel',
443
  'OU' => 'OUYA',
444
  'OO' => 'Opsson',
445
  'OV' => 'Overmax',
458
  'PL' => 'Polaroid',
459
  'P5' => 'Polytron',
460
  'P9' => 'Primepad',
461
+ 'P6' => 'Proline',
462
  'PM' => 'Palm',
463
  'PO' => 'phoneOne',
464
  'PT' => 'Pantech',
478
  'QM' => 'QMobile',
479
  'QA' => 'Quantum',
480
  'QU' => 'Quechua',
481
+ 'QO' => 'Qumo',
482
  'RA' => 'Ramos',
483
  'RC' => 'RCA Tablets',
484
  'RB' => 'Readboy',
494
  'R3' => 'Rombica',
495
  'RT' => 'RT Project',
496
  'RX' => 'Ritmix',
497
+ 'R7' => 'Ritzviva',
498
  'R5' => 'Ross&Moor',
499
  'R2' => 'R-TV',
500
+ 'RG' => 'RugGear',
501
+ 'RU' => 'Runbo',
502
+ 'SQ' => 'Santin',
503
  'SA' => 'Samsung',
504
  'S0' => 'Sanei',
505
  'SD' => 'Sega',
510
  'SX' => 'SFR',
511
  'SG' => 'Sagem',
512
  'SH' => 'Sharp',
513
+ '7S' => 'Shift Phones',
514
  '3S' => 'Shuttle',
515
  'SI' => 'Siemens',
516
  'SJ' => 'Silent Circle',
524
  'SO' => 'Sony',
525
  'OI' => 'Sonim',
526
  'SP' => 'Spice',
527
+ '6S' => 'Spectrum',
528
+ '5S' => 'Sunvell',
529
  'SU' => 'SuperSonic',
530
  'S5' => 'Supra',
531
  'SV' => 'Selevision',
581
  'TZ' => 'teXet',
582
  'UC' => 'U.S. Cellular',
583
  'UH' => 'Uhappy',
584
+ 'UG' => 'Ugoos',
585
  'UL' => 'Ulefone',
586
  'UO' => 'Unnecto',
587
  'UN' => 'Unowhy',
590
  'UM' => 'UMIDIGI',
591
  'UU' => 'Unonu',
592
  'UK' => 'UTOK',
593
+ 'UA' => 'Umax',
594
  'UT' => 'UTStarcom',
595
+ 'UZ' => 'Unihertz',
596
  'VA' => 'Vastking',
597
  'VD' => 'Videocon',
598
  'VE' => 'Vertu',
599
  'VN' => 'Venso',
600
  'V5' => 'Vivax',
601
  'VI' => 'Vitelcom',
602
+ 'V7' => 'Vinga',
603
  'VK' => 'VK Mobile',
604
  'VS' => 'ViewSonic',
605
+ 'V9' => 'Vsun',
606
+ 'V8' => 'Vesta',
607
  'VT' => 'Vestel',
608
  'VR' => 'Vernee',
609
  'V4' => 'Verizon',
627
  'WE' => 'WellcoM',
628
  'WY' => 'Wexler',
629
  'WI' => 'Wiko',
630
+ 'WP' => 'Wieppo',
631
  'WL' => 'Wolder',
632
  'WG' => 'Wolfgang',
633
  'WO' => 'Wonu',
638
  'XL' => 'Xiaolajiao',
639
  'XN' => 'Xion',
640
  'XO' => 'Xolo',
641
+ 'XR' => 'Xoro',
642
  'YA' => 'Yarvik',
643
  'YD' => 'Yandex',
644
  'Y2' => 'Yes',
646
  'Y1' => 'Yu',
647
  'YU' => 'Yuandao',
648
  'YS' => 'Yusun',
649
+ 'YO' => 'Yota',
650
  'YT' => 'Ytone',
651
+ 'YX' => 'Yxtel',
652
  'ZE' => 'Zeemi',
653
  'ZK' => 'Zenek',
654
  'ZO' => 'Zonda',
app/vendor/piwik/device-detector/README.md CHANGED
@@ -9,7 +9,6 @@ DeviceDetector
9
  ## Code Status
10
 
11
  [![Build Status](https://travis-ci.org/matomo-org/device-detector.svg?branch=master)](https://travis-ci.org/matomo-org/device-detector)
12
- [![Code Coverage](https://coveralls.io/repos/piwik/device-detector/badge.png)](https://coveralls.io/r/piwik/device-detector)
13
  [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/matomo-org/device-detector.svg)](http://isitmaintained.com/project/matomo-org/device-detector "Average time to resolve an issue")
14
  [![Percentage of issues still open](http://isitmaintained.com/badge/open/matomo-org/device-detector.svg)](http://isitmaintained.com/project/matomo-org/device-detector "Percentage of issues still open")
15
 
@@ -185,19 +184,21 @@ php composer.phar install
185
 
186
  There are already a few ports of this tool to other languages:
187
 
 
188
  - **.NET** https://github.com/totpero/DeviceDetector.NET
189
  - **Ruby** https://github.com/podigee/device_detector
190
- - **Javascript/Node.js** https://github.com/etienne-martin/device-detector-js
191
  - **Python 3** https://github.com/thinkwelltwd/device_detector
192
  - **Crystal** https://github.com/creadone/device_detector
193
  - **Elixir** https://github.com/elixir-inspector/ua_inspector
 
194
 
195
 
196
  ## What Device Detector is able to detect
197
 
198
  The lists below are auto generated and updated from time to time. Some of them might not be complete.
199
 
200
- *Last update: 2020/01/13*
201
 
202
  ### List of detected operating systems:
203
 
@@ -205,7 +206,7 @@ AIX, Android, AmigaOS, Apple TV, Arch Linux, BackTrack, Bada, BeOS, BlackBerry O
205
 
206
  ### List of detected browsers:
207
 
208
- 2345 Browser, 360 Phone Browser, 360 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Shield, Arora, Amiga Voyager, Amiga Aweb, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Brave, BriskBard, BrowseX, Camino, CCleaner, Coc Coc, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, ChromePlus, Chromium, Cyberfox, Cheshire, Crusta, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, Delta Browser, Dolphin, Dorado, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Firefox Mobile, Fireweb, Fireweb Navigator, FreeU, Galeon, Google Earth, Hawk Turbo Browser, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Jasmine, Jig Browser, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Links, Lovense Browser, LuaKit, Lunascape, Lynx, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odyssey Web Browser, Off By One, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Ordissimo, Oregano, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Phoenix, Polaris, Polarity, Microsoft Edge, QQ Browser Mini, QQ Browser, Qutebrowser, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, SEMC-Browser, Sogou Explorer, Safari, SalamWeb, Shiira, SimpleBrowser, Skyfire, Seraphic Sraf, Sleipnir, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, START Internet Browser, Streamy, Swiftfox, Seznam Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, TweakStyle, UBrowser, UC Browser, UC Browser Mini, UC Browser Turbo, Uzbl, Vivaldi, vivo Browser, Vision Mobile Browser, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yandex Browser, Yandex Browser Lite, Xiino
209
 
210
  ### List of detected browser engines:
211
 
@@ -213,7 +214,7 @@ WebKit, Blink, Trident, Text-based, Dillo, iCab, Elektra, Presto, Gecko, KHTML,
213
 
214
  ### List of detected libraries:
215
 
216
- aiohttp, curl, Faraday, Go-http-client, Google HTTP Java Client, Guzzle (PHP HTTP Client), HTTPie, HTTP_Request2, Java, libdnf, Mechanize, OkHttp, Perl, Python Requests, Python urllib, REST Client for Ruby, RestSharp, urlgrabber (yum), Wget, WWW-Mechanize
217
 
218
  ### List of detected media players:
219
 
@@ -221,7 +222,7 @@ Audacious, Banshee, Boxee, Clementine, Deezer, FlyCast, Foobar2000, Google Podca
221
 
222
  ### List of detected mobile apps:
223
 
224
- AndroidDownloadManager, AntennaPod, Apple News, Baidu Box App, BeyondPod, BingWebApp, bPod, CastBox, Castro, Castro 2, CrosswalkApp, DoggCatcher, douban App, Facebook, Facebook Messenger, FeedR, Flipboard App, Google Go, Google Play Newsstand, Google Plus, Google Search App, iCatcher, Instacast, Instagram App, Line, NewsArticle App, Overcast, Pinterest, Player FM, Pocket Casts, Podcast & Radio Addict, Podcast Republic, Podcasts, Podcat, Podcatcher Deluxe, Podkicker, RSSRadio, Sina Weibo, SogouSearch App, tieba, WeChat, WhatsApp, Yahoo! Japan, Yelp Mobile, YouTube and *mobile apps using [AFNetworking](https://github.com/AFNetworking/AFNetworking)*
225
 
226
  ### List of detected PIMs (personal information manager):
227
 
@@ -233,8 +234,8 @@ Akregator, Apple PubSub, BashPodder, Breaker, Downcast, FeedDemon, Feeddler RSS
233
 
234
  ### List of brands with detected devices:
235
 
236
- 3Q, 4Good, Acer, Advan, Advance, AGM, Ainol, Airness, Airties, AIS, Aiwa, Akai, Alba, Alcatel, AllCall, Allview, Allwinner, Altech UEC, altron, Amazon, AMGOO, Amoi, ANS, Apple, Archos, Arian Space, Ark, Arnova, ARRIS, Ask, Assistant, Asus, Audiovox, AVH, Avvio, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BDF, Becker, Beeline, Beetel, BenQ, BenQ-Siemens, BGH, Bird, Bitel, Black Fox, Blackview, Blaupunkt, Blu, Bluboo, Bluegood, Bmobile, bogo, Boway, bq, Bravis, Brondi, Bush, CAGI, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Celkon, Changhong, Cherry Mobile, China Mobile, Clarmin, CnM, Coby Kyros, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Coolpad, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crosscall, Cube, CUBOT, CVTE, Cyrus, Danew, Datang, Datsun, Dbtel, Dell, Denver, Desay, DEXP, Dialog, Dicam, Digi, Digicel, Digiland, Digma, DMM, DNS, DoCoMo, Doogee, Doov, Dopod, Doro, Dune HD, E-Boda, E-tel, Easypix, EBEST, Echo Mobiles, ECS, EE, EKO, Eks Mobility, Elenberg, Elephone, Energizer, Energy Sistem, Ergo, Ericsson, Ericy, Essential, Essentielb, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, Explay, Extrem, Ezio, Ezze, Fairphone, Famoco, Fengxiang, FiGO, FinePower, Fly, FNB, Fondi, FORME, Forstar, Foxconn, Freetel, Fujitsu, G-TiDE, Garmin-Asus, Gateway, Gemini, General Mobile, Geotel, Ghia, Gigabyte, Gigaset, Ginzzu, Gionee, GOCLEVER, Goly, GoMobile, Google, Gradiente, Grape, Grundig, Hafury, Haier, HannSpree, Hasee, Hi-Level, Highscreen, Hisense, Hoffmann, Homtom, Hoozo, Hosin, HP, HTC, Huawei, Humax, Hyrican, Hyundai, i-Joy, i-mate, i-mobile, iBall, iBerry, IconBIT, iHunt, Ikea, iKoMo, iLA, IMO Mobile, Impression, iNew, Infinix, InFocus, Inkti, InnJoo, Innostream, Inoi, INQ, Insignia, Intek, Intex, Inverto, iOcean, iPro, Irbis, iRola, iTel, iView, iZotron, JAY-Tech, Jiayu, Jolla, Just5, K-Touch, Kaan, Kalley, Karbonn, Kazam, KDDI, Kempler & Strauss, Keneksi, Kiano, Kingsun, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, KOPO, Koridy, KRONO, Krüger&Matz, KT-Tech, Kumai, Kyocera, LAIQ, Land Rover, Landvo, Lanix, Lark, Lava, LCT, Leagoo, Ledstar, LeEco, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lexand, Lexibook, LG, Lingwin, Loewe, Logicom, Lumus, LYF, M.T.T., M4tel, Majestic, Manta Multimedia, Masstel, Maxwest, Maze, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Memup, Metz, MEU, MicroMax, Microsoft, Mio, Miray, Mitsubishi, MIXC, MLLED, Mobicel, Mobiistar, Mobiola, Mobistel, Modecom, Mofut, Motorola, Movic, Mpman, MSI, MTC, MTN, MYFON, MyPhone, Myria, MyWigo, Navon, NEC, Neffos, Netgear, NeuImage, Newgen, NEXBOX, Nexian, Nextbit, NextBook, NGM, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, Nokia, Nomi, Nous, NUU Mobile, Nvidia, NYX Mobile, O+, O2, Obi, Odys, Onda, OnePlus, OPPO, Opsson, Orange, Ordissimo, Ouki, OUYA, Overmax, Oysters, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pentagram, Philips, phoneOne, Pioneer, Pixus, Ployer, Plum, Point of View, Polaroid, PolyPad, Polytron, Pomp, Positivo, PPTV, Prestigio, Primepad, ProScan, PULID, Q-Touch, Qilive, QMobile, Qtek, Quantum, Quechua, R-TV, Ramos, RCA Tablets, Readboy, Rikomagic, RIM, Rinno, Ritmix, Riviera, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RT Project, Safaricom, Sagem, Samsung, Sanei, Santin BiTBiZ, Sanyo, Savio, Sega, Selevision, Selfix, Sencor, Sendo, Senseit, Senwa, SFR, Sharp, Shuttle, Siemens, Sigma, Silent Circle, Simbans, Sky, Skyworth, Smart, Smartfren, Smartisan, Softbank, Sonim, Sony, Sony Ericsson, Spice, Star, Starway, STF Mobile, STK, Stonex, Storex, Sumvision, SunVan, SuperSonic, Supra, SWISSMOBILITY, Symphony, Syrox, T-Mobile, TB Touch, TCL, TechniSat, TechnoTrend, TechPad, Teclast, Tecno Mobile, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, teXet, ThL, Thomson, TIANYU, Timovi, TiPhone, Tolino, Tooky, Top House, Toplux, Toshiba, Touchmate, TrekStor, Trevi, True, Tunisie Telecom, Turbo, Turbo-X, TVC, U.S. Cellular, Uhappy, Ulefone, UMIDIGI, Unimax, Uniscope, Unknown, Unnecto, Unonu, Unowhy, UTOK, UTStarcom, Vastking, Venso, Verizon, Vernee, Vertex, Vertu, Verykool, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinsoc, Vitelcom, Vivax, Vivo, Vizio, VK Mobile, Vodafone, Vonino, Vorago, Voto, Voxtel, Vulcan, Walton, Web TV, Weimei, WellcoM, Wexler, Wiko, Wileyfox, Wink, Wolder, Wolfgang, Wonu, Woo, Woxter, X-TIGI, X-View, Xiaolajiao, Xiaomi, Xion, Xolo, Yandex, Yarvik, Yes, Yezz, Ytone, Yu, Yuandao, Yusun, Zeemi, Zen, Zenek, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn
237
 
238
  ### List of detected bots:
239
 
240
- 360Spider, Aboundexbot, Acoon, AddThis.com, ADMantX, aHrefs Bot, Alexa Crawler, Alexa Site Audit, Amazon Route53 Health Check, Amorank Spider, Analytics SEO Crawler, ApacheBench, Applebot, Arachni, archive.org bot, Ask Jeeves, Awario, Awario, Backlink-Check.de, BacklinkCrawler, Baidu Spider, BazQux Reader, BingBot, BitlyBot, Blekkobot, BLEXBot Crawler, Bloglovin, Blogtrottr, BoardReader, BoardReader Blog Indexer, Bountii Bot, BrandVerity, Browsershots, BUbiNG, Buck, Butterfly Robot, Bytespider, CareerBot, Castro 2, Catchpoint, CATExplorador, ccBot crawler, Charlotte, Cliqzbot, CloudFlare Always Online, CloudFlare AMP Fetcher, Collectd, CommaFeed, CSS Certificate Spider, Cốc Cốc Bot, Datadog Agent, Datanyze, Dataprovider, Daum, Dazoobot, Discobot, Domain Re-Animator Bot, DotBot, DuckDuckGo Bot, Easou Spider, eCairn-Grabber, EMail Exractor, EmailWolf, Embedly, evc-batch, ExaBot, ExactSeek Crawler, Ezooms, eZ Publish Link Validator, Facebook External Hit, Feedbin, FeedBurner, Feedly, Feedspot, Feed Wrangler, Fever, Findxbot, Flipboard, FreshRSS, Generic Bot, Generic Bot, Genieo Web filter, Gigablast, Gigabot, Gluten Free Crawler, Gmail Image Proxy, Goo, Googlebot, Google Favicon, Google PageSpeed Insights, Google Partner Monitoring, Google Search Console, Google Structured Data Testing Tool, Grapeshot, Heritrix, Heureka Feed, HTTPMon, HubPages, HubSpot, ICC-Crawler, ichiro, IDG/IT, IIS Site Analysis, Inktomi Slurp, inoreader, IP-Guide Crawler, IPS Agent, Kaspersky, Kouio, Larbin web crawler, LCC, Let's Encrypt Validation, Lighthouse, Linkdex Bot, LinkedIn Bot, LTX71, Lycos, Magpie-Crawler, MagpieRSS, Mail.Ru Bot, masscan, Mastodon Bot, Meanpath Bot, MetaInspector, MetaJobBot, Mixrank Bot, MJ12 Bot, Mnogosearch, MojeekBot, Monitor.Us, Munin, Nagios check_http, NalezenCzBot, nbertaupete95, Netcraft Survey Bot, netEstate, NetLyzer FastProbe, NetResearchServer, Netvibes, NewsBlur, NewsGator, NLCrawler, Nmap, Nutch-based Bot, Nuzzel, oBot, Octopus, Omgili bot, Openindex Spider, OpenLinkProfiler, OpenWebSpider, Orange Bot, Outbrain, PagePeeker, PaperLiBot, Phantomas, PHP Server Monitor, Picsearch bot, Pingdom Bot, Pinterest, PocketParser, Pompos, PritTorrent, QuerySeekerSpider, Quora Link Preview, Qwantify, Rainmeter, RamblerMail Image Proxy, Reddit Bot, Riddler, Rogerbot, ROI Hunter, RSSRadio Bot, SafeDNSBot, Scooter, ScoutJet, Scrapy, Screaming Frog SEO Spider, ScreenerBot, Semrush Bot, Sensika Bot, Sentry Bot, SEOENGBot, SEOkicks-Robot, Seoscanners.net, Server Density, Seznam Bot, Seznam Email Proxy, Seznam Zbozi.cz, ShopAlike, Shopify Partner, ShopWiki, SilverReader, SimplePie, SISTRIX Crawler, SISTRIX Optimizer, Site24x7 Website Monitoring, Siteimprove, SiteSucker, Sixy.ch, Skype URI Preview, Slackbot, SMTBot, Snapchat Proxy, Sogou Spider, Soso Spider, Sparkler, Speedy, Spinn3r, Spotify, Sputnik Bot, sqlmap, SSL Labs, Startpagina Linkchecker, StatusCake, Superfeedr Bot, Survey Bot, Tarmot Gezgin, TelegramBot, The Knowledge AI, theoldreader, TinEye Crawler, Tiny Tiny RSS, TLSProbe, TraceMyFile, Trendiction Bot, TurnitinBot, TweetedTimes Bot, Tweetmeme Bot, Twingly Recon, Twitterbot, UkrNet Mail Proxy, UniversalFeedParser, Uptimebot, Uptime Robot, URLAppendBot, Vagabondo, Visual Site Mapper Crawler, VK Share Button, W3C CSS Validator, W3C I18N Checker, W3C Link Checker, W3C Markup Validation Service, W3C MobileOK Checker, W3C Unified Validator, Wappalyzer, WebbCrawler, Weborama, WebPageTest, WebSitePulse, WebThumbnail, WeSEE:Search, WikiDo, Willow Internet Crawler, WooRank, WordPress, Wotbox, YaCy, Yahoo! Cache System, Yahoo! Japan BRW, Yahoo! Link Preview, Yahoo! Slurp, Yahoo Gemini, Yandex Bot, Yeti/Naverbot, Yottaa Site Monitor, Youdao Bot, Yourls, Yunyun Bot, Zao, Ze List, zgrab, Zookabot, ZumBot
9
  ## Code Status
10
 
11
  [![Build Status](https://travis-ci.org/matomo-org/device-detector.svg?branch=master)](https://travis-ci.org/matomo-org/device-detector)
 
12
  [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/matomo-org/device-detector.svg)](http://isitmaintained.com/project/matomo-org/device-detector "Average time to resolve an issue")
13
  [![Percentage of issues still open](http://isitmaintained.com/badge/open/matomo-org/device-detector.svg)](http://isitmaintained.com/project/matomo-org/device-detector "Percentage of issues still open")
14
 
184
 
185
  There are already a few ports of this tool to other languages:
186
 
187
+ - **.NET** https://github.com/AgileFlexAgency/MatomoDeviceDetector.NET
188
  - **.NET** https://github.com/totpero/DeviceDetector.NET
189
  - **Ruby** https://github.com/podigee/device_detector
190
+ - **JavaScript/TypeScript/NodeJS** https://github.com/etienne-martin/device-detector-js
191
  - **Python 3** https://github.com/thinkwelltwd/device_detector
192
  - **Crystal** https://github.com/creadone/device_detector
193
  - **Elixir** https://github.com/elixir-inspector/ua_inspector
194
+ - **Java** https://github.com/mngsk/device-detector
195
 
196
 
197
  ## What Device Detector is able to detect
198
 
199
  The lists below are auto generated and updated from time to time. Some of them might not be complete.
200
 
201
+ *Last update: 2020/03/31*
202
 
203
  ### List of detected operating systems:
204
 
206
 
207
  ### List of detected browsers:
208
 
209
+ 2345 Browser, 360 Phone Browser, 360 Browser, Avant Browser, ABrowse, ANT Fresco, ANTGalio, Aloha Browser, Aloha Browser Lite, Amaya, Amigo, Android Browser, AOL Shield, Arora, Amiga Voyager, Amiga Aweb, Atomic Web Browser, Avast Secure Browser, AVG Secure Browser, Beaker Browser, Beamrise, BlackBerry Browser, Baidu Browser, Baidu Spark, Basilisk, Beonex, BlackHawk, Bunjalloo, B-Line, Brave, BriskBard, BrowseX, Camino, CCleaner, Coc Coc, Comodo Dragon, Coast, Charon, CM Browser, Chrome Frame, Headless Chrome, Chrome, Chrome Mobile iOS, Conkeror, Chrome Mobile, CoolNovo, CometBird, COS Browser, ChromePlus, Chromium, Cyberfox, Cheshire, Crusta, Cunaguaro, Chrome Webview, dbrowser, Deepnet Explorer, Delta Browser, Dolphin, Dorado, Dooble, Dillo, DuckDuckGo Privacy Browser, Ecosia, Epic, Elinks, Element Browser, eZ Browser, EUI Browser, GNOME Web, Espial TV Browser, Falkon, Faux Browser, Firefox Mobile iOS, Firebird, Fluid, Fennec, Firefox, Firefox Focus, Firefox Reality, Firefox Rocket, Flock, Firefox Mobile, Fireweb, Fireweb Navigator, FreeU, Galeon, Google Earth, Hawk Turbo Browser, hola! Browser, HotJava, Huawei Browser, IBrowse, iCab, iCab Mobile, Iridium, Iron Mobile, IceCat, IceDragon, Isivioo, Iceweasel, Internet Explorer, IE Mobile, Iron, Jasmine, Jig Browser, Jio Browser, K.Browser, Kindle Browser, K-meleon, Konqueror, Kapiko, Kinza, Kiwi, Kylo, Kazehakase, Cheetah Browser, LieBaoFast, LG Browser, Links, Lovense Browser, LuaKit, Lunascape, Lynx, mCent, MicroB, NCSA Mosaic, Meizu Browser, Mercury, Mobile Safari, Midori, Mobicip, MIUI Browser, Mobile Silk, Minimo, Mint Browser, Maxthon, Nokia Browser, Nokia OSS Browser, Nokia Ovi Browser, Nox Browser, NetSurf, NetFront, NetFront Life, NetPositive, Netscape, NTENT Browser, Oculus Browser, Opera Mini iOS, Obigo, Odyssey Web Browser, Off By One, ONE Browser, Opera GX, Opera Neon, Opera Devices, Opera Mini, Opera Mobile, Opera, Opera Next, Opera Touch, Ordissimo, Oregano, Origyn Web Browser, Openwave Mobile Browser, OmniWeb, Otter Browser, Palm Blazer, Pale Moon, Oppo Browser, Palm Pre, Puffin, Palm WebPro, Palmscape, Phoenix, Polaris, Polarity, Microsoft Edge, QQ Browser Mini, QQ Browser, Qutebrowser, QupZilla, Qwant Mobile, QtWebEngine, Realme Browser, Rekonq, RockMelt, Samsung Browser, Sailfish Browser, SEMC-Browser, Sogou Explorer, Safari, SalamWeb, Shiira, SimpleBrowser, Skyfire, Seraphic Sraf, Sleipnir, Snowshoe, Sogou Mobile Browser, Splash, Sputnik Browser, Sunrise, SuperBird, Super Fast Browser, START Internet Browser, Streamy, Swiftfox, Seznam Browser, t-online.de Browser, Tao Browser, TenFourFox, Tenta Browser, Tizen Browser, TweakStyle, TV Bro, UBrowser, UC Browser, UC Browser Mini, UC Browser Turbo, Uzbl, Vivaldi, vivo Browser, Vision Mobile Browser, Wear Internet Browser, Web Explorer, WebPositive, Waterfox, Whale Browser, wOSBrowser, WeTab Browser, Yandex Browser, Yandex Browser Lite, Xiino
210
 
211
  ### List of detected browser engines:
212
 
214
 
215
  ### List of detected libraries:
216
 
217
+ aiohttp, curl, Faraday, Go-http-client, Google HTTP Java Client, Guzzle (PHP HTTP Client), HTTPie, HTTP_Request2, Java, libdnf, Mechanize, Node Fetch, OkHttp, Perl, Perl REST::Client, Python Requests, Python urllib, REST Client for Ruby, RestSharp, ScalaJ HTTP, urlgrabber (yum), Wget, WWW-Mechanize
218
 
219
  ### List of detected media players:
220
 
222
 
223
  ### List of detected mobile apps:
224
 
225
+ AndroidDownloadManager, AntennaPod, Apple News, Baidu Box App, BeyondPod, BingWebApp, bPod, CastBox, Castro, Castro 2, CrosswalkApp, DoggCatcher, douban App, Facebook, Facebook Messenger, FeedR, Flipboard App, Google Go, Google Play Newsstand, Google Plus, Google Search App, iCatcher, Instacast, Instagram App, Line, NewsArticle App, Overcast, Pinterest, Player FM, Pocket Casts, Podcast & Radio Addict, Podcast Republic, Podcasts, Podcat, Podcatcher Deluxe, Podkicker, RSSRadio, Sina Weibo, SogouSearch App, tieba, WeChat, WhatsApp, Yahoo! Japan, Yelp Mobile, YouTube and *mobile apps using [AFNetworking](https://github.com/AFNetworking/AFNetworking)*
226
 
227
  ### List of detected PIMs (personal information manager):
228
 
234
 
235
  ### List of brands with detected devices:
236
 
237
+ 3Q, 4Good, Ace, Acer, Advan, Advance, AGM, Ainol, Airness, Airties, AIS, Aiwa, Akai, Alba, Alcatel, Aligator, AllCall, AllDocube, Allview, Allwinner, Altech UEC, altron, Amazon, AMGOO, Amoi, ANS, Apple, Archos, Arian Space, Ark, Arnova, ARRIS, Ask, Assistant, Asus, Atom, Audiovox, AVH, Avvio, Axxion, Azumi Mobile, BangOlufsen, Barnes & Noble, BBK, BDF, Becker, Beeline, Beetel, BenQ, BenQ-Siemens, Bezkam, BGH, Bird, Bitel, Black Fox, Blackview, Blaupunkt, Blu, Bluboo, Bluegood, Bmobile, bogo, Boway, bq, Bravis, Brondi, Bush, CAGI, Capitel, Captiva, Carrefour, Casio, Casper, Cat, Celkon, Changhong, Cherry Mobile, China Mobile, Chuwi, Clarmin, CnM, Coby Kyros, Comio, Compal, Compaq, ComTrade Tesla, Concord, ConCorde, Condor, Coolpad, Cowon, CreNova, Crescent, Cricket, Crius Mea, Crosscall, Cube, CUBOT, CVTE, Cyrus, Daewoo, Danew, Datang, Datsun, Dbtel, Dell, Denver, Desay, DeWalt, DEXP, Dialog, Dicam, Digi, Digicel, Digiland, Digma, Divisat, DMM, DNS, DoCoMo, Doogee, Doov, Dopod, Doro, Dune HD, E-Boda, E-tel, Easypix, EBEST, Echo Mobiles, ECS, EE, EKO, Eks Mobility, Elenberg, Elephone, Energizer, Energy Sistem, Ergo, Ericsson, Ericy, Essential, Essentielb, Eton, eTouch, Etuline, Eurostar, Evercoss, Evertek, Evolio, Evolveo, EvroMedia, Explay, Extrem, Ezio, Ezze, Fairphone, Famoco, Fengxiang, FiGO, FinePower, Fly, FNB, Fondi, FORME, Forstar, Foxconn, Freetel, Fujitsu, G-TiDE, Garmin-Asus, Gateway, Gemini, General Mobile, Geotel, Ghia, Ghong, Gigabyte, Gigaset, Ginzzu, Gionee, Globex, GOCLEVER, Goly, GoMobile, Google, Gradiente, Grape, Grundig, Hafury, Haier, HannSpree, Hasee, Hi-Level, Highscreen, Hisense, Hoffmann, Homtom, Hoozo, Hosin, HP, HTC, Huawei, Humax, Hyrican, Hyundai, i-Joy, i-mate, i-mobile, iBall, iBerry, IconBIT, iHunt, Ikea, iKoMo, iLA, IMO Mobile, Impression, iNew, Infinix, InFocus, Inkti, InnJoo, Innostream, Inoi, INQ, Insignia, Intek, Intex, Inverto, iOcean, iPro, Irbis, iRola, iRulu, iTel, iView, iZotron, JAY-Tech, Jiayu, Jolla, Just5, K-Touch, Kaan, Kaiomy, Kalley, Kanji, Karbonn, KATV1, Kazam, KDDI, Kempler & Strauss, Keneksi, Kiano, Kingsun, Kivi, Kocaso, Kodak, Kogan, Komu, Konka, Konrow, Koobee, KOPO, Koridy, KRONO, Krüger&Matz, KT-Tech, Kumai, Kyocera, LAIQ, Land Rover, Landvo, Lanix, Lark, Lava, LCT, Leagoo, Ledstar, LeEco, Lemhoov, Lenco, Lenovo, Leotec, Le Pan, Lephone, Lexand, Lexibook, LG, Lingwin, Loewe, Logicom, Lumus, Luna, LYF, M.T.T., M4tel, Majestic, Mann, Manta Multimedia, Masstel, Maxcom, Maxwest, Maze, Mecer, Mecool, Mediacom, MediaTek, Medion, MEEG, MegaFon, Meitu, Meizu, Memup, Metz, MEU, MicroMax, Microsoft, Mio, Miray, Mitsubishi, MIXC, MLLED, Mobicel, Mobiistar, Mobiola, Mobistel, Modecom, Mofut, Motorola, Movic, Mpman, MSI, MTC, MTN, MYFON, MyPhone, Myria, Mystery, MyWigo, National, Navon, NEC, Neffos, Netgear, NeuImage, Newgen, NewsMy, NEXBOX, Nexian, Nextbit, NextBook, NGM, NG Optics, Nikon, Nintendo, NOA, Noain, Nobby, Noblex, Nokia, Nomi, Nous, NUU Mobile, Nuvo, Nvidia, NYX Mobile, O+, O2, Obi, Odys, Onda, OnePlus, OPPO, Opsson, Orange, Ordissimo, Ouki, Oukitel, OUYA, Overmax, Oysters, Palm, Panacom, Panasonic, Pantech, PCBOX, PCD, PCD Argentina, PEAQ, Pentagram, Philips, phoneOne, Pioneer, Pixus, Ployer, Plum, Point of View, Polaroid, PolyPad, Polytron, Pomp, Positivo, PPTV, Prestigio, Primepad, Proline, ProScan, PULID, Q-Touch, Qilive, QMobile, Qtek, Quantum, Quechua, Qumo, R-TV, Ramos, RCA Tablets, Readboy, Rikomagic, RIM, Rinno, Ritmix, Ritzviva, Riviera, Roadrover, Rokit, Roku, Rombica, Ross&Moor, Rover, RoverPad, RT Project, RugGear, Runbo, Safaricom, Sagem, Samsung, Sanei, Santin, Sanyo, Savio, Sega, Selevision, Selfix, Sencor, Sendo, Senseit, Senwa, SFR, Sharp, Shift Phones, Shuttle, Siemens, Sigma, Silent Circle, Simbans, Sky, Skyworth, Smart, Smartfren, Smartisan, Softbank, Sonim, Sony, Sony Ericsson, Spectrum, Spice, Star, Starway, STF Mobile, STK, Stonex, Storex, Sumvision, SunVan, Sunvell, SuperSonic, Supra, SWISSMOBILITY, Symphony, Syrox, T-Mobile, TB Touch, TCL, TechniSat, TechnoTrend, TechPad, Teclast, Tecno Mobile, Telefunken, Telego, Telenor, Telit, Tesco, Tesla, teXet, ThL, Thomson, TIANYU, Timovi, TiPhone, Tolino, Tooky, Top House, Toplux, Toshiba, Touchmate, TrekStor, Trevi, True, Tunisie Telecom, Turbo, Turbo-X, TVC, U.S. Cellular, Ugoos, Uhappy, Ulefone, Umax, UMIDIGI, Unihertz, Unimax, Uniscope, Unknown, Unnecto, Unonu, Unowhy, UTOK, UTStarcom, Vastking, Venso, Verizon, Vernee, Vertex, Vertu, Verykool, Vesta, Vestel, VGO TEL, Videocon, Videoweb, ViewSonic, Vinga, Vinsoc, Vitelcom, Vivax, Vivo, Vizio, VK Mobile, Vodafone, Vonino, Vorago, Voto, Voxtel, Vsun, Vulcan, Walton, Web TV, Weimei, WellcoM, Wexler, Wieppo, Wiko, Wileyfox, Wink, Wolder, Wolfgang, Wonu, Woo, Woxter, X-TIGI, X-View, Xiaolajiao, Xiaomi, Xion, Xolo, Xoro, Yandex, Yarvik, Yes, Yezz, Yota, Ytone, Yu, Yuandao, Yusun, Yxtel, Zeemi, Zen, Zenek, Zonda, Zopo, ZTE, Zuum, Zync, ZYQ, öwn
238
 
239
  ### List of detected bots:
240
 
241
+ 360Spider, Aboundexbot, Acoon, AddThis.com, ADMantX, aHrefs Bot, Alexa Crawler, Alexa Site Audit, Amazon Route53 Health Check, Amorank Spider, Analytics SEO Crawler, ApacheBench, Applebot, Arachni, archive.org bot, Ask Jeeves, Awario, Awario, Backlink-Check.de, BacklinkCrawler, Baidu Spider, BazQux Reader, BingBot, BitlyBot, Blekkobot, BLEXBot Crawler, Bloglovin, Blogtrottr, BoardReader, BoardReader Blog Indexer, Bountii Bot, BrandVerity, Browsershots, BUbiNG, Buck, Butterfly Robot, Bytespider, CareerBot, Castro 2, Catchpoint, CATExplorador, ccBot crawler, Charlotte, Cliqzbot, CloudFlare Always Online, CloudFlare AMP Fetcher, Collectd, CommaFeed, CSS Certificate Spider, Cốc Cốc Bot, Datadog Agent, Datanyze, Dataprovider, Daum, Dazoobot, Discobot, Domain Re-Animator Bot, DotBot, DuckDuckGo Bot, Easou Spider, eCairn-Grabber, EMail Exractor, EmailWolf, Embedly, evc-batch, ExaBot, ExactSeek Crawler, Ezooms, eZ Publish Link Validator, Facebook External Hit, Feedbin, FeedBurner, Feedly, Feedspot, Feed Wrangler, Fever, Findxbot, Flipboard, FreshRSS, Generic Bot, Generic Bot, Genieo Web filter, Gigablast, Gigabot, Gluten Free Crawler, Gmail Image Proxy, Goo, Googlebot, Google Cloud Scheduler, Google Favicon, Google PageSpeed Insights, Google Partner Monitoring, Google Search Console, Google Stackdriver Monitoring, Google Structured Data Testing Tool, Grapeshot, Heritrix, Heureka Feed, HTTPMon, HubPages, HubSpot, ICC-Crawler, ichiro, IDG/IT, IIS Site Analysis, Inktomi Slurp, inoreader, IP-Guide Crawler, IPS Agent, Kaspersky, Kouio, Larbin web crawler, LCC, Let's Encrypt Validation, Lighthouse, Linkdex Bot, LinkedIn Bot, LTX71, Lycos, Magpie-Crawler, MagpieRSS, Mail.Ru Bot, masscan, Mastodon Bot, Meanpath Bot, MetaInspector, MetaJobBot, Mixrank Bot, MJ12 Bot, Mnogosearch, MojeekBot, Monitor.Us, Munin, Nagios check_http, NalezenCzBot, nbertaupete95, Netcraft Survey Bot, netEstate, NetLyzer FastProbe, NetResearchServer, Netvibes, NewsBlur, NewsGator, NLCrawler, Nmap, Nutch-based Bot, Nuzzel, oBot, Octopus, Omgili bot, Openindex Spider, OpenLinkProfiler, OpenWebSpider, Orange Bot, Outbrain, PagePeeker, PaperLiBot, Phantomas, PHP Server Monitor, Picsearch bot, Pingdom Bot, Pinterest, PocketParser, Pompos, PritTorrent, QuerySeekerSpider, Quora Link Preview, Qwantify, Rainmeter, RamblerMail Image Proxy, Reddit Bot, Riddler, Rogerbot, ROI Hunter, RSSRadio Bot, SafeDNSBot, Scooter, ScoutJet, Scrapy, Screaming Frog SEO Spider, ScreenerBot, Semrush Bot, Sensika Bot, Sentry Bot, SEOENGBot, SEOkicks-Robot, Seoscanners.net, Server Density, Seznam Bot, Seznam Email Proxy, Seznam Zbozi.cz, ShopAlike, Shopify Partner, ShopWiki, SilverReader, SimplePie, SISTRIX Crawler, SISTRIX Optimizer, Site24x7 Website Monitoring, Siteimprove, SiteSucker, Sixy.ch, Skype URI Preview, Slackbot, SMTBot, Snapchat Proxy, Sogou Spider, Soso Spider, Sparkler, Speedy, Spinn3r, Spotify, Sputnik Bot, sqlmap, SSL Labs, Startpagina Linkchecker, StatusCake, Superfeedr Bot, Survey Bot, Tarmot Gezgin, TelegramBot, The Knowledge AI, theoldreader, TinEye Crawler, Tiny Tiny RSS, TLSProbe, TraceMyFile, Trendiction Bot, TurnitinBot, TweetedTimes Bot, Tweetmeme Bot, Twingly Recon, Twitterbot, UkrNet Mail Proxy, UniversalFeedParser, Uptimebot, Uptime Robot, URLAppendBot, Vagabondo, Visual Site Mapper Crawler, VK Share Button, W3C CSS Validator, W3C I18N Checker, W3C Link Checker, W3C Markup Validation Service, W3C MobileOK Checker, W3C Unified Validator, Wappalyzer, WebbCrawler, Weborama, WebPageTest, WebSitePulse, WebThumbnail, WeSEE:Search, WikiDo, Willow Internet Crawler, WooRank, WordPress, Wotbox, YaCy, Yahoo! Cache System, Yahoo! Japan BRW, Yahoo! Link Preview, Yahoo! Slurp, Yahoo Gemini, Yandex Bot, Yeti/Naverbot, Yottaa Site Monitor, Youdao Bot, Yourls, Yunyun Bot, Zao, Ze List, zgrab, Zookabot, ZumBot
app/vendor/piwik/device-detector/regexes/bots.yml CHANGED
@@ -577,6 +577,14 @@
577
  name: 'Google Inc.'
578
  url: 'http://www.google.com'
579
 
 
 
 
 
 
 
 
 
580
  - regex: 'Google-Structured-Data-Testing-Tool'
581
  name: 'Google Structured Data Testing Tool'
582
  category: 'Validator'
@@ -585,6 +593,14 @@
585
  name: 'Google Inc.'
586
  url: 'http://www.google.com'
587
 
 
 
 
 
 
 
 
 
588
  - regex: 'via ggpht\.com GoogleImageProxy'
589
  name: 'Gmail Image Proxy'
590
  category: 'Crawler'
577
  name: 'Google Inc.'
578
  url: 'http://www.google.com'
579
 
580
+ - regex: 'Google-Cloud-Scheduler'
581
+ name: 'Google Cloud Scheduler'
582
+ category: 'Crawler'
583
+ url: 'https://cloud.google.com/scheduler'
584
+ producer:
585
+ name: 'Google Inc.'
586
+ url: 'https://www.google.com'
587
+
588
  - regex: 'Google-Structured-Data-Testing-Tool'
589
  name: 'Google Structured Data Testing Tool'
590
  category: 'Validator'
593
  name: 'Google Inc.'
594
  url: 'http://www.google.com'
595
 
596
+ - regex: 'GoogleStackdriverMonitoring'
597
+ name: 'Google Stackdriver Monitoring'
598
+ category: 'Site Monitor'
599
+ url: 'https://cloud.google.com/monitoring'
600
+ producer:
601
+ name: 'Google Inc.'
602
+ url: 'https://www.google.com'
603
+
604
  - regex: 'via ggpht\.com GoogleImageProxy'
605
  name: 'Gmail Image Proxy'
606
  category: 'Crawler'
app/vendor/piwik/device-detector/regexes/client/browsers.yml CHANGED
@@ -1074,6 +1074,11 @@
1074
  name: 'NTENT Browser'
1075
  version: '$1'
1076
 
 
 
 
 
 
1077
  # Chrome Webview
1078
  - regex: 'Version/.* Chrome(?:/(\d+[\.\d]+))?'
1079
  name: 'Chrome Webview'
1074
  name: 'NTENT Browser'
1075
  version: '$1'
1076
 
1077
+ # TV Bro
1078
+ - regex: 'TV Bro/(\d+[\.\d]+)'
1079
+ name: 'TV Bro'
1080
+ version: '$1'
1081
+
1082
  # Chrome Webview
1083
  - regex: 'Version/.* Chrome(?:/(\d+[\.\d]+))?'
1084
  name: 'Chrome Webview'
app/vendor/piwik/device-detector/regexes/client/libraries.yml CHANGED
@@ -91,3 +91,18 @@
91
  name: 'RestSharp'
92
  version: '$1'
93
  url: 'http://restsharp.org/'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  name: 'RestSharp'
92
  version: '$1'
93
  url: 'http://restsharp.org/'
94
+
95
+ - regex: 'scalaj-http/(\d+[\.\d]+)'
96
+ name: 'ScalaJ HTTP'
97
+ version: '$1'
98
+ url: 'https://github.com/scalaj/scalaj-http'
99
+
100
+ - regex: 'REST::Client/(\d+)'
101
+ name: 'Perl REST::Client'
102
+ version: '$1'
103
+ url: 'https://metacpan.org/pod/REST::Client'
104
+
105
+ - regex: 'node-fetch/(\d+[\.\d]+)'
106
+ name: 'Node Fetch'
107
+ version: $1
108
+ url: 'https://github.com/node-fetch/node-fetch'
app/vendor/piwik/device-detector/regexes/device/car_browsers.yml CHANGED
@@ -7,6 +7,10 @@
7
 
8
  # Tesla Model S
9
  Tesla:
10
- regex: 'QtCarBrowser'
11
  device: 'car browser'
12
- model: 'Model S'
 
 
 
 
7
 
8
  # Tesla Model S
9
  Tesla:
10
+ regex: '(?:Tesla/[0-9.]+|QtCarBrowser)'
11
  device: 'car browser'
12
+ models:
13
+ - regex: 'QtCarBrowser'
14
+ model: 'Model S'
15
+ - regex: 'Tesla/[0-9.]+'
16
+ model: ''
app/vendor/piwik/device-detector/regexes/device/mobiles.yml CHANGED
@@ -5,6 +5,14 @@
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
 
 
 
 
 
 
 
 
8
  'Tunisie Telecom':
9
  regex: 'StarTrail TT[);/ ]'
10
  device: 'smartphone'
@@ -56,7 +64,7 @@ SFR:
56
 
57
  # HTC
58
  HTC:
59
- regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G[);/ ]|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/]+) Build|(Amaze[ _]4G|One ?[XELSV\+]+)[);/ ]|SPV E6[05]0|One M8|X525a|PG86100|PC36100|XV6975|PJ83100[);/ ]|2PYB2|2PZC5|0PJA10|0PJA2'
60
  device: 'smartphone'
61
  models:
62
  # explicit smartphone models
@@ -68,6 +76,8 @@ HTC:
68
  model: 'Evo 3G'
69
  - regex: 'PC36100[);/ ]'
70
  model: 'Evo 4G'
 
 
71
  - regex: 'PJ83100[);/ ]'
72
  model: 'One X'
73
  - regex: '(?:0PJA2|0PJA10)[);/ ]'
@@ -118,7 +128,7 @@ HTC:
118
  model: '$1'
119
  - regex: 'HTC;(?: )?([a-z0-9 ]+)'
120
  model: '$1'
121
- - regex: '(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/]+) Build'
122
  model: '$1 $2'
123
  - regex: '(Amaze[ _]4G|One ?[XELSV\+]*) Build'
124
  model: '$1'
@@ -405,7 +415,7 @@ Palm:
405
 
406
  # HP
407
  HP:
408
- regex: 'TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP Slate|HP [78]|Compaq [7|8]|HP; [^;/)]+'
409
  device: 'smartphone'
410
  models:
411
  - regex: 'HP Slate 6 Voice Tab'
@@ -417,6 +427,9 @@ HP:
417
  - regex: 'Compaq ([78][^/;]*) Build'
418
  model: 'Compaq $1'
419
  device: 'tablet'
 
 
 
420
  - regex: 'HP Slate ?(.+) Build'
421
  model: 'Slate $1'
422
  device: 'tablet'
@@ -982,7 +995,7 @@ Arian Space:
982
 
983
  # Alcatel
984
  Alcatel:
985
- regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034[ADEFGX]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|4114E|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024A|5025[DEG]|5026[AD]|5027B|5033[AX]|5033D[ _]RU|5034D|5038[ADEX]|5041C|5042[ADEFGWX]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[AD]|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY]|5059[ADXYZ]|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI]|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6043[AD]|6044D|6045[BFIKOY]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7055A|7070X|8030Y|8050[DEGX]|8063|9001[DIX]|9002X|9003[AX]|9024O|9005X|9007[ATX]|9008[ADIJNTUX]|9010X|9022X|9203A|A570BL|I213|I216X)[);/ ]|TIMXL'
986
  device: 'smartphone'
987
  models:
988
  - regex: '(?:5022[EDX]|5070D)[);/ ]'
@@ -1049,9 +1062,9 @@ Alcatel:
1049
  model: 'One Touch Idol 2'
1050
  - regex: '5027B[);/ ]'
1051
  model: 'One Touch Dawn'
1052
- - regex: '5024A[);/ ]'
1053
  model: '1S'
1054
- - regex: '5034D[);/ ]'
1055
  model: '3L'
1056
  - regex: '7040[RT][);/ ]'
1057
  model: 'One Touch Fierce 2'
@@ -1145,6 +1158,9 @@ Alcatel:
1145
  - regex: '9203A[);/ ]'
1146
  model: 'A3 7" 3G'
1147
  device: 'tablet'
 
 
 
1148
  - regex: '5085[BQ][);/ ]'
1149
  model: 'A5'
1150
  - regex: '5085[ADHIJY][);/ ]'
@@ -1248,15 +1264,17 @@ Alcatel:
1248
  model: '1'
1249
  - regex: '5009[AD][);/ ]'
1250
  model: '1C'
1251
- - regex: '5059[ADXYZ][);/ ]'
 
 
1252
  model: '1X'
1253
- - regex: '5052[AD][);/ ]'
1254
  model: '3'
1255
- - regex: '5099[ADYUI][);/ ]'
1256
  model: '3V'
1257
  - regex: '5026[AD][);/ ]'
1258
  model: '3C'
1259
- - regex: '5058[AIY][);/ ]'
1260
  model: '3X'
1261
  - regex: '5086[ADY][);/ ]'
1262
  model: '5'
@@ -1279,7 +1297,7 @@ Alcatel:
1279
 
1280
  # Allview
1281
  Allview:
1282
- regex: 'Allview|A4You|A5_(?:Easy(?:_TM)?|Ready(?:_TM)?|Quad|Quad_Plus_TM)|A[56789]_Lite|A5Smiley|A6_Duo|A10_Lite_2019|A10_Plus|AX2_Frenzy|AX4Nano|AX5NanoQ|C6_Duo|E[23]_Living|E3_(?:Jump|Sign)|E4_Lite|M9_Connect|P(?:43_Easy|[5689]_Energy|6_Energy_Lite|[68]_Energy_Mini(?:_TM)?|(41|[458])_eMagic(?:_TM)?|[589](?:_)?Life(?:_TM)?|[567]_Lite(?:_TM)?|6_plus|[45678]_Pro|7_Seon|10_Life|10_Style|7_Xtreme|6_Qmax|4_Quad)|V(?:[13]_Viper|1_Viper_I|2_Viper_(?:E|I|S|X|X_plus|Xe))|X(?:[1234]_Soul_Xtreme|[12345]_Soul|3_Soul_Lite|[24]Soul_Mini(?:_TM)?|4_Soul_Mini_S(?:_TM)?|[234]_Soul_Style(?:_TM)?|2_Soul_Style_Plus|2_Twin)|Viva_H801'
1283
  device: 'smartphone'
1284
  models:
1285
  - regex: 'A4You'
@@ -1338,6 +1356,8 @@ Allview:
1338
  model: 'P$1 Life'
1339
  - regex: 'P10_Life'
1340
  model: 'P10 Life'
 
 
1341
  - regex: 'P10_Style'
1342
  model: 'P10 Style'
1343
  - regex: 'V([12])_Viper_I4G(?:_TM)?'
@@ -1358,7 +1378,7 @@ Allview:
1358
  model: 'X$1 Soul Lite'
1359
  - regex: 'X4_Soul_Mini_S(?:_TM)?'
1360
  model: 'X4 Soul Mini S'
1361
- - regex: 'X([2345])_Soul_Mini(?:_TM)?'
1362
  model: 'X$1 Soul Mini'
1363
  - regex: 'X3_Soul_PLUS'
1364
  model: 'X3 Soul Plus'
@@ -1413,9 +1433,9 @@ Allview:
1413
  - regex: 'Allview3SpeedQuad'
1414
  device: 'tablet'
1415
  model: 'Alldro 3 Speed Quad'
1416
- - regex: 'Viva_H801'
1417
  device: 'tablet'
1418
- model: 'Viva H801'
1419
  - regex: 'ALLVIEW ?SPEEDI'
1420
  device: 'tablet'
1421
  model: 'Speed I'
@@ -1505,15 +1525,19 @@ Amoi:
1505
 
1506
  # Ainol
1507
  Ainol:
1508
- regex: 'Numy|novo[0-9]'
1509
  device: 'tablet'
1510
  models:
1511
  - regex: 'Numy 3G AX1'
1512
  model: 'Novo 7 Numy AX1 3G'
1513
  - regex: 'Numy_3G_AX3'
1514
  model: 'Numy AX3 Sword'
 
 
1515
  - regex: 'Numy_3G_BW1'
1516
  model: 'Numy 3G Talos 2'
 
 
1517
 
1518
  - regex: 'Numy[ _]([^;/]+) Build'
1519
  model: 'Numy $1'
@@ -1648,7 +1672,7 @@ ANS:
1648
 
1649
  # Assistant
1650
  Assistant:
1651
- regex: '(AS[-_](?:543[1-6]|44[12]1|541[12]|54[23]1|6431|401L)|AP-(?:721N|753G|7[25]7G|106|107G|941))[;/)_ ]'
1652
  device: 'smartphone'
1653
  models:
1654
  - regex: 'AS[-_]401L '
@@ -1665,6 +1689,8 @@ Assistant:
1665
  model: 'Unami'
1666
  - regex: 'AS-5431'
1667
  model: 'Prima'
 
 
1668
  - regex: 'AS-5435'
1669
  model: 'Shine'
1670
  - regex: 'AS-5436[ _]'
@@ -1681,19 +1707,22 @@ Assistant:
1681
  - regex: 'AP-941'
1682
  model: 'AP-941'
1683
  device: 'tablet'
 
 
 
1684
  - regex: 'AP-106'
1685
  model: 'AP-106 Force'
1686
  device: 'tablet'
1687
- - regex: '(AP-(?:7[25]7G|753G|107G))[/;) ]'
1688
  device: 'tablet'
1689
  model: '$1'
1690
 
1691
  # Ark
1692
  Ark:
1693
- regex: '(ARK[_ -])?Benefit[_ -]([^/;]*) Build|EDGE A5HD|ICON (R40\+|R45)|Impulse[ _](P[12])|Wizard_1[/;) ]'
1694
  device: 'smartphone'
1695
  models:
1696
- - regex: '(?:ARK[_ -])?Benefit[_ -]([^/;]*) Build'
1697
  model: 'Benefit $1'
1698
  - regex: 'Impulse[ _]P1\+'
1699
  model: 'Impulse P1 Plus'
@@ -1720,7 +1749,7 @@ Garmin-Asus:
1720
 
1721
  # Asus
1722
  Asus:
1723
- regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)[);/ ]|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(520|620|55[2345])KL|ZD55[23]KL|ZS(6[23]0|551)KL|ZB(500KG|601KL)'
1724
  device: 'smartphone'
1725
  models:
1726
  # explicit tablet models
@@ -1847,7 +1876,7 @@ Asus:
1847
  model: 'ZenFone Max M1'
1848
  - regex: '(?:ASUS_)?(ZB601KL)'
1849
  model: 'ZenFone Max Pro M1'
1850
- - regex: '(?:ASUS_)?(X01AD|ZB633KL)'
1851
  model: 'ZenFone Max M2'
1852
  - regex: '(?:ASUS_)?(?:Z00[AD]|Z008D|Z008|Z00AD[AB]?)'
1853
  model: 'ZenFone 2'
@@ -1855,6 +1884,8 @@ Asus:
1855
  model: 'ZenFone Live'
1856
  - regex: '(?:ASUS_)?X00RD'
1857
  model: 'ZenFone Live L1'
 
 
1858
  - regex: '(?:ASUS_)Z00YD'
1859
  model: 'Live'
1860
  - regex: '(?:ASUS_)?(?:Z00[ERLMT]D|Z011D)'
@@ -1869,7 +1900,7 @@ Asus:
1869
  model: 'ZenFone 5 Lite'
1870
  - regex: '(?:ASUS_)?(?:Z01RD|ZS620KL)'
1871
  model: 'ZenFone 5Z'
1872
- - regex: '(?:ASUS_)?(?:T00G|Z002|ZS630KL)'
1873
  model: 'ZenFone 6'
1874
  - regex: '(?:ASUS_)?Z010D'
1875
  model: 'ZenFone Max'
@@ -1897,6 +1928,8 @@ Asus:
1897
  model: 'ZenFone 3 Pegasus'
1898
  - regex: '(?:ASUS_)?(ZE553KL|Z01HD)'
1899
  model: 'ZenFone 3 Zoom'
 
 
1900
  - regex: '(?:ASUS_)?Z00UD'
1901
  model: 'ZenFone Selfie'
1902
  - regex: '(?:ASUS_)?(Z016[DS]|Z01FD)'
@@ -1929,7 +1962,7 @@ Asus:
1929
  model: 'ZenFone Zoom'
1930
  - regex: '(?:ASUS_)?Z01QD'
1931
  model: 'ROG Phone'
1932
- - regex: '(?:ASUS_)?I001DA'
1933
  model: 'ROG Phone 2'
1934
 
1935
  # general detections
@@ -2102,7 +2135,7 @@ Bluegood:
2102
 
2103
  # Blackview
2104
  Blackview:
2105
- regex: '(BV([2456789]000|(5[589]|9[156])00)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A60(?:Pro)?\))'
2106
  device: 'smartphone'
2107
  models:
2108
  - regex: 'A60Pro\)'
@@ -2115,7 +2148,7 @@ Blackview:
2115
  model: '$1 Pro'
2116
  - regex: 'BV9000Pro-F'
2117
  model: 'BV9000 Pro F'
2118
- - regex: '(BV([48]000|9[56]00))Pro'
2119
  model: '$1 Pro'
2120
  - regex: '(BV([2456789]000|(5[589]|9[15])00)(?:[ _](?:PRO))?)'
2121
  model: '$1'
@@ -2144,11 +2177,13 @@ Bluboo:
2144
 
2145
  # Black Fox
2146
  'Black Fox':
2147
- regex: 'BMM[ _-]?((44[123]D|431D|533D|54[12]S|541[AB]|54[123]D|531[ABD]))[;/) ]'
2148
  device: 'smartphone'
2149
  models:
2150
  - regex: 'BMM443D'
2151
  model: 'B7 Fox+'
 
 
2152
  - regex: 'BMM442D'
2153
  model: 'B7'
2154
  - regex: 'BMM531D'
@@ -2157,7 +2192,7 @@ Bluboo:
2157
  model: 'B5'
2158
  - regex: 'BMM541A'
2159
  model: 'B5+'
2160
- - regex: 'BMM543D'
2161
  model: 'B4'
2162
  - regex: 'BMM441D'
2163
  model: 'B4 Mini'
@@ -2202,9 +2237,11 @@ Boway:
2202
 
2203
  # Brondi
2204
  Brondi:
2205
- regex: '(?:CENTURION|GLADIATOR| GLORY|LUXURY|SENSUELLE|VICTORY)(?:[ _-]?[2-6])?[);/ ]|Surfing Tab'
2206
  device: 'smartphone'
2207
  models:
 
 
2208
  - regex: 'CENTURION(?:[ _-]?([2-6]))?[);/ ]'
2209
  model: 'CENTURION $1'
2210
  - regex: 'GLADIATOR(?:[ _-]?([2-6]))?[);/ ]'
@@ -2235,22 +2272,28 @@ VGO TEL:
2235
 
2236
  # Vivo
2237
  Vivo:
2238
- regex: '((?:VIV-|BBG-)?vivo)|V1813B[AT]|V1818T|V1731CA|V1809T|V1813[AT]|V1901A|V18[13]8A|V1932[AT]'
2239
  device: 'smartphone'
2240
  models:
2241
  - regex: '(?:VIV-|BBG-)?vivo[ _]1601[);/ ]'
2242
  model: 'V5'
2243
  - regex: 'V1932[AT]'
2244
  model: 'S5'
 
 
 
 
2245
  - regex: 'V1813B[AT]'
2246
  model: 'Z3'
 
 
2247
  - regex: 'Vivo ONE'
2248
  model: 'One'
2249
  - regex: 'X9Plus'
2250
  model: 'X9 Plus'
2251
  - regex: 'X20Plus'
2252
  model: 'X20 Plus'
2253
- - regex: 'V1809T'
2254
  model: 'X23'
2255
  - regex: 'V1818[AT]|vivo 181[45]'
2256
  model: 'Y93'
@@ -2294,6 +2337,8 @@ Vivo:
2294
  model: 'Y71'
2295
  - regex: 'vivo 1725'
2296
  model: 'X21'
 
 
2297
  - regex: 'V1838A'
2298
  model: 'X27'
2299
  - regex: 'vivo 1727'
@@ -2407,7 +2452,7 @@ Blaupunkt:
2407
  model: 'Polaris $1'
2408
  - regex: 'Atlantis[_ ](1001A|1010A|A10\.G402)'
2409
  model: 'Atlantis $1'
2410
- - regex: 'Blaupunkt (SL 0[24]|SM 01)'
2411
  device: 'smartphone'
2412
  model: '$1'
2413
 
@@ -2829,25 +2874,30 @@ Casio:
2829
 
2830
  # Casper
2831
  Casper:
2832
- regex: 'CASPER_|VIA_(G4|M4|P2|V8C)|VIA-T7D[);/ ]'
2833
  device: 'smartphone'
2834
  models:
2835
- - regex: 'CASPER_VIA_([AE]2|M[13]|V[69])'
2836
  model: 'VIA $1'
2837
- - regex: 'VIA_(G4|M4|P2|V8C)'
2838
- model: 'VIA $1'
2839
- - regex: 'VIA-(T7D)[);/ ]'
2840
  model: 'VIA $1'
2841
  device: 'tablet'
 
 
2842
 
2843
- # Cat
2844
  Cat:
2845
- regex: 'Cat ?(tablet|stargate|nova)|B15Q'
2846
  device: 'tablet'
2847
  models:
2848
  - regex: 'B15Q'
2849
  model: 'B15Q'
2850
  device: 'smartphone'
 
 
 
2851
  - regex: 'Cat ?(?:tablet)? ?((?:Galactica|Nova|StarGate|PHOENIX)[^/;]*) Build'
2852
  model: '$1'
2853
  - regex: 'Cat ?tablet'
@@ -2922,6 +2972,8 @@ Changhong:
2922
  model: 'Flare S6 Plus'
2923
  - regex: 'FLARE S6 POWER'
2924
  model: 'Flare S6 Power'
 
 
2925
  - regex: 'Flare(?:[ _])?(4|A[13]|J[135]|P[13]|S4|X2)'
2926
  model: 'Flare $1'
2927
  - regex: 'OMEGA HD 4'
@@ -3044,12 +3096,15 @@ ConCorde:
3044
 
3045
  # Condor
3046
  Condor:
3047
- regex: 'Allure M[13]|Griffe T6|(?:PGN\-?[456][012][0-9]|PHS\-601|Plume L[12])[;/) ]|CTAB[^/;]+ Build'
3048
  device: 'smartphone'
3049
  models:
3050
  - regex: 'CTAB([^/;]+) Build'
3051
  device: 'tablet'
3052
  model: 'CTAB $1'
 
 
 
3053
 
3054
  - regex: 'PHS\-601'
3055
  model: 'C8'
@@ -3059,6 +3114,8 @@ Condor:
3059
  model: 'C7 Mini'
3060
  - regex: 'PGN\-?409'
3061
  model: 'Plume P4'
 
 
3062
  - regex: 'PGN\-?504'
3063
  model: 'C5'
3064
  - regex: 'PGN\-?505'
@@ -3077,6 +3134,8 @@ Condor:
3077
  model: 'Allure A9 Plus'
3078
  - regex: 'PGN\-?513'
3079
  model: 'Griffe G4'
 
 
3080
  - regex: 'PGN\-?514'
3081
  model: 'Plume P7'
3082
  - regex: 'PGN\-?515'
@@ -3087,8 +3146,18 @@ Condor:
3087
  model: 'Plume P6'
3088
  - regex: 'PGN\-?521'
3089
  model: 'Griffe G4 Plus'
 
 
 
 
3090
  - regex: 'Griffe T6'
3091
  model: 'Griffe T6'
 
 
 
 
 
 
3092
  - regex: 'PGN\-?522'
3093
  model: 'P6 Plus'
3094
  - regex: 'PGN\-?523'
@@ -3115,20 +3184,26 @@ Condor:
3115
  model: 'Allure A8 Plus'
3116
  - regex: 'PGN\-?613'
3117
  model: 'Allure A55 Plus'
 
 
3118
  - regex: 'Plume L1'
3119
  model: 'Plume L1'
3120
  - regex: 'Plume L2 Pro'
3121
  model: 'Plume L2 Pro'
 
 
 
 
3122
 
3123
  - regex: 'PGN\-?([0-9]{3})'
3124
  model: 'PGN-$1'
3125
 
3126
  # Coolpad
3127
  Coolpad:
3128
- regex: '(?:YL-)?Coolpad|8190Q[ ;/\)]|(8295|5860S) Build|CP8676_I0[23] Build|CP8298_I00 Build|REVVLPLUS C3701A|VCR-I0|C106-7'
3129
  device: 'smartphone'
3130
  models:
3131
- - regex: 'VCR-I0'
3132
  model: 'Cool Play 6'
3133
  - regex: 'REVVLPLUS C3701A'
3134
  model: 'REVVL Plus'
@@ -3172,11 +3247,13 @@ Cricket:
3172
 
3173
  # Crosscall
3174
  Crosscall:
3175
- regex: 'Crosscall|ODYSSEY_Plus|Odyssey S1|Trekker-[MSX][1234]|Action-X3'
3176
  device: 'smartphone'
3177
  models:
3178
  - regex: 'Action-X3'
3179
  model: 'Action-X3'
 
 
3180
  - regex: 'Crosscall ([^;/]+) Build'
3181
  model: '$1'
3182
  - regex: 'ODYSSEY_Plus'
@@ -3209,11 +3286,13 @@ Cube:
3209
 
3210
  # CUBOT
3211
  CUBOT:
3212
- regex: 'CUBOT'
3213
  device: 'smartphone'
3214
  models:
3215
  - regex: 'CHEETAH 2'
3216
  model: 'Cheetah 2'
 
 
3217
  - regex: 'DINOSAUR'
3218
  model: 'Dinosaur'
3219
  - regex: 'KING KONG'
@@ -3346,21 +3425,23 @@ Desay:
3346
 
3347
  # DEXP
3348
  DEXP:
3349
- regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|(BL150|BS155|BS160|BS550|BS650)[);/ ]'
3350
  device: 'smartphone'
3351
  models:
3352
 
3353
  - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
3354
  model: 'Ixion $1'
 
 
3355
 
3356
- - regex: 'Ursus ([^;/]+) Build'
3357
  model: 'Ursus $1'
3358
  device: 'tablet'
3359
 
3360
  - regex: 'H135[ _]Build'
3361
  model: 'Atlas'
3362
  device: 'desktop'
3363
- - regex: '(BL150|BS155|BS160|BS550|BS650)[);/ ]'
3364
  model: '$1'
3365
  - regex: 'DEXP[ _]([^;/]+) Build'
3366
  model: '$1'
@@ -3412,7 +3493,7 @@ Digiland:
3412
 
3413
  # Digma
3414
  Digma:
3415
- regex: 'Digma[_ ]([^;/]+) Build|HIT HT707[10]MG|CITI 1902 3G|(CITI[_ ](?:[A-Z0-9]+)[_ ][34]G)[ _]C[ST](500[67]PG|8209MG|8139ML)|iDrQ10 3G|iDxD8 3G|iDnD7|HIT 4G HT7074ML|IDX5|(iDx10|iDx7)|MVM900H(?:WZ|C)|MVM908HCZ|iDxD10 3G|(iDxD[45]|iDxQ5)|iDxD7[_ ]3G|PS604M|PT452E|Linx A400 3G LT4001PG|Linx C500 3G LT5001PG|Linx PS474S|LS504[01]PL|LT40(47|54)MG|LS405[01]MG|LS5053ML|LT5048MG|LT5052ML|HT5035PG|HT4039PG|LT4049PG|NS6902QL|NS9797MG|((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.ST]+|Prime)(?:[ _][43]G)?)|(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
3416
  device: 'smartphone'
3417
  models:
3418
  - regex: 'HIT HT707[10]MG'
@@ -3424,8 +3505,8 @@ Digma:
3424
  model: 'HIT Q500 3G'
3425
  - regex: 'HT4039PG'
3426
  model: 'HIT Q401 3G'
3427
- - regex: 'iDxD10 3G'
3428
- model: 'iDxD10 3G'
3429
  device: 'tablet'
3430
  - regex: '(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
3431
  model: '$1'
@@ -3465,7 +3546,7 @@ Digma:
3465
  - regex: 'MVM908HCZ'
3466
  model: 'iDx9'
3467
  device: 'tablet'
3468
- - regex: '(iDxD7[_ ]3G)'
3469
  model: '$1'
3470
  device: 'tablet'
3471
  - regex: '(iDx10|iDx7)'
@@ -3478,6 +3559,8 @@ Digma:
3478
  - regex: '(CITI 1902 3G)'
3479
  model: '$1'
3480
  device: 'tablet'
 
 
3481
  - regex: '(CITI_8527_4G)'
3482
  model: '$1'
3483
  device: 'tablet'
@@ -3487,7 +3570,7 @@ Digma:
3487
  - regex: 'iDxD8 3G'
3488
  model: 'D-Plane2 8'
3489
  device: 'tablet'
3490
- - regex: '(iDrQ10 3G|iDnD7)'
3491
  model: '$1'
3492
  device: 'tablet'
3493
  - regex: 'NS6902QL'
@@ -3517,7 +3600,7 @@ DoCoMo:
3517
 
3518
  # Doogee
3519
  Doogee:
3520
- regex: 'DOOGEE[ _-]|Valencia2_Y100pro|X5max(?:[_ ]PRO)?|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)[);/ ]|BL[579]000[);/ ]|BL12000|BL5500[_ ]Lite'
3521
  device: 'smartphone'
3522
  models:
3523
  - regex: 'Valencia2_Y100pro'
@@ -3532,6 +3615,8 @@ Doogee:
3532
  model: 'BL12000'
3533
  - regex: 'KISSME-DG580'
3534
  model: 'Kissme DG580'
 
 
3535
  - regex: '(X5max(?:[_ ]PRO)?)'
3536
  model: '$1'
3537
  - regex: '(?:DOOGEE[ _-])?(BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|Valencia2_Y100pro|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)[);/ ]'
@@ -3775,13 +3860,13 @@ Riviera:
3775
 
3776
  # Senseit
3777
  Senseit:
3778
- regex: 'SENSEIT[ _]?([^;/)]+) Build'
3779
  device: 'smartphone'
3780
  model: '$1'
3781
 
3782
  # Sony & Sony Ericsson (combined as they are mixed up)
3783
  Sony:
3784
- regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|([456]0[12]|701)SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOL2[246]|SOV3[1234567]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1235]F|[1234]G|[134]H|[1234]J|[12]K)|R800[aix]|J9110|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman'
3785
  device: 'smartphone'
3786
  models:
3787
  # SONY ERICSSON: explicit smartphone models
@@ -3908,6 +3993,8 @@ Sony:
3908
  device: 'feature phone'
3909
 
3910
  # SONY: explicit smartphone models
 
 
3911
  - regex: 'SO-04G'
3912
  model: 'Xperia A4'
3913
  - regex: '(?:Sony(?:Ericsson)?)?I(?:4113|31[12]3)'
@@ -4105,7 +4192,7 @@ Sony:
4105
  model: 'Xperia XZ2 Dual'
4106
  - regex: 'H8166'
4107
  model: 'Xperia XZ2 Premium Dual'
4108
- - regex: '(?:Sony(?:Ericsson)?)?H(8416|9436|9493)'
4109
  model: 'Xperia XZ3'
4110
  - regex: '(?:Sony(?:Ericsson)?)?G331[13]'
4111
  model: 'Xperia L1'
@@ -4132,6 +4219,9 @@ Sony:
4132
  - regex: 'SGP(?:311|312|321)[);/ ]|SO-03E'
4133
  model: 'Xperia Tablet Z'
4134
  device: 'tablet'
 
 
 
4135
  - regex: 'SGP(?:511|512|521)[);/ ]|SO-05F'
4136
  model: 'Xperia Tablet Z2'
4137
  device: 'tablet'
@@ -4142,6 +4232,11 @@ Sony:
4142
  model: 'Xperia Tablet S'
4143
  device: 'tablet'
4144
 
 
 
 
 
 
4145
  # general detections
4146
  - regex: 'SonyBDP|SonyDBV'
4147
  model: 'Blu-ray Player'
@@ -4199,9 +4294,9 @@ Ergo:
4199
  model: 'V550 Vision'
4200
  - regex: 'B504[_ ]Unit'
4201
  model: 'B504 Unit'
4202
- - regex: 'A500 Best'
4203
  model: 'A500 Best'
4204
- - regex: 'A550 Maxx'
4205
  model: 'A550 Maxx'
4206
  - regex: 'Prime B400'
4207
  model: 'Prime B400'
@@ -4352,11 +4447,13 @@ Explay:
4352
 
4353
  # EvroMedia
4354
  EvroMedia:
4355
- regex: 'Playpad[ _]'
4356
  device: 'tablet'
4357
  models:
4358
  - regex: 'Playpad 3G GOO'
4359
  model: 'Play Pad 3G Goo'
 
 
4360
  - regex: 'PlayPad 3GTab XL'
4361
  model: 'Play Pad 3G Tab XL'
4362
  # EKO
@@ -4582,11 +4679,13 @@ General Mobile:
4582
 
4583
  # Geotel
4584
  Geotel:
4585
- regex: 'GEOTEL'
4586
  device: 'smartphone'
4587
  models:
4588
  - regex: 'G1'
4589
  model: 'G1'
 
 
4590
 
4591
  # Ghia
4592
  Ghia:
@@ -4603,10 +4702,10 @@ Ghia:
4603
 
4604
  # Gigabyte
4605
  Gigabyte:
4606
- regex: 'GSmart [a-z0-9 ]+ Build|Gigabyte-[a-z0-9]+'
4607
  device: 'smartphone'
4608
  models:
4609
- - regex: '(GSmart [a-z0-9 ]+) Build'
4610
  model: '$1'
4611
  - regex: 'Gigabyte-([a-z0-9]+)'
4612
  model: '$1'
@@ -4626,22 +4725,22 @@ Gigaset:
4626
 
4627
  # Ginzzu
4628
  Ginzzu:
4629
- regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S50[45]0|S5120|RS(6[12]|94)D|S40[23]0|RS8502|RS9602)[);/ ]'
4630
  device: 'smartphone'
4631
  models:
4632
- - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST6040)'
4633
  model: '$1'
4634
- - regex: 'GINZZU[_ ]?(GT-7105)'
4635
  model: '$1'
4636
  device: 'tablet'
4637
  - regex: '(RS6[12]D) ULTIMATE'
4638
  model: '$1 Ultimate'
4639
- - regex: '((?:RS(?:7[14]|81|9[67])D)|S50[45]0|S5120|S40[23]0|RS8502|RS9602|RS94D)[);/ ]'
4640
  model: '$1'
4641
 
4642
  # Gionee
4643
  Gionee:
4644
- regex: '(?:GIO-)?GIONEE[ _-]?[a-z0-9]+|(?:Dream_D1|V188S?|GN[0-9]{3,4}[a-z]?)[);/ ]|F103(?: Pro)? Build|P5 mini Build|P7 Max Build|M7 Power '
4645
  device: 'smartphone'
4646
  models:
4647
  - regex: 'GN810[);/ ]'
@@ -4651,6 +4750,8 @@ Gionee:
4651
  model: 'GN$1'
4652
  - regex: 'V188S[);/ ]'
4653
  model: 'V188S'
 
 
4654
  - regex: 'V188[);/ ]'
4655
  model: 'V188'
4656
  - regex: 'F103( Pro)? Build'
@@ -4696,8 +4797,8 @@ GOCLEVER:
4696
  - regex: 'QUANTUM_(1010N|1010M|900)'
4697
  model: 'QUANTUM $1'
4698
  device: 'tablet'
4699
- - regex: 'INSIGNIA_785_PRO'
4700
- model: 'INSIGNIA 785 PRO'
4701
  device: 'tablet'
4702
  - regex: '(ORION|ARIES|ELIPSO)[_ ](71|101|102)'
4703
  model: '$1 $2'
@@ -4705,7 +4806,7 @@ GOCLEVER:
4705
  - regex: 'TQ700N'
4706
  model: 'QUANTUM 700N'
4707
  device: 'tablet'
4708
- - regex: '((?:QUANTUM|ARIES|INSIGNIA|ORION|ELIPSO)[ _-]?[^;/]+) Build'
4709
  model: '$1'
4710
  - regex: 'GOCLEVER[ _-]TAB[ _-]?([^;/]+) Build'
4711
  model: 'TAB $1'
@@ -4748,7 +4849,7 @@ Goly:
4748
 
4749
  # Google
4750
  Google:
4751
- regex: 'Nexus|GoogleTV|Glass|CrKey[^a-z0-9]|Pixel(?: Build|\))|Pixel (?:XL|C|[2-4]|[2-4] XL)'
4752
  device: 'smartphone'
4753
  models:
4754
  - regex: 'Glass'
@@ -4785,6 +4886,8 @@ Google:
4785
  model: 'Pixel 4'
4786
  - regex: 'Pixel 2'
4787
  model: 'Pixel 2'
 
 
4788
  - regex: 'Pixel C'
4789
  device: 'tablet'
4790
  model: 'Pixel C'
@@ -4822,11 +4925,17 @@ Hafury:
4822
 
4823
  # Haier
4824
  Haier:
4825
- regex: 'Haier|(?:HW-)?W(?:716|757|860|970)[);/ ]|(?:HM-)?(G(?:152|303|353|552|70[01])?-FL|G(?:303)?-W|I(?:557)?-FL)|(?:PAD[ _](D71|G781|d85))'
4826
  device: 'smartphone'
4827
  models:
 
 
 
 
4828
  - regex: '(?:HM-)?(G(?:152|353|552|70[01])|G(?:303)|I(?:557))'
4829
  model: '$1'
 
 
4830
  - regex: '(?:HW-)?W(716|757|860|970)[);/ ]'
4831
  model: 'W$1'
4832
  - regex: 'PAD[ -_](D71|G781|d85)'
@@ -4874,7 +4983,7 @@ Hasee:
4874
 
4875
  # Hisense
4876
  Hisense:
4877
- regex: '(?:HS-)?Hisense ([^;/]+) Build|Hisense [^);/]+|HS-(?:G|U|EG?|I|L|T|X)[0-9]+[a-z0-9\-]*|E270BSA|M470BS[AE]|E2281|EG680|HLTE700T'
4878
  device: 'smartphone'
4879
  models:
4880
  # explicit tablet models
@@ -4889,6 +4998,10 @@ Hisense:
4889
  model: 'Sero 8'
4890
  - regex: 'HLTE700T'
4891
  model: 'A6'
 
 
 
 
4892
  - regex: 'EG680'
4893
  model: 'Smartfren Andromax Z'
4894
 
@@ -4944,7 +5057,7 @@ Hoozo:
4944
 
4945
  # Huawei
4946
  Huawei:
4947
- regex: '(HW-)?(?:Huawei|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ATH|ATU|AUM|BAC|BAH|BAH2|BG2|BGO|BKK|BKL|BLA|BLL|BLN|BND|BTV|CAG|CAM|CAN|CAZ|CHC|CHE[12]?|CHM|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GRA|HLK|HMA|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KIW|KNT|KOB|KSA|LDN|LLD|LND|LON|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SEA|SHT|SLA|SNE|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,2}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))[);/ ])|hi6210sft|SPN-AL00|HRY-LX1MEB|GEM-70[1-3]L|PE-(UL00|TL10)|VRD-W09|T1-A21L|T1-701u| ASK-AL00x'
4948
  device: 'smartphone'
4949
  models:
4950
  - regex: 'ARS-([AT]L00|L22)[);/ ]'
@@ -4997,6 +5110,8 @@ Huawei:
4997
  model: 'Ascend G620S'
4998
  - regex: 'G630-U251'
4999
  model: 'Ascend G630'
 
 
5000
  - regex: 'U8860[);/ ]'
5001
  model: 'Honor'
5002
  - regex: 'H1711[);/ ]'
@@ -5013,7 +5128,9 @@ Huawei:
5013
  model: 'Honor 2'
5014
  - regex: 'YAL-(?:L21|AL00)'
5015
  model: 'Honor 20'
5016
- - regex: 'MAR-LX1H'
 
 
5017
  model: 'Honor 20S'
5018
  - regex: 'YAL-(L41|AL10)[);/ ]'
5019
  model: 'Honor 20 Pro'
@@ -5025,9 +5142,12 @@ Huawei:
5025
  model: 'Honor Play 4C'
5026
  - regex: 'ASK-AL00x'
5027
  model: 'Honor Play 3'
5028
- - regex: 'JDN-AL00'
5029
  model: 'Honor Pad 2'
5030
  device: 'tablet'
 
 
 
5031
  - regex: 'JAT-AL00'
5032
  model: 'Honor Play 8A'
5033
  - regex: 'KNT-(?:AL[12]0|[TU]L10)'
@@ -5048,12 +5168,16 @@ Huawei:
5048
  model: 'G621'
5049
  - regex: '(?:Honor_|HW-)?H30-(?:C00|L01M?|L02|U10|T00|T10)(?:_TD)?[);/ ]'
5050
  model: 'Honor 3C'
 
 
5051
  - regex: '(?:Honor_|HW-)?SCL-(?:AL00|CL00|TL00H?)(?:_TD)?[);/ ]'
5052
  model: 'Honor 4A'
5053
  - regex: '(?:Honor_|HW-)?CAM-(?:AL00|TL00H|TL00)(?:_TD)?[);/ ]'
5054
  model: 'Honor 5A'
5055
  - regex: '(?:Honor_|HW-)?KIW-(?:AL10|TL00H|[TC]L00|L2[124]|UL00)(?:_TD)?[);/ ]'
5056
  model: 'Honor 5X'
 
 
5057
  - regex: '(?:Honor_|HW-)?CHM-U01(?:_TD)?[);/ ]'
5058
  model: 'Honor 4C'
5059
  - regex: '((?:Honor_|HW-)?H60-L(?:01|02|03|04|11|12)(?:_TD)?|HW-H60-J1)[);/ ]'
@@ -5062,7 +5186,7 @@ Huawei:
5062
  model: 'Honor 6 Play'
5063
  - regex: 'PE-(UL00|TL10)'
5064
  model: 'Honor 6 Plus'
5065
- - regex: '(?:Honor_|HW-)?SCL-L01(?:_TD)?[);/ ]'
5066
  model: 'Honor Y6'
5067
  - regex: '(?:Honor_|HW-)?LYO-L21'
5068
  model: 'Honor Y6 II Compact' # Honor 5A
@@ -5100,7 +5224,7 @@ Huawei:
5100
  model: 'Honor 8C'
5101
  - regex: 'JSN-L(?:2[123]|42)|JSN-[TA]L00[a]?'
5102
  model: 'Honor 8X'
5103
- - regex: 'KSA-LX9'
5104
  model: 'Honor 8S'
5105
  - regex: 'ARE-(?:AL[10]0|L22HN|TL00)'
5106
  model: 'Honor 8X Max'
@@ -5116,13 +5240,15 @@ Huawei:
5116
  model: 'Honor 9'
5117
  - regex: 'HLK-AL00'
5118
  model: 'Honor 9X'
 
 
5119
  - regex: 'LLD-AL[23]0'
5120
  model: 'Honor 9i'
5121
  - regex: 'LLD-(?:AL[01]0|L[23]1|TL10)'
5122
  model: 'Honor 9 Lite'
5123
  - regex: 'COL-(?:AL[01]0|TL[01]0|L29)'
5124
  model: 'Honor 10'
5125
- - regex: 'HRY-(?:AL00|LX[12])|HRY-LX1MEB'
5126
  model: 'Honor 10 Lite'
5127
  - regex: 'VKY-TL00'
5128
  model: 'Honor P10 Plus'
@@ -5164,6 +5290,8 @@ Huawei:
5164
  model: 'Nova 3e'
5165
  - regex: 'INE-(?:AL00|LX1r|LX[12]|TL00)'
5166
  model: 'Nova 3i'
 
 
5167
  - regex: 'SEA-AL10'
5168
  model: 'Nova 5 Pro'
5169
  - regex: 'VCE-(L22|[AT]L00)'
@@ -5198,13 +5326,13 @@ Huawei:
5198
  model: 'P20'
5199
  - regex: 'ANE-(?:LX[123]|TL00)'
5200
  model: 'P20 Lite'
5201
- - regex: 'CLT-(?:AL0[01]|TL00|L(?:04|[02]9))'
5202
  model: 'P20 Pro'
5203
- - regex: 'ELE-L(?:04|09|29)|ELE-AL00'
5204
  model: 'P30'
5205
  - regex: 'VOG-L(?:04|09|29)|VOG-TL00'
5206
  model: 'P30 Pro'
5207
- - regex: 'MAR-LX(1M|2)'
5208
  model: 'P30 Lite'
5209
  - regex: 'MAR-LX[13]A'
5210
  model: 'P30 Lite Dual SIM'
@@ -5212,7 +5340,7 @@ Huawei:
5212
  model: 'P smart'
5213
  - regex: 'STK-LX1'
5214
  model: 'P smart Z'
5215
- - regex: 'POT-LX[13]'
5216
  model: 'P smart (2019)'
5217
  - regex: 'POT-[TA]L00a'
5218
  model: '9S'
@@ -5220,7 +5348,7 @@ Huawei:
5220
  model: 'Y3 (2017)'
5221
  - regex: 'CAG-L[02]2'
5222
  model: 'Y3 (2018)'
5223
- - regex: 'LUA-U22'
5224
  model: 'Y3II'
5225
  - regex: 'CUN-L(?:0[123]|2[123]|33)'
5226
  model: 'Y5II'
@@ -5310,7 +5438,7 @@ Huawei:
5310
  model: 'Mate 20 Pro'
5311
  - regex: 'SNE-(?:AL00|LX[0-3])'
5312
  model: 'Mate 20 Lite'
5313
- - regex: 'EVR-(?:[TA]L00|L29)'
5314
  model: 'Mate 20 X'
5315
  - regex: 'CRR-(?:L09|UL00)'
5316
  model: 'Mate S'
@@ -5322,18 +5450,20 @@ Huawei:
5322
  model: 'Mate SE'
5323
  - regex: 'SPN-AL00'
5324
  model: 'Mate 30 Lite' # Nova 5i Pro
 
 
5325
  - regex: 'Bucare Y330-U05'
5326
  model: 'Y330-U05'
5327
  - regex: 'DRA-L(?:01|03|21|23|X3)'
5328
  model: 'Y5 (2018)'
5329
  - regex: 'ATH-UL0[16]'
5330
  model: 'ShotX'
5331
- - regex: 'T1-A21w'
5332
- device: 'tablet'
5333
- model: 'Honor Tablet Note'
5334
  - regex: 'CMR-(?:AL[01]9|W09)'
5335
  device: 'tablet'
5336
  model: 'MediaPad M5 10.8'
 
 
 
5337
  - regex: 'GEM-70[1-3]L'
5338
  device: 'tablet'
5339
  model: 'MediaPad X2'
@@ -5343,9 +5473,12 @@ Huawei:
5343
  - regex: 'SHT-(?:AL|W)09'
5344
  device: 'tablet'
5345
  model: 'MediaPad M5 8.4'
5346
- - regex: 'VRD-(AL|W)09'
5347
  device: 'tablet'
5348
  model: 'MediaPad M6 8.4'
 
 
 
5349
  - regex: 'BTV-W09'
5350
  device: 'tablet'
5351
  model: 'MediaPad M3 8'
@@ -5382,7 +5515,7 @@ Huawei:
5382
  - regex: 'FDR-A01(?:L|w)'
5383
  device: 'tablet'
5384
  model: 'MediaPad T2 10.0 Pro'
5385
- - regex: 'T1-A21L'
5386
  device: 'tablet'
5387
  model: 'MediaPad T1 10'
5388
  - regex: 'T1-701u'
@@ -5475,14 +5608,20 @@ iRola:
5475
  - regex: 'iRola ([^/;]+) Build'
5476
  model: '$1'
5477
 
 
 
 
 
 
 
5478
  # Irbis
5479
  Irbis:
5480
- regex: 'TZ(150|165|17[5-8]|77[17]|753|794|8[34]1|85[47]|86[45]|878|88[124]|89[12]|49|71[467]|75[47]|772|961)|T(?:Zone|Zart)|(SP(?:0[56]|2[01]|4[1-36]|45[45]|50))[;)\ ]'
5481
  device: 'tablet'
5482
  models:
5483
- - regex: '(TZ(?:150|165|17[5-8]|77[17]|753|794|8[34]1|85[47]|86[45]|878|88[124]|89[12]|49|71[467]|75[47]|772|961)|T(?:Zone|Zart))[;)\ ]'
5484
  model: '$1'
5485
- - regex: '(SP(?:0[56]|2[01]|4[1-36]|45[45]|50))[;)\ ]'
5486
  device: 'smartphone'
5487
  model: '$1'
5488
 
@@ -5498,7 +5637,7 @@ iBerry:
5498
 
5499
  # iHunt
5500
  iHunt:
5501
- regex: 'iHunt|One_ Love_|TITAN_P11000_PRO|Like_(3|4U|3_Pro)|X300 Elite|S10_Tank_2019'
5502
  device: 'smartphone'
5503
  models:
5504
  - regex: 'iHunt_Like'
@@ -5517,10 +5656,14 @@ iHunt:
5517
  model: 'Like 4U'
5518
  - regex: 'X300 Elite'
5519
  model: 'X300 Elite'
 
 
 
 
5520
 
5521
  # IconBIT
5522
  IconBIT:
5523
- regex: 'NT-(3506M|0704S|0909T|1009T|10[01]1T|1017T|3601P/3602P|3603P|3702S|3805C|3905T|3701S|0701S|0805C|0902S|370[23]M)'
5524
  device: 'tablet'
5525
  models:
5526
  - regex: 'NT-3506M'
@@ -5559,6 +5702,10 @@ IconBIT:
5559
  - regex: 'NT-3703M'
5560
  model: 'NetTAB Matrix 3GT'
5561
 
 
 
 
 
5562
  # LYF
5563
  LYF:
5564
  regex: '(LYF[ _])?LS-[456][0-9]{3}|LYF/[^/]+/'
@@ -5610,6 +5757,8 @@ LYF:
5610
  model: 'Wind 7'
5611
  - regex: 'LS-5504'
5612
  model: 'Water 7'
 
 
5613
  - regex: 'LS-5017'
5614
  model: 'Water 11'
5615
  - regex: 'LS-5018'
@@ -5848,7 +5997,7 @@ Infinix:
5848
 
5849
  # InFocus
5850
  InFocus:
5851
- regex: 'IF(9001|9007|9021|9035|9031) Build'
5852
  device: 'smartphone'
5853
  models:
5854
  - regex: 'IF9001'
@@ -6306,12 +6455,14 @@ K-Touch:
6306
 
6307
  # kyocera
6308
  Kyocera:
6309
- regex: 'Kyocera|KWC-|QC-|C5120|C5170|C5155|C5215|C6730|C6750|C6522N?|C6530N|C6740|C6743|E6[89]10|KYL21|KYY23|S2151|KC-S701'
6310
  device: 'smartphone'
6311
  models:
6312
  # explicit smartphone models
6313
  - regex: 'C5120'
6314
  model: 'Milano'
 
 
6315
  - regex: 'C5155'
6316
  model: 'Rise'
6317
  - regex: 'C5170'
@@ -6355,19 +6506,25 @@ Kyocera:
6355
  - regex: '(?:KWC|QC)-([a-z0-9]+)'
6356
  model: '$1'
6357
 
6358
- # Krüger&Matz
6359
  Krüger&Matz:
6360
- regex: 'Kruger[ _&]Matz|MOVE_'
6361
  device: 'smartphone'
6362
  models:
6363
  - regex: 'MOVE_6_mini'
6364
  model: 'MOVE 6 Mini'
6365
- - regex: 'MOVE_([78])'
6366
  model: 'MOVE $1'
6367
  - regex: 'DRIVE 4 mini LTE'
6368
  model: 'DRIVE 4 mini LTE'
 
 
6369
  - regex: 'Drive 5[;/) ]'
6370
  model: 'DRIVE 5'
 
 
 
 
6371
 
6372
  # LAIQ
6373
  LAIQ:
@@ -6439,7 +6596,7 @@ Lanix:
6439
  device: 'tablet'
6440
  - regex: 'X120C'
6441
  model: 'Ilium X120C'
6442
- - regex: 'Ilium[ _](Alpha 3|L(?:200|6[12]0|9[125]0|1[0124]00|1050|1120)|LT5[012]0|M[1379]|S(?:106|520|6[27]0)|X(?:1[12]0|2[0126]0|5[12]0|500B|710))'
6443
  model: 'Ilium $1'
6444
  - regex: 'ILIUM[ _]([^;/]+) Build'
6445
  model: 'Ilium $1'
@@ -6540,6 +6697,8 @@ LeEco:
6540
  model: 'Max X900+'
6541
  - regex: 'X50[10]'
6542
  model: 'Le 1S'
 
 
6543
  - regex: 'X900 Build'
6544
  model: 'Le X900'
6545
  - regex: 'Le ?X526 Build'
@@ -6588,7 +6747,7 @@ Lenco:
6588
 
6589
  # lenovo
6590
  Lenovo:
6591
- regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|YT3-X50L|ZUK[ -_]|K50a40|TB-(8504F|X304F|X704V|X704A)|A2107A-H|S6000[ ;)]|Z2 Plus'
6592
  device: 'smartphone'
6593
  models:
6594
  - regex: 'Lenovo ?G780'
@@ -6612,7 +6771,7 @@ Lenovo:
6612
  - regex: 'TB2-X30[FL]'
6613
  model: 'Tab 2 A10-30'
6614
  device: 'tablet'
6615
- - regex: 'YT3-X50[FL]'
6616
  model: 'Yoga Tab 3'
6617
  device: 'tablet'
6618
  - regex: 'TB3-730X'
@@ -6636,6 +6795,15 @@ Lenovo:
6636
  - regex: 'Lenovo ?B8000(-[FH])?'
6637
  model: 'Yoga Tablet 10'
6638
  device: 'tablet'
 
 
 
 
 
 
 
 
 
6639
  - regex: 'Lenovo ?B6000(-[FH])?'
6640
  model: 'Yoga Tablet 8'
6641
  device: 'tablet'
@@ -6716,8 +6884,10 @@ Lenovo:
6716
  model: 'K5 Note'
6717
  - regex: '(?:Lenovo-)?A6020(?:a40|l36)(?: Build|\))'
6718
  model: 'K5 Vibe'
6719
- - regex: 'A6020a46(?: Build|\))'
6720
  model: 'K5 Vibe Plus'
 
 
6721
  - regex: 'k33a48(?: Build|\))'
6722
  model: 'K6'
6723
  - regex: 'k53a48(?: Build|\))'
@@ -6830,7 +7000,7 @@ Lexibook:
6830
 
6831
  # LG
6832
  LG:
6833
- regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))[);/ ]|NetCast|RS987|RS500|VS(?:50[01]|835|98[78]|99[56]|(410|415|425|500)PP)|Nexsus 5|LML(414D|211B|713D|212V)L|VK810 4G|VK815'
6834
  device: 'smartphone'
6835
  models:
6836
  - regex: 'LG-D325'
@@ -6843,7 +7013,9 @@ LG:
6843
  model: 'Zone 4'
6844
  - regex: 'LM-X220PM'
6845
  model: 'Tribute Empire'
6846
- - regex: 'LG-D85[0125]'
 
 
6847
  model: 'G3'
6848
  - regex: 'LG-D72[2458]'
6849
  model: 'G3 Beat'
@@ -6913,7 +7085,7 @@ LG:
6913
  model: 'Fortune 2'
6914
  - regex: 'LM-X410\.F[);/ ]'
6915
  model: 'Premier Pro'
6916
- - regex: 'LML414DL[);/ ]'
6917
  model: 'Premier Pro LTE'
6918
  - regex: 'LM-X525'
6919
  model: 'Q60'
@@ -7019,8 +7191,12 @@ LG:
7019
  model: 'Spirit'
7020
  - regex: '(?:LG)?C660'
7021
  model: 'Optimus Pro'
7022
- - regex: 'LML211BL|LML212VL'
7023
  model: 'Rebel 4'
 
 
 
 
7024
 
7025
  - regex: 'LG-V490'
7026
  model: 'G Pad 8.0'
@@ -7692,7 +7868,7 @@ MLLED:
7692
 
7693
  # Mobistel
7694
  Mobistel:
7695
- regex: '(Cynus[ _][^/;]+) Build'
7696
  device: 'smartphone'
7697
  model: '$1'
7698
 
@@ -7738,7 +7914,7 @@ Mofut:
7738
 
7739
  # motorola
7740
  Motorola:
7741
- regex: 'MOT(?!TO)|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|XT1021|XT180[3-5]|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\)|-0[1-5])?(?: Build|\))'
7742
  device: 'smartphone'
7743
  models:
7744
  # Explicit feature phone models
@@ -7823,6 +7999,8 @@ Motorola:
7823
  model: 'Droid Turbo'
7824
  - regex: '(?:MOT-|Motorola-)?XT10(?:28|3[1234]|68|69)'
7825
  model: 'Moto G'
 
 
7826
  - regex: '(?:MOT-|Motorola-)?XT180[3-5]'
7827
  model: 'Moto G5s Plus'
7828
  - regex: '(?:MOT-|Motorola-)?XT168[57]'
@@ -7839,6 +8017,8 @@ Motorola:
7839
  model: 'Moto Z'
7840
  - regex: '(?:MOT-|Motorola-)?XT1635(?:-0[1-3])?'
7841
  model: 'Moto Z Play'
 
 
7842
  - regex: '(?:MOT-|Motorola-)?XT1663'
7843
  model: 'Moto M'
7844
 
@@ -7895,7 +8075,7 @@ MTN:
7895
 
7896
  # myphone
7897
  MyPhone:
7898
- regex: '(?:MyPhone|MyPad|MyTab)[ _][^;/]+ Build|Cube_LTE|myTab10II|HAMMER[ _]ENERGY|HAMMER_AXE_M_LTE|Hammer Titan 2|C-Smart_pix|myPhone_Fun_8'
7899
  device: 'smartphone'
7900
  models:
7901
  - regex: 'MyPad[ _]([^;/]+) Build'
@@ -7911,15 +8091,21 @@ MyPhone:
7911
  model: 'Cube LTE'
7912
  - regex: 'HAMMER[ _]ENERGY'
7913
  model: 'Hammer Energy'
7914
- - regex: 'HAMMER_AXE_M_LTE'
7915
  model: 'Hammer Axe M LTE'
7916
  - regex: 'Hammer Titan 2'
7917
  model: 'Hammer Titan 2'
 
 
 
 
 
 
7918
  - regex: 'C-Smart_pix'
7919
  model: 'C-Smart Pix'
7920
  - regex: 'myPhone_Fun_8'
7921
  model: 'FUN 8'
7922
- - regex: 'MyPhone[ _]([^;/]+) Build'
7923
  model: '$1'
7924
 
7925
  # MyWigo
@@ -8126,7 +8312,7 @@ Noblex:
8126
 
8127
  # Nomi
8128
  Nomi:
8129
- regex: 'Nomi[ _-]|(C101010 Ultra2|i501[23]|i5032|i5050|i5532)[;/) ]'
8130
  device: 'smartphone'
8131
  models:
8132
  - regex: 'i501[23][;/) ]'
@@ -8140,6 +8326,9 @@ Nomi:
8140
  - regex: 'C101010 Ultra2'
8141
  model: 'Ultra 2'
8142
  device: 'tablet'
 
 
 
8143
  - regex: 'Nomi[ _-]([^;/]+) Build'
8144
  model: '$1'
8145
  - regex: 'Nomi[ _-]([^;/)]+)[;/)]'
@@ -8147,11 +8336,13 @@ Nomi:
8147
 
8148
  # NUU Mobile
8149
  NUU Mobile:
8150
- regex: 'NUU_|N(5702|5001)L[;)/ ]'
8151
  device: 'smartphone'
8152
  models:
8153
  - regex: 'NUU_A1'
8154
  model: 'A1'
 
 
8155
  - regex: 'N5702L'
8156
  model: 'G3'
8157
  - regex: '(N5001L)[;)/ ]'
@@ -8367,14 +8558,14 @@ Onda:
8367
 
8368
  # OnePlus
8369
  OnePlus:
8370
- regex: '(?:du_)?ONEPLUS|(?:A0001|A200[135]|A300[03]|A3010|A5000|A600[03]|A601[03]|E100[135]|GM191[03517]|GM190[013]|HD1901)(?: Build|\))'
8371
  device: 'smartphone'
8372
  models:
8373
  - regex: 'GM191[03517]'
8374
  model: '7 Pro'
8375
  - regex: 'GM190[013]'
8376
  model: '7'
8377
- - regex: 'HD1901'
8378
  model: '7T'
8379
  - regex: 'A0001'
8380
  model: 'One'
@@ -8399,12 +8590,12 @@ OnePlus:
8399
 
8400
  # oppo
8401
  OPPO:
8402
- regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|(?:X90[07][0679]|U707T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?|N520[79]|N5117|A33f|A33fw|A37fw?|PAAM00|PAC[T|M]00|PBAM00)[);/ ]|R7kf|R7plusf|R7Plusm|A1601|CPH[0-9]{4}|PCAM10|PADM00|PBBT00|PBBM[03]0|RMX18(0[1579]|11|3[13]|2[15]|[45]1|45)|CPH19(69|79|23|1[179])|RMX(1827|194[135]|19[01]1|1971|1921)|PC[CD]M00|PBAT00|PBBT30|PBCM[13]0|P[CB]E[MT]00|PBFM00|PAFM00'
8403
  device: 'smartphone'
8404
  models:
8405
  - regex: '(?:OPPO[ _]?)?U707T?[);/ ]'
8406
  model: 'Find Way S'
8407
- - regex: '(?:OPPO[ _]?)?CPH1979[);/ ]'
8408
  model: 'Reno Z'
8409
  - regex: 'CPH1945'
8410
  model: 'Reno2 Z'
@@ -8412,10 +8603,18 @@ OPPO:
8412
  model: 'F11 Pro'
8413
  - regex: 'CPH1911'
8414
  model: 'F11'
8415
- - regex: 'CPH1917'
8416
  model: 'Reno'
 
 
 
 
 
 
8417
  - regex: 'CPH1921'
8418
  model: 'Reno 5G'
 
 
8419
  - regex: 'PCCM00'
8420
  model: 'Reno 10X'
8421
  - regex: 'CPH1919'
@@ -8500,6 +8699,8 @@ OPPO:
8500
  model: 'A83'
8501
  - regex: '(?:OPPO[ _]?)?CPH1801[);/ ]'
8502
  model: 'A71'
 
 
8503
  - regex: '(?:OPPO[ _]?)?CPH18(0[35]|53)[);/ ]'
8504
  model: 'A3s'
8505
  - regex: '(?:OPPO[ _]?)?(?:CPH1809|PBAT00|PBBT30)[);/ ]'
@@ -8508,8 +8709,10 @@ OPPO:
8508
  model: 'A5 (2020)'
8509
  - regex: '(?:OPPO[ _]?)?CPH1938[);/ ]'
8510
  model: 'A9 (EN)'
8511
- - regex: 'CPH1937'
8512
  model: 'A9 (2020)'
 
 
8513
  - regex: '(?:OPPO[ _]?)?CPH18(19|21)[);/ ]'
8514
  model: 'F7'
8515
  - regex: '(?:OPPO[ _]?)?CPH1823[);/ ]'
@@ -8520,8 +8723,6 @@ OPPO:
8520
  model: 'R15 Pro'
8521
  - regex: '(?:OPPO[ _]?)?CPH1835[);/ ]'
8522
  model: 'R15'
8523
- - regex: '(?:OPPO[ _]?)?CPH1837[);/ ]'
8524
- model: 'A3'
8525
  - regex: '(?:OPPO[ _]?)?CPH1851[);/ ]'
8526
  model: 'AX5'
8527
  - regex: 'CPH1920'
@@ -8534,13 +8735,15 @@ OPPO:
8534
  model: 'K1'
8535
  - regex: 'RMX1811'
8536
  model: 'RealMe C1'
8537
- - regex: 'RMX194[135]'
8538
  model: 'RealMe C2'
8539
  - regex: 'RMX1831'
8540
  model: 'RealMe U1'
8541
  - regex: '(?:OPPO[ _]?)?(?:CPH187[15]|PAFM00)[);/ ]'
8542
  model: 'Find X'
8543
- - regex: '(?:OPPO[ _]?)?CPH1877[);/ ]'
 
 
8544
  model: 'R17 Pro'
8545
  - regex: '(?:OPPO[ _]?)?(?:CPH1879|PBE[MT]00)[);/ ]'
8546
  model: 'R17'
@@ -8550,11 +8753,13 @@ OPPO:
8550
  model: 'R17 Neo'
8551
  - regex: '(?:OPPO[ _]?)?(?:CPH1901|PBFM00)[);/ ]'
8552
  model: 'A7'
 
 
8553
  - regex: '(?:OPPO[ _]?)?CPH1903[);/ ]'
8554
  model: 'AX7'
8555
  - regex: '(?:OPPO[ _]?)?A37f(w)?(?: Build|\))'
8556
  model: 'A37f$1'
8557
- - regex: '(?:OPPO[ _]?)?PADM00'
8558
  model: 'A3'
8559
  - regex: '(?:OPPO[ _]?)?PBAM00'
8560
  model: 'A5'
@@ -8578,12 +8783,20 @@ OPPO:
8578
  model: 'Realme 3 Pro'
8579
  - regex: 'RMX1901'
8580
  model: 'Realme X'
 
 
 
 
 
 
8581
  - regex: 'RMX1921'
8582
  model: 'Realme XT'
8583
- - regex: 'RMX1911'
8584
  model: 'Realme 5'
8585
  - regex: 'RMX1971'
8586
  model: 'Realme 5 Pro'
 
 
8587
  - regex: '(PBBT00|PBBM00)[);/ ]'
8588
  model: 'A7x'
8589
  - regex: 'PCDM00[);/ ]'
@@ -8639,7 +8852,7 @@ Orange:
8639
  model: '$1 $2'
8640
  - regex: 'Orange[ _-](Dive)72[ ;/)]'
8641
  model: '$1 72'
8642
- - regex: 'Orange[ _-](Daytona|Dive (30|7[13])|Dublin|Fova|Gova|Hi 4G|Hiro|Kivo|Monte Carlo|Neva 80|Neva play|Nura|Reyo|Rise[_ ](3[034]|40|5[34])|Rono|Roya|San Francisco|Tactile internet 2|Tado|Yomi|Yumo|Zali)[ ;/)]'
8643
  model: '$1'
8644
  - regex: 'SPV[ \-]?([a-z0-9]+)'
8645
  model: 'SPV $1'
@@ -8658,6 +8871,14 @@ Ouki:
8658
  - regex: '(OK[AU][0-9]+[a-z]*) Build'
8659
  model: '$1'
8660
 
 
 
 
 
 
 
 
 
8661
  # Overmax
8662
  Overmax:
8663
  regex: 'OV-[a-z]+(?:[^;(/]*)[();/ ]|Qualcore 1010'
@@ -8679,7 +8900,7 @@ Overmax:
8679
 
8680
  # Oysters
8681
  Oysters:
8682
- regex: 'Oysters|T84ERI[ _]3G|T72HM(s_)?3G|(T74HMi|T84Bi)[_ ]4G'
8683
  device: 'tablet'
8684
  models:
8685
  - regex: 'Oysters ((?:Arctic|Indian|Atlantic|Pacific)[^/;]+) Build'
@@ -8687,6 +8908,8 @@ Oysters:
8687
  model: '$1'
8688
  - regex: '(T84ERI[ _]3G|T72HM(s_)?3G|(?:(T74HMi|T84Bi)[_ ]4G))'
8689
  model: '$1'
 
 
8690
  - regex: 'Oysters ([^/;]+)( Build|\))'
8691
  model: '$1'
8692
  # öwn
@@ -8718,13 +8941,16 @@ Panacom:
8718
 
8719
  # panasonic
8720
  Panasonic:
8721
- regex: 'Panasonic|PANATV[0-9]+|Viera/|P902i[);/ ]|Eluga[ _]|FZ-N1|P55 Novo 4G'
8722
  device: 'smartphone'
8723
  models:
8724
  - regex: 'Eluga[ _-]([^;/]+) Build'
8725
  model: 'Eluga $1'
8726
  - regex: 'Eluga[ _-]([^;/]+)[;/)]'
8727
  model: 'Eluga $1'
 
 
 
8728
  - regex: 'FZ-N1'
8729
  model: 'Toughpad'
8730
  - regex: 'P55 Novo 4G'
@@ -8799,7 +9025,7 @@ Pentagram:
8799
 
8800
  # philips
8801
  Philips:
8802
- regex: 'Philips|AND1E[);/ ]|NETTV/|PI3210G|TLE(821L|722G)'
8803
  device: 'smartphone'
8804
  models:
8805
  - regex: 'AND1E(?: TV)?[);/ ]'
@@ -8808,6 +9034,9 @@ Philips:
8808
  - regex: '(PI3210G)'
8809
  model: '$1'
8810
  device: 'tablet'
 
 
 
8811
  - regex: '(TLE821L)[);/ ]'
8812
  model: '$1 4G LTE'
8813
  device: 'tablet'
@@ -8856,11 +9085,15 @@ Pioneer:
8856
 
8857
  # Pixus
8858
  Pixus:
8859
- regex: 'Pixus|Ride[_ ]4G[;)\ ]'
8860
  device: 'tablet'
8861
  models:
8862
  - regex: 'Ride[_ ]4G'
8863
  model: 'Ride 4G'
 
 
 
 
8864
  - regex: 'Raze'
8865
  model: 'Raze'
8866
  device: 'smartphone'
@@ -8970,9 +9203,13 @@ Rokit:
8970
 
8971
  # Rombica
8972
  Rombica:
8973
- regex: 'SSQ-A0500[);/ ]'
8974
  device: 'tv'
8975
- model: 'Smart Stick 4K'
 
 
 
 
8976
 
8977
  # Rover
8978
  Rover:
@@ -9016,13 +9253,27 @@ Safaricom:
9016
  model: 'Neon Ray'
9017
 
9018
 
9019
- # Santin BiTBiZ
9020
- Santin BiTBiZ:
9021
- regex: 'BiTBiZ'
9022
  device: 'smartphone'
9023
  models:
9024
- - regex: 'BiTBiZ_V58'
9025
- model: 'V58'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9026
 
9027
  # Siemens
9028
  Siemens:
@@ -9480,6 +9731,18 @@ Samsung:
9480
  model: 'GALAXY S10+'
9481
  - regex: '(?:SAMSUNG-)?SM-G970[FU]'
9482
  model: 'GALAXY S10e'
 
 
 
 
 
 
 
 
 
 
 
 
9483
  - regex: '(?:SAMSUNG-)?SCH-I200'
9484
  model: 'GALAXY Stellar'
9485
  - regex: '(?:SAMSUNG-)?SCH-I829'
@@ -10272,11 +10535,13 @@ Positivo:
10272
 
10273
  # Prestigio
10274
  Prestigio:
10275
- regex: '(?:PMP|PAP|PMT|PSP)[0-9]+[a-z0-9_]+[);/ ]'
10276
  device: 'tablet'
10277
  models:
10278
  - regex: 'PMT3277_3G'
10279
  model: 'MultiPad Ranger 7.0 3G'
 
 
10280
  - regex: 'PMT3201_4G'
10281
  model: 'Grace 4G'
10282
  - regex: 'PSP5551DUO'
@@ -10315,18 +10580,22 @@ Sanyo:
10315
 
10316
  # Qilive (Auchan)
10317
  Qilive:
10318
- regex: 'Qilive [0-9][^;/]*|Q(8S55IN4G2|10S5[37]IN4G|10S5IN4GR|10S6IN4G|8S5IN4GP|6T7IN)'
10319
  device: 'smartphone'
10320
  models:
10321
  - regex: 'Q8S55IN4G2'
10322
  model: 'Q8 5.5" 4G'
 
 
10323
  - regex: 'Q8S5IN4GP'
10324
  model: 'Q8 5.1" 4G'
 
 
10325
  - regex: 'Q10S53IN4G'
10326
  model: 'Q10 5.3" 4G'
10327
  - regex: 'Q10S57IN4G'
10328
  model: 'Q10 5.7" 4G'
10329
- - regex: 'Q10S5IN4GR'
10330
  model: 'Q10 5.0" 4G'
10331
  - regex: 'Q10S6IN4G'
10332
  model: 'Q10 6.0" 4G'
@@ -10451,21 +10720,27 @@ Spice:
10451
 
10452
  # Sharp
10453
  Sharp:
10454
- regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?[);/ ]|SH-Z10|AQUOS|506SH|SHL22|FS80(1[08]|32|28|0[29])[);/ ]|TG-L900S'
10455
  device: 'smartphone'
10456
  models:
10457
  # explicit smartphone models
10458
  - regex: '506SH'
10459
  model: 'Aquos Xx3'
 
 
10460
  - regex: 'SH-Z10'
10461
  model: 'Aquos zero'
 
 
10462
  - regex: 'SH-02E'
10463
  model: 'Aquos Phone Zeta'
10464
  - regex: 'SH06D'
10465
  model: 'Aquos Phone SH-06D'
10466
  - regex: 'SHL22'
10467
  model: 'Aquos Phone SHL22'
10468
- - regex: 'FS8010'
 
 
10469
  model: 'Aquos S2'
10470
  - regex: 'FS8032'
10471
  model: 'Aquos S3'
@@ -10627,11 +10902,13 @@ Q-Touch:
10627
 
10628
  # T-Mobile
10629
  T-Mobile:
10630
- regex: 'T-Mobile[ _][a-z0-9 ]+|REVVL 2( PLUS)?[);/ ]'
10631
  device: 'smartphone'
10632
  models:
10633
  - regex: 'REVVL 2 PLUS'
10634
  model: 'REVVL 2 Plus'
 
 
10635
  - regex: 'REVVL 2[);/ ]'
10636
  model: 'REVVL 2'
10637
  - regex: 'T-Mobile[ _]([a-z0-9_ ]+) Build'
@@ -10735,7 +11012,7 @@ Tesco:
10735
 
10736
  # teXet
10737
  teXet:
10738
- regex: 'Texet|(NaviPad [^/;]*) Build|TM-(?:1046|1058|1057|1067|3000|3200R|3500|4003|4071|450[34]|451[30]|4377|4082R|550[83]|5010|5017|507[4-7]|5[23]77|6003|6906|702[13]|7055HD|709[69]|9747BT|9758|9751HD|9767|5513|520[410]|5505|507[13]|5581|7859|8044|9748[ _]3G|9720|7047HD[ _]3G|9757|9740|4982|4515|4083|500[3567]|5571|3204R|5016|8043|7047HD[ _]3G|8041HD|8066|705[23]|7041|8041HD|8051|8048|974[96]|973[78]W|974[10]|9743W|9750HD|7043XD|7049|7887|7037W|702[46])|TB-(771A|711A)|X-Force[\(-]?TM-5009\)?|X-Plus[\(-]?TM-5577\)?|X-pad (?:AIR 8|iX 7) 3G'
10739
  device: 'tablet'
10740
  models:
10741
  - regex: 'TM-9749'
@@ -10770,7 +11047,7 @@ teXet:
10770
  model: 'NaviPad TM-7887 3G'
10771
  - regex: 'TM-8066'
10772
  model: 'X-pad Rapid 8.2 4G'
10773
- - regex: '(TM-(?:1057|1067|6906|8043|9748[_ ]3G|9740|9757(?:[_ ]3G)?|7047HD[ _]3G|9747BT|9751HD|702[13]|705[23]|7041|9720|7047HD[_ ]3G|8044|8041HD|973[78]W|9743W|974[10]|9750HD|7043XD|7037W|702[46])|TB-(?:771A|711A|8041HD))'
10774
  model: '$1'
10775
  - regex: 'TM-4503'
10776
  device: 'smartphone'
@@ -10822,12 +11099,13 @@ teXet:
10822
 
10823
  # Telefunken
10824
  Telefunken:
10825
- regex: 'TEL-1013GIQA'
10826
- device: 'smartphone'
10827
  models:
10828
  - regex: 'TEL-1013GIQA'
10829
- device: 'tablet'
10830
  model: 'Giqa 10.1 3G'
 
 
10831
 
10832
  # Telego
10833
  Telego:
@@ -11055,7 +11333,7 @@ UTStarcom:
11055
 
11056
  # Ulefone
11057
  Ulefone:
11058
- regex: 'Ulefone|Power_[35]|S10_Pro|(Armor(?:[ _]2)?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?) Build'
11059
  device: 'smartphone'
11060
  models:
11061
  - regex: 'S10_Pro'
@@ -11080,7 +11358,7 @@ Ulefone:
11080
  model: 'Armor 2'
11081
  - regex: 'Armor Build'
11082
  model: 'Armor'
11083
- - regex: 'Power_([35])'
11084
  model: 'Power $1'
11085
  - regex: 'Ulefone[_ ](X|S1[ _]Pro|S[17])[);\ ]'
11086
  model: '$1'
@@ -11091,9 +11369,11 @@ Ulefone:
11091
 
11092
  # UMIDIGI
11093
  UMIDIGI:
11094
- regex: 'UMI(?:DIGI)?[ _]'
11095
  device: 'smartphone'
11096
  models:
 
 
11097
  - regex: 'UMI(?:DIGI)?[ _]([^/;]+) Build'
11098
  model: '$1'
11099
 
@@ -11165,6 +11445,9 @@ ViewSonic:
11165
  - regex: '(?:ViewSonic-)?V500[);/ ]'
11166
  model: 'V500'
11167
  device: 'smartphone'
 
 
 
11168
  - regex: '(?:ViewSonic-)?ViewPhone ?([^;/]+) Build'
11169
  model: 'ViewPhone $1'
11170
  device: 'smartphone'
@@ -11228,7 +11511,7 @@ Vertu:
11228
 
11229
  # Venso mobile
11230
  Venso:
11231
- regex: '(CX-508)[/;) ]'
11232
  device: 'smartphone'
11233
  model: '$1'
11234
 
@@ -11260,7 +11543,7 @@ Verykool:
11260
 
11261
  # Vestel
11262
  Vestel:
11263
- regex: 'Venus[ _](V[1-9]|Z[1-9]0)|V_?TAB|VP74|VT97PRO|VSP145M|VSP250G|VSP355[GS]'
11264
  device: 'smartphone'
11265
  models:
11266
  - regex: 'VT97PRO'
@@ -11290,6 +11573,8 @@ Vestel:
11290
  model: 'Venus V$1'
11291
  - regex: 'Venus[ _]Z([1-9]0)'
11292
  model: 'Venus Z$1'
 
 
11293
 
11294
  # Videocon
11295
  Videocon:
@@ -11303,7 +11588,7 @@ Videocon:
11303
 
11304
  # Vodafone
11305
  Vodafone:
11306
- regex: 'Vodafone[ _-]|Smart ?Tab ?(?:III? ?)?(?:|4G|7|10)[);/ -]|VodafoneSmartChat|VFD[ _][0-9]+[;/) ]|VFD320|VF6[89]5|VF-795|VF-895N'
11307
  device: 'smartphone'
11308
  models:
11309
  - regex: 'VFD 100'
@@ -11348,10 +11633,15 @@ Vodafone:
11348
  model: 'Smart 4 Power'
11349
  - regex: 'VodafoneSmartChat'
11350
  model: 'Smart Chat'
 
 
11351
  - regex: 'VF-795'
11352
  model: 'Smart Speed 6'
11353
  - regex: 'VF-895N'
11354
  model: 'Smart Prime 6'
 
 
 
11355
 
11356
  # explicit table models
11357
  - regex: 'VFD 1100'
@@ -11400,7 +11690,7 @@ Vodafone:
11400
 
11401
  # Vonino
11402
  Vonino:
11403
- regex: 'Vonino|Epic (?:E8|P7)|Gyga[ _](?:X|S|QS|XS)|Jax[ _](?:Q|QS|S|X|Mini)|Magnet[ _]M[19]|Navo_QS|Onyx_(QS|Z)|Orin_QS|Pluri[ _](?:[BCMQ]7|[CQ]8)|Sirius_QS|Volt[ _][XS]|Xavy_T7|Xylo[ _][XSP]|Zun[ _]X[OS]?'
11404
  device: 'smartphone'
11405
  models:
11406
  - regex: 'Zun[ _]XO'
@@ -11409,7 +11699,7 @@ Vonino:
11409
  model: 'Zun XS'
11410
  - regex: 'Zun[ _]X'
11411
  model: 'Zun X'
11412
- - regex: 'Xylo[ _](P|S|X)'
11413
  model: 'Xylo $1'
11414
  - regex: 'Volt[ _]S_A7'
11415
  model: 'Volt S A7'
@@ -11541,7 +11831,7 @@ Wexler:
11541
 
11542
  # Wiko
11543
  Wiko:
11544
- regex: '(?:WIKO[_ -])|(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink([^/;]*)|Highway([^/;]*)|Iggy|Stairway|Rainbow ?(Jam|Lite|Up)?|Darkside|Darkmoon|Darkfull|Darknight|Freddy|FEVER|Jerry[2]?|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa|Kite|Robby|Lenny[2-9]?|Slide|Sunset[2-9]?|Sunny[2-9]?|Tommy[2-9]?|PULP(?: Fab)?|Wax|HARRY|WIM Lite|Ridge(?: Fab)?|U FEEL(?: Prime| Lite)?|U PULSE(?: LITE)?|View XL|View Prime)(?: Plus)?(?: 4G)?(?: Build|$)|W_(?:C800|K[346]00)|LENNY[234]|SUNSET2|JERRY|Tommy3|PULP FAB 4G|WC300|W-V800-EEA'
11545
  device: 'smartphone'
11546
  models:
11547
  - regex: '(?:Wiko-)?Cink([^/;]*) Build'
@@ -11620,6 +11910,8 @@ Wiko:
11620
  model: 'Sunset 2'
11621
  - regex: '(?:WIKO-)?Sunset'
11622
  model: 'Sunset'
 
 
11623
  - regex: '(?:WIKO-)?Sunny2 Plus'
11624
  model: 'Sunny 2 Plus'
11625
  - regex: '(?:WIKO-)?Sunny2'
@@ -11660,6 +11952,8 @@ Wiko:
11660
  model: 'U Feel Prime'
11661
  - regex: '(?:WIKO-)?U FEEL'
11662
  model: 'U Feel'
 
 
11663
  - regex: '(?:WIKO-)?View XL'
11664
  model: 'View XL'
11665
  - regex: '(?:WIKO-)?View Prime'
@@ -11668,13 +11962,27 @@ Wiko:
11668
  model: 'View Lite'
11669
  - regex: 'W_C800'
11670
  model: 'View 2'
 
 
11671
  - regex: 'W-V800-EEA'
11672
  model: 'View 3 Lite'
 
 
 
 
 
 
11673
  - regex: 'Wiko ([^/;]+) Build'
11674
  model: '$1'
11675
  - regex: 'Wiko ([^/; ]+)'
11676
  model: '$1'
11677
 
 
 
 
 
 
 
11678
  # Wink
11679
  Wink:
11680
  regex: 'Wink_'
@@ -11758,15 +12066,17 @@ X-View:
11758
 
11759
  # Xiaomi
11760
  Xiaomi:
11761
- regex: 'Xiaomi(?!/MiuiBrowser)|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)[);/ ]|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|POCOPHONE|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-H0'
11762
  device: 'smartphone'
11763
  models:
11764
  # specific smartphone models
11765
  - regex: 'SKR-[AH]0'
11766
  model: 'Black Shark'
 
 
11767
  - regex: 'SKW-[AH]0'
11768
  model: 'Black Shark 2'
11769
- - regex: 'DLT-H0'
11770
  model: 'Black Shark 2 Pro'
11771
  - regex: 'Xiaomi_2014501|2014501 Build'
11772
  model: 'Hongmi 4G'
@@ -11829,6 +12139,12 @@ Xiaomi:
11829
  - regex: 'MI PAD[);/ ]'
11830
  model: 'Mi Pad'
11831
  device: 'tablet'
 
 
 
 
 
 
11832
  - regex: 'HM NOTE 1W (?:Build|MIUI)'
11833
  device: 'phablet'
11834
  model: 'Redmi Note'
@@ -12107,7 +12423,7 @@ ZYQ:
12107
 
12108
  # Toshiba
12109
  Toshiba:
12110
- regex: 'Toshiba|TSBNetTV/|portalmmm/[12].0 TS|T-01C|T-0[12]D|IS04|IS11T|AT1S0|AT300SE|AT(10-A|10[PL]E-A|100|200|270|300|330|374|400|470|500|503|570|703|830)'
12111
  device: 'smartphone'
12112
  models:
12113
  # explicit smartphone models
@@ -12123,6 +12439,9 @@ Toshiba:
12123
  model: 'Regza IS11T'
12124
 
12125
  # explicit tablet models
 
 
 
12126
  - regex: 'AT1S0'
12127
  model: 'Regza AT1S0'
12128
  device: 'tablet'
@@ -12161,6 +12480,8 @@ Vivax:
12161
  model: 'Fly 5 Lite'
12162
  - regex: 'VIVAX[ _]Fly3'
12163
  model: 'Fly 3'
 
 
12164
  - regex: 'SMART Point X5010'
12165
  model: 'Smart Point X5010'
12166
 
@@ -12291,6 +12612,8 @@ Fly:
12291
  model: 'Era Nano 3'
12292
  - regex: '(?:Fly_)?IQ440(?: Build|[;/\)])'
12293
  model: 'Energy'
 
 
12294
  - regex: '(?:Fly_)?IQ441(?: Build|[;/\)])'
12295
  model: 'Radiance'
12296
  - regex: '(?:Fly_)?IQ442(?: Build|[;/\)])'
@@ -12431,10 +12754,10 @@ Zenek:
12431
 
12432
  # Zopo
12433
  Zopo:
12434
- regex: '(?:ZOPO[_ ])?(Flash X3|ZP[0-9]{2,}[^/;]+)(?:\)| Build)'
12435
  device: 'smartphone'
12436
  models:
12437
- - regex: 'ZP998[);/ ]'
12438
  model: 'C2 II'
12439
  - regex: '(?:ZOPO_)?ZP980[+][);/ ]'
12440
  model: 'ZP980+'
@@ -12444,6 +12767,8 @@ Zopo:
12444
  model: 'Speed 7 Plus'
12445
  - regex: 'ZP951[);/ ]'
12446
  model: 'Speed 7'
 
 
12447
  - regex: 'ZP950[+h]?[);/ ]'
12448
  model: 'Leader Max'
12449
  - regex: 'ZP(?:900H?|910)[);/ ]'
@@ -12454,6 +12779,12 @@ Zopo:
12454
  model: 'Libero'
12455
  - regex: 'ZP330[);/ ]'
12456
  model: 'Color C'
 
 
 
 
 
 
12457
  - regex: 'ZP300[S+]?[);/ ]'
12458
  model: 'Field'
12459
  - regex: 'ZP200[+]?[);/ ]'
@@ -12462,17 +12793,21 @@ Zopo:
12462
  model: 'Pilot'
12463
  - regex: 'ZP1790[);/ ]'
12464
  model: 'Flash X2'
 
 
12465
  - regex: '(Flash X3|ZP[0-9]{2,}[^/;]+) Build'
12466
  model: '$1'
12467
 
12468
  # ZTE
12469
  ZTE:
12470
- regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|549J|551J|563J|569[HJ]|573J|575J|591J|595J|597J|60[19]J|907J|616J)|N951[0579]|N9180|N9101|N913[67]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|667T|768G|792|81[25]|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999)|Apex2|G (LTE|Lux)|Vec)[);/ ]|KIS II Max|Kis 3|Z930L|Blade A5 2019-T|BLADE A6 MAX'
12471
  device: 'smartphone'
12472
  models:
12473
  # explicit smartphone models
12474
  - regex: 'N799D[);/ ]'
12475
  model: 'Blade Eg'
 
 
12476
  - regex: 'N918St[);/ ]'
12477
  model: 'V5S'
12478
  - regex: 'N958St[);/ ]'
@@ -12517,9 +12852,9 @@ ZTE:
12517
  model: 'Nubia Z7 max'
12518
  - regex: 'NX508J[);/ ]'
12519
  model: 'Nubia Z9'
12520
- - regex: 'NX5[12]1J[);/ ]'
12521
  model: 'Nubia Z9 mini'
12522
- - regex: 'NX510J[);/ ]'
12523
  model: 'Nubia Z9 max'
12524
  - regex: 'NX512J[);/ ]'
12525
  model: 'Nubia Z9 max dual'
@@ -12539,8 +12874,14 @@ ZTE:
12539
  model: 'Nubia Z17'
12540
  - regex: 'NX569H[);/ ]'
12541
  model: 'Nubia Z17 Mini'
 
 
12542
  - regex: 'NX595J'
12543
  model: 'Nubia Z17S'
 
 
 
 
12544
  - regex: 'NX513J[);/ ]'
12545
  model: 'Nubia My Prague'
12546
  - regex: 'NX591J[);/ ]'
@@ -12551,6 +12892,10 @@ ZTE:
12551
  model: 'Nubia X6'
12552
  - regex: 'NX609J[);/ ]'
12553
  model: 'Nubia Red Magic'
 
 
 
 
12554
  - regex: 'NX573J'
12555
  model: 'Nubia M2 Lite'
12556
  - regex: 'NX907J[);/ ]'
@@ -12836,7 +13181,7 @@ Lemhoov:
12836
  model: '$1'
12837
  # MTC
12838
  MTC:
12839
- regex: 'MTC[ _](97[82]|970|982[OT]|982|1078)|SMART[ _](Race|Sprint|Run)[ _]4G|MTC975'
12840
  device: 'smartphone'
12841
  models:
12842
  - regex: 'MTC[ _](97[82]|970[H]?|982[OT]|982)'
@@ -12848,20 +13193,25 @@ MTC:
12848
  device: 'tablet'
12849
  - regex: 'SMART[ _]Race[ _]4G'
12850
  model: 'Smart Race 4G'
12851
- - regex: 'SMART[ _]Sprint[ _]4G'
12852
  model: 'Smart Sprint 4G'
12853
- - regex: 'SMART[ _]Run[ _]4G'
12854
  model: 'Smart Run 4G'
 
 
12855
 
12856
  # MegaFon
12857
  MegaFon:
12858
- regex: 'MFLoginPh|(MFLogin4|MS3B|SP-A5|SP-A20i)[)\; ]'
12859
  device: 'smartphone'
12860
  models:
12861
- - regex: 'MFLoginPh'
12862
  model: 'Login+'
12863
  - regex: 'MFLogin4'
12864
  model: 'Login 4 LTE'
 
 
 
12865
  - regex: 'MS3B'
12866
  model: 'Optima'
12867
  - regex: 'SP-A20i'
@@ -12898,7 +13248,7 @@ Unknown:
12898
 
12899
  # Starway
12900
  Starway:
12901
- regex: 'Andromeda[ _]S(707|84[05])[;/) ]'
12902
  device: 'tablet'
12903
  model: 'Andromeda S$1'
12904
 
@@ -12952,13 +13302,17 @@ X-TIGI:
12952
 
12953
  # Xiaolajiao
12954
  Xiaolajiao:
12955
- regex: '(LA2-(?:L|S[N]?))[);/ ]'
12956
  device: 'smartphone'
12957
- model: '$1'
 
 
 
 
12958
 
12959
  # Ritmix
12960
  Ritmix:
12961
- regex: 'RMD[-_](10(?:2[68]|5[89])|726)[);/ ]'
12962
  device: 'tablet'
12963
  model: 'RMD-$1'
12964
 
@@ -12997,9 +13351,9 @@ NEXBOX:
12997
  model: 'Smart 4G Speedy 5.0 Plus'
12998
 
12999
  Yandex:
13000
- regex: '(YNDX-000SB)[;)\ ]'
13001
  device: 'smartphone'
13002
- model: '$1'
13003
 
13004
  # FORME
13005
  FORME:
@@ -13025,12 +13379,343 @@ BDF:
13025
 
13026
  # Highscreen
13027
  Highscreen:
13028
- regex: '(Power Ice Max|Zera[ _][UFS])[;)/ ]'
13029
  device: 'smartphone'
13030
- model: '$1'
 
 
 
 
 
 
 
 
 
 
13031
 
13032
  # CVTE
13033
  CVTE:
13034
  regex: 'CVTE[_ ](MSD338_(:?1G|512M))[;)/ ]'
13035
  device: 'tv'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13036
  model: '$1'
5
  # @license http://www.gnu.org/licenses/lgpl.html LGPL v3 or later
6
  ###############
7
 
8
+ # Ace (https://www.acemobile.fr/)
9
+ Ace:
10
+ regex: 'BUZZ 1 Lite'
11
+ device: 'smartphone'
12
+ models:
13
+ - regex: 'BUZZ 1 Lite'
14
+ model: 'Buzz 1 Lite'
15
+
16
  'Tunisie Telecom':
17
  regex: 'StarTrail TT[);/ ]'
18
  device: 'smartphone'
64
 
65
  # HTC
66
  HTC:
67
+ regex: 'HTC|Sprint (?:APA|ATP)|ADR(?!910L)[a-z0-9]+|NexusHD2|Amaze[ _]4G[);/ ]|(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))|(Amaze[ _]4G|One ?[XELSV\+]+)[);/ ]|SPV E6[05]0|One M8|X525a|PG86100|PC36100|XV6975|PJ83100[);/ ]|2PYB2|2PZC5|0PJA10|0PJA2|HTV33'
68
  device: 'smartphone'
69
  models:
70
  # explicit smartphone models
76
  model: 'Evo 3G'
77
  - regex: 'PC36100[);/ ]'
78
  model: 'Evo 4G'
79
+ - regex: 'HTV33[);/ ]'
80
+ model: 'U11'
81
  - regex: 'PJ83100[);/ ]'
82
  model: 'One X'
83
  - regex: '(?:0PJA2|0PJA10)[);/ ]'
128
  model: '$1'
129
  - regex: 'HTC;(?: )?([a-z0-9 ]+)'
130
  model: '$1'
131
+ - regex: '(Desire|Sensation|Evo ?3D|IncredibleS|Wildfire|Butterfly)[ _]?([^;/)]+)(?: Build|\))'
132
  model: '$1 $2'
133
  - regex: '(Amaze[ _]4G|One ?[XELSV\+]*) Build'
134
  model: '$1'
415
 
416
  # HP
417
  HP:
418
+ regex: 'TouchPad/\d+\.\d+|hp-tablet|HP ?iPAQ|webOS.*P160U|HP (?:Pro )?Slate|HP [78]|Compaq [7|8]|HP; [^;/)]+'
419
  device: 'smartphone'
420
  models:
421
  - regex: 'HP Slate 6 Voice Tab'
427
  - regex: 'Compaq ([78][^/;]*) Build'
428
  model: 'Compaq $1'
429
  device: 'tablet'
430
+ - regex: 'HP Pro Slate 8'
431
+ model: 'Pro Slate 8'
432
+ device: 'tablet'
433
  - regex: 'HP Slate ?(.+) Build'
434
  model: 'Slate $1'
435
  device: 'tablet'
995
 
996
  # Alcatel
997
  Alcatel:
998
+ regex: 'Alcatel|Alc(?!or )[a-z0-9]+|One[ _]?Touch|idol3|(?:4003[AJ]|4009[ADEFIKMSX]|4013[DEJKMX]|4014[ADEKMX]|4015[ADNTX]|4016[ADX]|4017[ADEFSX]|4018[ADEFMX]|4024[EDX]|4027[ADNX]|4028[AEJS]|4032[ADEX]|4034[ADEFGX]|4035[ADXY]|4045[ADEX]|4047[ADFGNX]|4049[DEGMX]|4060[SW]|4114E|5001[ADJTU](?:_EEA|_RU|)?|5009[AD]|5010[DEGSUX]|5011A|5012[DFG]|5015[ADEX]|5016[AXJ]|5017[ABDEOX]|5019D|5022[EDX]|5023[EF]|5024[AD](?:_RU)?|5025[DEG]|5026[AD]|5027B|5032W|5033[AX]|5033D[ _]RU|5034D(_RU)?|5038[ADEX]|5041C|5042[ADEFGWX]|5044[ADGIKOPSTY]|5045[ADFGIJTXY]|5046[ADGIJSTUY]|5047[DIUY]|5049[EGSWZ]|5050[ASXY]|5051[ADEJMTWX]|5052[AD](_RU)?|5054[ADNSTWX]|5056[ADEGIJMNTUWX]|5057M|5058[AIY](_RU)?|5059[ADXYZ](_RU)?|5065[ADNWX]|5070D|5080[ADFQUX]|5085[ABCDGHIJNOQY]|5086[ADY]|5090[AIY]|5095[IKY]|5098[OS]|5099[ADYUI](_RU)?|5116J|5145A|6016[ADEX]|6036[AXY]|6037[BKY]|6039[AHJKY]|6043[AD]|6044D|6045[BFIKOY]|6050[AFY]|6055[ABDHIKPUYZ]|6058[ADX]|6060S|6062W|6070K|7040[ADEFKRT]|7041[DX]|7043[AEKY]|7044[AX]|7045Y|7048[ASWX]|7055A|7070X|8030Y|8050[DEGX]|8063|9001[DIX]|9002X|9003[AX]|9024O|9005X|9026X|9007[ATX]|9008[ADIJNTUX]|9010X|9022X|9203A|A570BL|I213|I216X)[);/ ]|TIMXL'
999
  device: 'smartphone'
1000
  models:
1001
  - regex: '(?:5022[EDX]|5070D)[);/ ]'
1062
  model: 'One Touch Idol 2'
1063
  - regex: '5027B[);/ ]'
1064
  model: 'One Touch Dawn'
1065
+ - regex: '5024[AD](?:_RU)?[);/ ]'
1066
  model: '1S'
1067
+ - regex: '5034D(_RU)?[);/ ]'
1068
  model: '3L'
1069
  - regex: '7040[RT][);/ ]'
1070
  model: 'One Touch Fierce 2'
1158
  - regex: '9203A[);/ ]'
1159
  model: 'A3 7" 3G'
1160
  device: 'tablet'
1161
+ - regex: '9026X[);/ ]'
1162
+ model: 'A3 10"'
1163
+ device: 'tablet'
1164
  - regex: '5085[BQ][);/ ]'
1165
  model: 'A5'
1166
  - regex: '5085[ADHIJY][);/ ]'
1264
  model: '1'
1265
  - regex: '5009[AD][);/ ]'
1266
  model: '1C'
1267
+ - regex: '5001[ADJTU](?:_EEA|_RU|)?[);/ ]'
1268
+ model: '1V'
1269
+ - regex: '5059[ADXYZ](_RU)?[);/ ]'
1270
  model: '1X'
1271
+ - regex: '5052[AD](_RU)?[);/ ]'
1272
  model: '3'
1273
+ - regex: '(?:5032W|5099[ADYUI](_RU)?)[);/ ]'
1274
  model: '3V'
1275
  - regex: '5026[AD][);/ ]'
1276
  model: '3C'
1277
+ - regex: '5058[AIY](_RU)?[);/ ]'
1278
  model: '3X'
1279
  - regex: '5086[ADY][);/ ]'
1280
  model: '5'
1297
 
1298
  # Allview
1299
  Allview:
1300
+ regex: 'Allview|A4You|A5_(?:Easy(?:_TM)?|Ready(?:_TM)?|Quad|Quad_Plus_TM)|A[56789]_Lite|A5Smiley|A6_Duo|A10_Lite_2019|A10_Plus|AX2_Frenzy|AX4Nano|AX5NanoQ|C6_Duo|E[23]_Living|E3_(?:Jump|Sign)|E4_Lite|M9_Connect|P(?:43_Easy|[5689]_Energy|6_Energy_Lite|[68]_Energy_Mini(?:_TM)?|(41|[458])_eMagic(?:_TM)?|[589](?:_)?Life(?:_TM)?|[567]_Lite(?:_TM)?|6_plus|[45678]_Pro|7_Seon|10_Life|10_Max|10_Style|7_Xtreme|6_Qmax|4_Quad)|V(?:[13]_Viper|1_Viper_I|2_Viper_(?:E|I|S|X|X_plus|Xe))|X(?:[1234]_Soul_Xtreme|[12345]_Soul|3_Soul_Lite|[23456]_Soul_Mini(?:_TM)?|4_Soul_Mini_S(?:_TM)?|[234]_Soul_Style(?:_TM)?|2_Soul_Style_Plus|2_Twin)|Viva_(H801|100[13]G|H1001_LTE)'
1301
  device: 'smartphone'
1302
  models:
1303
  - regex: 'A4You'
1356
  model: 'P$1 Life'
1357
  - regex: 'P10_Life'
1358
  model: 'P10 Life'
1359
+ - regex: 'P10_Max'
1360
+ model: 'P10 Max'
1361
  - regex: 'P10_Style'
1362
  model: 'P10 Style'
1363
  - regex: 'V([12])_Viper_I4G(?:_TM)?'
1378
  model: 'X$1 Soul Lite'
1379
  - regex: 'X4_Soul_Mini_S(?:_TM)?'
1380
  model: 'X4 Soul Mini S'
1381
+ - regex: 'X([23456])_Soul_Mini(?:_TM)?'
1382
  model: 'X$1 Soul Mini'
1383
  - regex: 'X3_Soul_PLUS'
1384
  model: 'X3 Soul Plus'
1433
  - regex: 'Allview3SpeedQuad'
1434
  device: 'tablet'
1435
  model: 'Alldro 3 Speed Quad'
1436
+ - regex: 'Viva_(H801|100[13]G|H1001_LTE)'
1437
  device: 'tablet'
1438
+ model: 'Viva $1'
1439
  - regex: 'ALLVIEW ?SPEEDI'
1440
  device: 'tablet'
1441
  model: 'Speed I'
1525
 
1526
  # Ainol
1527
  Ainol:
1528
+ regex: 'Numy|novo[0-9]|Novo 10 Hero'
1529
  device: 'tablet'
1530
  models:
1531
  - regex: 'Numy 3G AX1'
1532
  model: 'Novo 7 Numy AX1 3G'
1533
  - regex: 'Numy_3G_AX3'
1534
  model: 'Numy AX3 Sword'
1535
+ - regex: 'Numy3GTalos'
1536
+ model: 'Numy 3G Talos'
1537
  - regex: 'Numy_3G_BW1'
1538
  model: 'Numy 3G Talos 2'
1539
+ - regex: '(Novo 10 Hero QuadCore)'
1540
+ model: '$1'
1541
 
1542
  - regex: 'Numy[ _]([^;/]+) Build'
1543
  model: 'Numy $1'
1672
 
1673
  # Assistant
1674
  Assistant:
1675
+ regex: '(AS[-_](?:502|543[1-6]|44[12]1|541[12]|54[23]1|6431|401L)|AP-(?:109|721N|753G|7[25]7G|10[68]|107G|110N|941))[;/)_ ]'
1676
  device: 'smartphone'
1677
  models:
1678
  - regex: 'AS[-_]401L '
1689
  model: 'Unami'
1690
  - regex: 'AS-5431'
1691
  model: 'Prima'
1692
+ - regex: 'AS-502'
1693
+ model: 'Shot'
1694
  - regex: 'AS-5435'
1695
  model: 'Shine'
1696
  - regex: 'AS-5436[ _]'
1707
  - regex: 'AP-941'
1708
  model: 'AP-941'
1709
  device: 'tablet'
1710
+ - regex: 'AP-108'
1711
+ model: 'Cetus'
1712
+ device: 'tablet'
1713
  - regex: 'AP-106'
1714
  model: 'AP-106 Force'
1715
  device: 'tablet'
1716
+ - regex: '(AP-(?:109|7[25]7G|753G|107G|110N))[/;) ]'
1717
  device: 'tablet'
1718
  model: '$1'
1719
 
1720
  # Ark
1721
  Ark:
1722
+ regex: '(ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))|EDGE A5HD|ICON (R40\+|R45)|Impulse[ _](P[12])|Wizard_1[/;) ]'
1723
  device: 'smartphone'
1724
  models:
1725
+ - regex: '(?:ARK[_ -])?Benefit[_ -]([^/;]*)(?: Build|\))'
1726
  model: 'Benefit $1'
1727
  - regex: 'Impulse[ _]P1\+'
1728
  model: 'Impulse P1 Plus'
1749
 
1750
  # Asus
1751
  Asus:
1752
+ regex: 'Asus|Transformer|TF300T|Slider SL101|PadFone|ME302(?:C|KL)|ME301T|ME371MG|ME17(?:1|2V|3X)|(?:K0[01][0-9a-z]|P(?:00[18ACIL]|01[MTVWYZ]|01MA|01T_1|02[13478])(?: Build|\))|X015D|X018D|X003|X00[7ABT]D|Z00D|Z00[MTY]D|Z01[7FGHKMR]D)[);/ ]|G553KL|ZB(631|602|633|55[135]|50[01])KL|ZC(55[134]|520|600)KL|ZA550KL|ZE(520|620|55[2345])KL|ZD55[23]KL|ZS(6[236]0|55[10])KL|ZB(500KG|601KL)'
1753
  device: 'smartphone'
1754
  models:
1755
  # explicit tablet models
1876
  model: 'ZenFone Max M1'
1877
  - regex: '(?:ASUS_)?(ZB601KL)'
1878
  model: 'ZenFone Max Pro M1'
1879
+ - regex: '(?:ASUS_)?(X01([AB]D)|ZB633KL)[);/ ]'
1880
  model: 'ZenFone Max M2'
1881
  - regex: '(?:ASUS_)?(?:Z00[AD]|Z008D|Z008|Z00AD[AB]?)'
1882
  model: 'ZenFone 2'
1884
  model: 'ZenFone Live'
1885
  - regex: '(?:ASUS_)?X00RD'
1886
  model: 'ZenFone Live L1'
1887
+ - regex: 'G553KL'
1888
+ model: 'ZenFone Lite L1'
1889
  - regex: '(?:ASUS_)Z00YD'
1890
  model: 'Live'
1891
  - regex: '(?:ASUS_)?(?:Z00[ERLMT]D|Z011D)'
1900
  model: 'ZenFone 5 Lite'
1901
  - regex: '(?:ASUS_)?(?:Z01RD|ZS620KL)'
1902
  model: 'ZenFone 5Z'
1903
+ - regex: '(?:ASUS_)?(?:T00G|Z002|ZS630KL|I01WD[X]?)'
1904
  model: 'ZenFone 6'
1905
  - regex: '(?:ASUS_)?Z010D'
1906
  model: 'ZenFone Max'
1928
  model: 'ZenFone 3 Pegasus'
1929
  - regex: '(?:ASUS_)?(ZE553KL|Z01HD)'
1930
  model: 'ZenFone 3 Zoom'
1931
+ - regex: '(?:ASUS_)?ZS550KL'
1932
+ model: 'ZenFone 3 Deluxe'
1933
  - regex: '(?:ASUS_)?Z00UD'
1934
  model: 'ZenFone Selfie'
1935
  - regex: '(?:ASUS_)?(Z016[DS]|Z01FD)'
1962
  model: 'ZenFone Zoom'
1963
  - regex: '(?:ASUS_)?Z01QD'
1964
  model: 'ROG Phone'
1965
+ - regex: '(?:ASUS_)?(I001D[ABCE]?|ZS660KL)'
1966
  model: 'ROG Phone 2'
1967
 
1968
  # general detections
2135
 
2136
  # Blackview
2137
  Blackview:
2138
+ regex: '(BV([2456789]000|(5[589]|9[156])00|6800)(?:[ _](?:PRO))?|(P10000(?:[ _](?:PRO))?)|omega[ _]pro|Alife[ _][PS]1|Heatwave|DM550|BV9700Pro|(?<!Lenovo[_ ])A60(?:Pro)?\))'
2139
  device: 'smartphone'
2140
  models:
2141
  - regex: 'A60Pro\)'
2148
  model: '$1 Pro'
2149
  - regex: 'BV9000Pro-F'
2150
  model: 'BV9000 Pro F'
2151
+ - regex: '(BV([48]000|9[56]00|6800))Pro'
2152
  model: '$1 Pro'
2153
  - regex: '(BV([2456789]000|(5[589]|9[15])00)(?:[ _](?:PRO))?)'
2154
  model: '$1'
2177
 
2178
  # Black Fox
2179
  'Black Fox':
2180
+ regex: 'BMM[ _-]?((44[123]D|441S|431D|533D|54[12]S|541[AB]|54[123]D|543S|531[ABD]))[;/) ]'
2181
  device: 'smartphone'
2182
  models:
2183
  - regex: 'BMM443D'
2184
  model: 'B7 Fox+'
2185
+ - regex: 'BMM441S'
2186
+ model: 'B8 Fox'
2187
  - regex: 'BMM442D'
2188
  model: 'B7'
2189
  - regex: 'BMM531D'
2192
  model: 'B5'
2193
  - regex: 'BMM541A'
2194
  model: 'B5+'
2195
+ - regex: 'BMM543[DS]'
2196
  model: 'B4'
2197
  - regex: 'BMM441D'
2198
  model: 'B4 Mini'
2237
 
2238
  # Brondi
2239
  Brondi:
2240
+ regex: 'Brondi[ _]|(?:CENTURION|GLADIATOR| GLORY|LUXURY|SENSUELLE|VICTORY)(?:[ _-]?[2-6])?[);/ ]|Surfing Tab'
2241
  device: 'smartphone'
2242
  models:
2243
+ - regex: 'Brondi[ _](620 SZ|730_4G_HD)[);/ ]'
2244
+ model: '$1'
2245
  - regex: 'CENTURION(?:[ _-]?([2-6]))?[);/ ]'
2246
  model: 'CENTURION $1'
2247
  - regex: 'GLADIATOR(?:[ _-]?([2-6]))?[);/ ]'
2272
 
2273
  # Vivo
2274
  Vivo:
2275
+ regex: '((?:VIV-|BBG-)?vivo)|V1801A0|V1730(D[AT]|GA)|V1813B[AT]|V1818T|V1731CA|V1809[AT]|V1813[AT]|V1901A|V18[13]8A|V1932[AT]|V1814A'
2276
  device: 'smartphone'
2277
  models:
2278
  - regex: '(?:VIV-|BBG-)?vivo[ _]1601[);/ ]'
2279
  model: 'V5'
2280
  - regex: 'V1932[AT]'
2281
  model: 'S5'
2282
+ - regex: 'V1801A0'
2283
+ model: 'Z1'
2284
+ - regex: 'V1730D[AT]'
2285
+ model: 'Z1i'
2286
  - regex: 'V1813B[AT]'
2287
  model: 'Z3'
2288
+ - regex: 'V1730GA'
2289
+ model: 'Z3x'
2290
  - regex: 'Vivo ONE'
2291
  model: 'One'
2292
  - regex: 'X9Plus'
2293
  model: 'X9 Plus'
2294
  - regex: 'X20Plus'
2295
  model: 'X20 Plus'
2296
+ - regex: 'V1809[AT]'
2297
  model: 'X23'
2298
  - regex: 'V1818[AT]|vivo 181[45]'
2299
  model: 'Y93'
2337
  model: 'Y71'
2338
  - regex: 'vivo 1725'
2339
  model: 'X21'
2340
+ - regex: 'V1814A'
2341
+ model: 'X21S'
2342
  - regex: 'V1838A'
2343
  model: 'X27'
2344
  - regex: 'vivo 1727'
2452
  model: 'Polaris $1'
2453
  - regex: 'Atlantis[_ ](1001A|1010A|A10\.G402)'
2454
  model: 'Atlantis $1'
2455
+ - regex: 'Blaupunkt (SL 0[124]|SM 01)'
2456
  device: 'smartphone'
2457
  model: '$1'
2458
 
2874
 
2875
  # Casper
2876
  Casper:
2877
+ regex: 'CASPER_|VIA[- _](T7D|A3|F[12]|G4|M4|L8|P2|V8C|A1_Plus|A1|S10|S|T17_M|T17)[);/ ]'
2878
  device: 'smartphone'
2879
  models:
2880
+ - regex: 'CASPER_VIA_(G1|E1|[AE]2|M[123]|V[35689]|V10)[);/ ]'
2881
  model: 'VIA $1'
2882
+ - regex: 'CASPER_VIA_E1c'
2883
+ model: 'VIA E1C'
2884
+ - regex: 'VIA[- _](T7D|S10|L8|T17_M|T17)[);/ ]'
2885
  model: 'VIA $1'
2886
  device: 'tablet'
2887
+ - regex: 'VIA_(A3|F[12]|G4|M4|P2|S|V8C|A1_Plus|A1)'
2888
+ model: 'VIA $1'
2889
 
2890
+ # Cat (Caterpillar, Catphones)
2891
  Cat:
2892
+ regex: 'Cat ?(tablet|stargate|nova)|B15Q|CAT B35'
2893
  device: 'tablet'
2894
  models:
2895
  - regex: 'B15Q'
2896
  model: 'B15Q'
2897
  device: 'smartphone'
2898
+ - regex: 'CAT B35'
2899
+ model: 'B35'
2900
+ device: 'smartphone'
2901
  - regex: 'Cat ?(?:tablet)? ?((?:Galactica|Nova|StarGate|PHOENIX)[^/;]*) Build'
2902
  model: '$1'
2903
  - regex: 'Cat ?tablet'
2972
  model: 'Flare S6 Plus'
2973
  - regex: 'FLARE S6 POWER'
2974
  model: 'Flare S6 Power'
2975
+ - regex: 'Flare S6'
2976
+ model: 'Flare S6'
2977
  - regex: 'Flare(?:[ _])?(4|A[13]|J[135]|P[13]|S4|X2)'
2978
  model: 'Flare $1'
2979
  - regex: 'OMEGA HD 4'
3096
 
3097
  # Condor
3098
  Condor:
3099
+ regex: 'Allure M[13]|Griffe T[256789]|TGW[-]?(710G|709)|(?:PGN\-?[456][012][0-9]|PHS\-601|PHQ520|PKT\-301|Plume (?:H1|L[123]|P8))[;/) ]|CTAB[^/;]+ Build'
3100
  device: 'smartphone'
3101
  models:
3102
  - regex: 'CTAB([^/;]+) Build'
3103
  device: 'tablet'
3104
  model: 'CTAB $1'
3105
+ - regex: '(TGW)-?(710G|709)[);/ ]'
3106
+ device: 'tablet'
3107
+ model: '$1 $2'
3108
 
3109
  - regex: 'PHS\-601'
3110
  model: 'C8'
3114
  model: 'C7 Mini'
3115
  - regex: 'PGN\-?409'
3116
  model: 'Plume P4'
3117
+ - regex: 'PKT\-?301'
3118
+ model: 'C2'
3119
  - regex: 'PGN\-?504'
3120
  model: 'C5'
3121
  - regex: 'PGN\-?505'
3134
  model: 'Allure A9 Plus'
3135
  - regex: 'PGN\-?513'
3136
  model: 'Griffe G4'
3137
+ - regex: 'PHQ520'
3138
+ model: 'Griffe G5'
3139
  - regex: 'PGN\-?514'
3140
  model: 'Plume P7'
3141
  - regex: 'PGN\-?515'
3146
  model: 'Plume P6'
3147
  - regex: 'PGN\-?521'
3148
  model: 'Griffe G4 Plus'
3149
+ - regex: 'Griffe T2'
3150
+ model: 'Griffe T2'
3151
+ - regex: 'Griffe T5'
3152
+ model: 'Griffe T5'
3153
  - regex: 'Griffe T6'
3154
  model: 'Griffe T6'
3155
+ - regex: 'Griffe T7'
3156
+ model: 'Griffe T7'
3157
+ - regex: 'Griffe T8 Plus'
3158
+ model: 'Griffe T8 Plus'
3159
+ - regex: 'Griffe T9'
3160
+ model: 'Griffe T9'
3161
  - regex: 'PGN\-?522'
3162
  model: 'P6 Plus'
3163
  - regex: 'PGN\-?523'
3184
  model: 'Allure A8 Plus'
3185
  - regex: 'PGN\-?613'
3186
  model: 'Allure A55 Plus'
3187
+ - regex: 'Plume H1'
3188
+ model: 'Plume H1'
3189
  - regex: 'Plume L1'
3190
  model: 'Plume L1'
3191
  - regex: 'Plume L2 Pro'
3192
  model: 'Plume L2 Pro'
3193
+ - regex: 'Plume L3 Plus'
3194
+ model: 'Plume L3 Plus'
3195
+ - regex: 'Plume P8 Pro'
3196
+ model: 'Plume P8 Pro'
3197
 
3198
  - regex: 'PGN\-?([0-9]{3})'
3199
  model: 'PGN-$1'
3200
 
3201
  # Coolpad
3202
  Coolpad:
3203
+ regex: '(?:YL-)?Coolpad|8190Q[ ;/\)]|(8295|5860S) Build|CP8676_I0[23] Build|CP8298_I00 Build|REVVLPLUS C3701A|VCR-[AI]0|C106-7'
3204
  device: 'smartphone'
3205
  models:
3206
+ - regex: 'VCR-[AI]0'
3207
  model: 'Cool Play 6'
3208
  - regex: 'REVVLPLUS C3701A'
3209
  model: 'REVVL Plus'
3247
 
3248
  # Crosscall
3249
  Crosscall:
3250
+ regex: 'Crosscall|ODYSSEY_Plus|Odyssey S1|Trekker-[MSX][1234]|Action-X3|Core-X3'
3251
  device: 'smartphone'
3252
  models:
3253
  - regex: 'Action-X3'
3254
  model: 'Action-X3'
3255
+ - regex: 'Core-X3'
3256
+ model: 'Core-X3'
3257
  - regex: 'Crosscall ([^;/]+) Build'
3258
  model: '$1'
3259
  - regex: 'ODYSSEY_Plus'
3286
 
3287
  # CUBOT
3288
  CUBOT:
3289
+ regex: 'CUBOT|RAINBOW 2'
3290
  device: 'smartphone'
3291
  models:
3292
  - regex: 'CHEETAH 2'
3293
  model: 'Cheetah 2'
3294
+ - regex: 'RAINBOW 2'
3295
+ model: 'Rainbow 2'
3296
  - regex: 'DINOSAUR'
3297
  model: 'Dinosaur'
3298
  - regex: 'KING KONG'
3425
 
3426
  # DEXP
3427
  DEXP:
3428
+ regex: 'DEXP|(?:Ursus|Ixion)[ _]([^;/)]+)|H135[ _]Build|(ML450|MS[56]50|BL150|BS155|BS160|BS550|BS650|AL[12]40)[);/ ]'
3429
  device: 'smartphone'
3430
  models:
3431
 
3432
  - regex: 'Ixion[_ ]([^;/]+)(?: Build|\))'
3433
  model: 'Ixion $1'
3434
+ - regex: '(ML450|MS[56]50)[);/ ]'
3435
+ model: 'Ixion $1'
3436
 
3437
+ - regex: 'Ursus ([^;/)]+)(?: Build|\))'
3438
  model: 'Ursus $1'
3439
  device: 'tablet'
3440
 
3441
  - regex: 'H135[ _]Build'
3442
  model: 'Atlas'
3443
  device: 'desktop'
3444
+ - regex: '(BL150|BS155|BS160|BS550|BS650|AL[12]40)[);/ ]'
3445
  model: '$1'
3446
  - regex: 'DEXP[ _]([^;/]+) Build'
3447
  model: '$1'
3493
 
3494
  # Digma
3495
  Digma:
3496
+ regex: 'Digma[_ ]([^;/]+) Build|HIT HT707[10]MG|CITI 1902 3G|CITI Z530 3G|(CITI[_ ](?:[A-Z0-9]+)[_ ][34]G)[ _]C[ST](500[67]PG|8209MG|8139ML)|HIT 4G|HT7074ML|IDX5|(iDx10|iDx7)|MVM900H(?:WZ|C)|MVM908HCZ|(iDxD8 3G|iDxD10 3G|iDrQ10 3G|iDxD[45]|iDxQ5|iD[nx]D7(?:[_ ]3G)?)|PS604M|PT452E|Linx A400 3G LT4001PG|Linx C500 3G LT5001PG|Linx PS474S|LS504[01]PL|LT40(47|54)MG|LS405[01]MG|LS5053ML|LT5048MG|LT5052ML|HT5035PG|HT4039PG|LT4049PG|NS6902QL|NS9797MG|TT1004PG|((?:Optima|Platina|Plane)[ _](?:[EM])?(?:[0-9\.ST]+|Prime)(?:[ _][43]G)?)|(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
3497
  device: 'smartphone'
3498
  models:
3499
  - regex: 'HIT HT707[10]MG'
3505
  model: 'HIT Q500 3G'
3506
  - regex: 'HT4039PG'
3507
  model: 'HIT Q401 3G'
3508
+ - regex: 'TT1004PG'
3509
+ model: 'Optima 10.4 3G'
3510
  device: 'tablet'
3511
  - regex: '(VOX[ _](?:[0-9\.A-Z]+)[_ ][43]G)'
3512
  model: '$1'
3546
  - regex: 'MVM908HCZ'
3547
  model: 'iDx9'
3548
  device: 'tablet'
3549
+ - regex: '(iD(?:xD10|rQ10|xD7)[_ ]3G)'
3550
  model: '$1'
3551
  device: 'tablet'
3552
  - regex: '(iDx10|iDx7)'
3559
  - regex: '(CITI 1902 3G)'
3560
  model: '$1'
3561
  device: 'tablet'
3562
+ - regex: '(CITI Z530 3G)'
3563
+ model: '$1'
3564
  - regex: '(CITI_8527_4G)'
3565
  model: '$1'
3566
  device: 'tablet'
3570
  - regex: 'iDxD8 3G'
3571
  model: 'D-Plane2 8'
3572
  device: 'tablet'
3573
+ - regex: '(iDnD7)'
3574
  model: '$1'
3575
  device: 'tablet'
3576
  - regex: 'NS6902QL'
3600
 
3601
  # Doogee
3602
  Doogee:
3603
+ regex: 'DOOGEE[ _-]|Valencia2_Y100pro|X5max(?:[_ ]PRO)?|(KISSME|BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)[);/ ]|BL[579]000[);/ ]|BL12000|BL5500[_ ]Lite|X9 Mini'
3604
  device: 'smartphone'
3605
  models:
3606
  - regex: 'Valencia2_Y100pro'
3615
  model: 'BL12000'
3616
  - regex: 'KISSME-DG580'
3617
  model: 'Kissme DG580'
3618
+ - regex: 'X9 Mini'
3619
+ model: 'X9 Mini'
3620
  - regex: '(X5max(?:[_ ]PRO)?)'
3621
  model: '$1'
3622
  - regex: '(?:DOOGEE[ _-])?(BIGBOY|COLLO[23]?|DAGGER|DISCOVERY2?|FIND|HOTWIND|LATTE|MAX|MINT|MOON|PIXELS|RAINBOX|TURBO|VALENCIA|Valencia2_Y100pro|VOYAGER2?|TITANS2?)[ -_](DG[0-9]+C?)[);/ ]'
3860
 
3861
  # Senseit
3862
  Senseit:
3863
+ regex: 'SENSEIT[ _]?([^;/)]+)( Build|\))'
3864
  device: 'smartphone'
3865
  model: '$1'
3866
 
3867
  # Sony & Sony Ericsson (combined as they are mixed up)
3868
  Sony:
3869
+ regex: 'Sony(?: ?Ericsson)?|SGP|Xperia|([456]0[12]|701)SO|C1[569]0[45]|C2[01]0[45]|C230[45]|C530[236]|C550[23]|C6[56]0[236]|C6616|C68(?:0[26]|[34]3)|C69(?:0[236]|16|43)|D200[45]|D21(?:0[45]|14)|D22(?:0[236]|12|43)|D230[2356]|D240[36]|D25(?:02|33)|D510[236]|D530[36]|D5316|D5322|D5503|D58[03]3|D65(?:0[23]|43|63)|D66[03458]3|D66[14]6|D6708|E(?:20[0345]3|2006|210[45]|2115|2124|230[36]|2312|23[356]3|530[36]|53[3456]3|5506|55[356]3|56[46305][36]|58[02]3|65[35]3|66[0358]3|68[358]3)|I[34]312|I4332|F311[12356]|F331[13]|F321[12356]|F5[13]21|F5122|F813[12]|F833[12]|G312[135]|G311[26]|G322[136]|G3212|G331[123]|G3412|G3416|G342[136]|G823[12]|G834[123]|G8[14]4[12]|H(?:3113|3123|3133|3213|3223|3311|3321|4113|4133|4213|4233|4311|4331|4413|4433|82[167]6|83[12]4|8416|9436)|(?:WT|LT|SO|ST|SK|MK)[0-9]+[a-z]+[0-9]*(?: Build|\))|X?L39H|XM50[ht]|W960|portalmmm/2\.0 K|S3[69]h|SOL2[246]|SOV3[1234567]|X10[ia]v?|E1[05][ai]v?|MT[0-9]{2}[a-z]? Build|SO-0(?:[12]C|[345]D|[234]E|[1-5]F|[1234]G|[134]H|[1234]J|[12]K|1L)|R800[aix]|J9110|J81[17]0|I[34]113|I3[12]23|I42[19]3|H9493|H8296|H8166|H4493|LiveWithWalkman|BRAVIA'
3870
  device: 'smartphone'
3871
  models:
3872
  # SONY ERICSSON: explicit smartphone models
3993
  device: 'feature phone'
3994
 
3995
  # SONY: explicit smartphone models
3996
+ - regex: 'SO-04F'
3997
+ model: 'Xperia A2'
3998
  - regex: 'SO-04G'
3999
  model: 'Xperia A4'
4000
  - regex: '(?:Sony(?:Ericsson)?)?I(?:4113|31[12]3)'
4192
  model: 'Xperia XZ2 Dual'
4193
  - regex: 'H8166'
4194
  model: 'Xperia XZ2 Premium Dual'
4195
+ - regex: '(?:Sony(?:Ericsson)?)?(?:H(8416|9436|9493)|SO-01L)'
4196
  model: 'Xperia XZ3'
4197
  - regex: '(?:Sony(?:Ericsson)?)?G331[13]'
4198
  model: 'Xperia L1'
4219
  - regex: 'SGP(?:311|312|321)[);/ ]|SO-03E'
4220
  model: 'Xperia Tablet Z'
4221
  device: 'tablet'
4222
+ - regex: 'SGP712[);/ ]'
4223
+ model: 'Xperia Tablet Z4'
4224
+ device: 'tablet'
4225
  - regex: 'SGP(?:511|512|521)[);/ ]|SO-05F'
4226
  model: 'Xperia Tablet Z2'
4227
  device: 'tablet'
4232
  model: 'Xperia Tablet S'
4233
  device: 'tablet'
4234
 
4235
+ # SONY: Bravia
4236
+ - regex: '(?:BRAVIA )(2K GB ATV3|4K UR2|4K GB ATV3|4K GB|4K 2015|2015)[);/ ]'
4237
+ model: 'Bravia $1'
4238
+ device: 'tv'
4239
+
4240
  # general detections
4241
  - regex: 'SonyBDP|SonyDBV'
4242
  model: 'Blu-ray Player'
4294
  model: 'V550 Vision'
4295
  - regex: 'B504[_ ]Unit'
4296
  model: 'B504 Unit'
4297
+ - regex: '(ERGO_)?A500[ _]Best'
4298
  model: 'A500 Best'
4299
+ - regex: '(ERGO_)?A550[ _]Maxx'
4300
  model: 'A550 Maxx'
4301
  - regex: 'Prime B400'
4302
  model: 'Prime B400'
4447
 
4448
  # EvroMedia
4449
  EvroMedia:
4450
+ regex: 'EVROMEDIA|Playpad[ _]'
4451
  device: 'tablet'
4452
  models:
4453
  - regex: 'Playpad 3G GOO'
4454
  model: 'Play Pad 3G Goo'
4455
+ - regex: 'Play Pad PRO'
4456
+ model: 'Play Pad Pro'
4457
  - regex: 'PlayPad 3GTab XL'
4458
  model: 'Play Pad 3G Tab XL'
4459
  # EKO
4679
 
4680
  # Geotel
4681
  Geotel:
4682
+ regex: 'GEOTEL[ _]?'
4683
  device: 'smartphone'
4684
  models:
4685
  - regex: 'G1'
4686
  model: 'G1'
4687
+ - regex: 'GEOTEL[ _]?Note'
4688
+ model: 'Note'
4689
 
4690
  # Ghia
4691
  Ghia:
4702
 
4703
  # Gigabyte
4704
  Gigabyte:
4705
+ regex: 'GSmart[ _][a-z0-9 ]+(?: Build|\))|Gigabyte-[a-z0-9]+'
4706
  device: 'smartphone'
4707
  models:
4708
+ - regex: '(GSmart[ _][a-z0-9 ]+)(?: Build|\))'
4709
  model: '$1'
4710
  - regex: 'Gigabyte-([a-z0-9]+)'
4711
  model: '$1'
4725
 
4726
  # Ginzzu
4727
  Ginzzu:
4728
+ regex: 'GINZZU[_ ]|((?:RS(?:7[14]|81|9[67])D)|S50[45]0|S5120|RS(6[12]|9[45])D|S40[23]0|RS8502|RS9602)[);/ ]'
4729
  device: 'smartphone'
4730
  models:
4731
+ - regex: 'GINZZU[_ ]?(S40[17]0|S4710|ST6040|ST6120)'
4732
  model: '$1'
4733
+ - regex: 'GINZZU[_ ]?(GT-(?:7105|70[1-4]0|7115|7210|[WX]831|7810|8010))'
4734
  model: '$1'
4735
  device: 'tablet'
4736
  - regex: '(RS6[12]D) ULTIMATE'
4737
  model: '$1 Ultimate'
4738
+ - regex: '(?:GINZZU[ _])?((?:RS(?:7[14]|81|9[4-7])D)|S50[45]0|S5120|S40[23]0|RS8502|RS9602|RS94D)[);/ ]'
4739
  model: '$1'
4740
 
4741
  # Gionee
4742
  Gionee:
4743
+ regex: '(?:GIO-)?GIONEE[ _-]?[a-z0-9]+|(?:Dream_D1|V188S?|GN[0-9]{3,4}[a-z]?)[);/ ]|F103(?: Pro)? Build|P5 mini Build|P7 Max Build|M7 Power |F106L'
4744
  device: 'smartphone'
4745
  models:
4746
  - regex: 'GN810[);/ ]'
4750
  model: 'GN$1'
4751
  - regex: 'V188S[);/ ]'
4752
  model: 'V188S'
4753
+ - regex: 'F106L[);/ ]'
4754
+ model: 'F106L'
4755
  - regex: 'V188[);/ ]'
4756
  model: 'V188'
4757
  - regex: 'F103( Pro)? Build'
4797
  - regex: 'QUANTUM_(1010N|1010M|900)'
4798
  model: 'QUANTUM $1'
4799
  device: 'tablet'
4800
+ - regex: 'INSIGNIA_(785_PRO|1010M|800M)'
4801
+ model: 'INSIGNIA $1'
4802
  device: 'tablet'
4803
  - regex: '(ORION|ARIES|ELIPSO)[_ ](71|101|102)'
4804
  model: '$1 $2'
4806
  - regex: 'TQ700N'
4807
  model: 'QUANTUM 700N'
4808
  device: 'tablet'
4809
+ - regex: '((?:QUANTUM|ARIES|INSIGNIA|ORION|ELIPSO)[ _-]?[^;/]+)(?: Build|\))'
4810
  model: '$1'
4811
  - regex: 'GOCLEVER[ _-]TAB[ _-]?([^;/]+) Build'
4812
  model: 'TAB $1'
4849
 
4850
  # Google
4851
  Google:
4852
+ regex: 'Nexus|GoogleTV|Glass|CrKey[^a-z0-9]|Pixel(?: Build|\))|Pixel (?:XL|C|[2-4]|[2-4] XL)|Google 2XL'
4853
  device: 'smartphone'
4854
  models:
4855
  - regex: 'Glass'
4886
  model: 'Pixel 4'
4887
  - regex: 'Pixel 2'
4888
  model: 'Pixel 2'
4889
+ - regex: 'Google 2XL'
4890
+ model: 'Pixel 2 XL'
4891
  - regex: 'Pixel C'
4892
  device: 'tablet'
4893
  model: 'Pixel C'
4925
 
4926
  # Haier
4927
  Haier:
4928
+ regex: 'Haier|I6_Infinity|Titan[ _]T[13]|(?:HW-)?W(?:716|757|860|970)[);/ ]|(?:HM-)?(N700|G(?:152|303|353|552|70[01])?-FL|HM-N501-FL|G(?:303)?-W|I(?:557)?-FL)|(?:PAD[ _](D71|G781|d85))'
4929
  device: 'smartphone'
4930
  models:
4931
+ - regex: 'HM-N700-FL'
4932
+ model: 'L7'
4933
+ - regex: 'HM-N501-FL'
4934
+ model: 'L56'
4935
  - regex: '(?:HM-)?(G(?:152|353|552|70[01])|G(?:303)|I(?:557))'
4936
  model: '$1'
4937
+ - regex: '(Titan[_ ]T[13]|I6_Infinity)'
4938
+ model: '$1'
4939
  - regex: '(?:HW-)?W(716|757|860|970)[);/ ]'
4940
  model: 'W$1'
4941
  - regex: 'PAD[ -_](D71|G781|d85)'
4983
 
4984
  # Hisense
4985
  Hisense:
4986
+ regex: '(?:HS-)?Hisense ([^;/]+) Build|Hisense [^);/]+|HS-(?:G|U|EG?|I|L|T|X)[0-9]+[a-z0-9\-]*|E270BSA|M470BS[AE]|E2281|EG680|HLTE(700T|22[13]E)'
4987
  device: 'smartphone'
4988
  models:
4989
  # explicit tablet models
4998
  model: 'Sero 8'
4999
  - regex: 'HLTE700T'
5000
  model: 'A6'
5001
+ - regex: 'HLTE221E'
5002
+ model: 'E Max'
5003
+ - regex: 'HLTE223E'
5004
+ model: 'H30'
5005
  - regex: 'EG680'
5006
  model: 'Smartfren Andromax Z'
5007
 
5057
 
5058
  # Huawei
5059
  Huawei:
5060
+ regex: '(HW-)?(?:Huawei|Ideos|Honor[ _]?|(?:(?:AGS|AGS2|ALE|ALP|AMN|ANE|ARE|ARS|ATH|ATU|AUM|BAC|BAH|BAH2|BG2|BGO|BKK|BKL|BLA|BLL|BLN|BND|BTV|CAG|CAM|CAN|CAZ|CHC|CHE[12]?|CHM|CLT|CMR|COL|COR|CPN|CRO|CRR|CUN|DIG|DIG|DLI|DRA|DUA|DUB|DUK|EDI|ELE|EML|EVA|EVR|FDR|FIG|FLA|FRD|GRA|HLK|HMA|HRY|HWI|H[36]0|INE|JAT|JDN|JDN2|JKM|JMM|JSN|KIW|KNT|KOB|KSA|LDN|LLD|LND|LON|LUA|LY[AO]|MAR|MHA|MRD|MYA|NCE|NEM|NEO|NXT|PAR|PCT|PIC|PLE|PLK|POT|PRA|RIO|RNE|RVL|SCC|SCL|SEA|SHT|SLA|SNE|STF|STK|TAG|TIT|TNY|TRT|VCE|VEN|VIE|VKY|VNS|VOG|VRD|VTR|WAS|YAL|G(?:527|620S|621|630|735)|Y(?:221|330|550|6[23]5))-(?:[A-Z]{0,2}[0-9]{1,4}[A-Z]{0,2}?)|H1711|U(?:8230|8500|8661|8665|8667|8800|8818|8860|9200|9508))[);/ ])|hi6210sft|SPN-AL00|SCM-(AL09|W09)|HRY-LX1MEB|GEM-70[1-3]L|PE-(UL00|TL10)|VRD-W09|T1-A21[Lw]|T1-701u|G7-L01| ASK-AL00x|LIO-(?:[TA]L00|L29|AN00)|HW-01K|LRA-AL00|HDN-W09|Hol-U19'
5061
  device: 'smartphone'
5062
  models:
5063
  - regex: 'ARS-([AT]L00|L22)[);/ ]'
5110
  model: 'Ascend G620S'
5111
  - regex: 'G630-U251'
5112
  model: 'Ascend G630'
5113
+ - regex: 'G7-L01[);/ ]'
5114
+ model: 'Ascend G7'
5115
  - regex: 'U8860[);/ ]'
5116
  model: 'Honor'
5117
  - regex: 'H1711[);/ ]'
5128
  model: 'Honor 2'
5129
  - regex: 'YAL-(?:L21|AL00)'
5130
  model: 'Honor 20'
5131
+ - regex: 'LRA-AL00'
5132
+ model: 'Honor 20 Lite'
5133
+ - regex: 'MAR-LX1H|YAL-AL50'
5134
  model: 'Honor 20S'
5135
  - regex: 'YAL-(L41|AL10)[);/ ]'
5136
  model: 'Honor 20 Pro'
5142
  model: 'Honor Play 4C'
5143
  - regex: 'ASK-AL00x'
5144
  model: 'Honor Play 3'
5145
+ - regex: 'JDN-(?:AL00|W09)'
5146
  model: 'Honor Pad 2'
5147
  device: 'tablet'
5148
+ - regex: 'HDN-W09'
5149
+ model: 'Honor Water Play 10.1'
5150
+ device: 'tablet'
5151
  - regex: 'JAT-AL00'
5152
  model: 'Honor Play 8A'
5153
  - regex: 'KNT-(?:AL[12]0|[TU]L10)'
5168
  model: 'G621'
5169
  - regex: '(?:Honor_|HW-)?H30-(?:C00|L01M?|L02|U10|T00|T10)(?:_TD)?[);/ ]'
5170
  model: 'Honor 3C'
5171
+ - regex: 'Hol-U19[);/ ]'
5172
+ model: 'Honor 3C Lite'
5173
  - regex: '(?:Honor_|HW-)?SCL-(?:AL00|CL00|TL00H?)(?:_TD)?[);/ ]'
5174
  model: 'Honor 4A'
5175
  - regex: '(?:Honor_|HW-)?CAM-(?:AL00|TL00H|TL00)(?:_TD)?[);/ ]'
5176
  model: 'Honor 5A'
5177
  - regex: '(?:Honor_|HW-)?KIW-(?:AL10|TL00H|[TC]L00|L2[124]|UL00)(?:_TD)?[);/ ]'
5178
  model: 'Honor 5X'
5179
+ - regex: '(?:Honor_|HW-)?CUN-AL00[);/ ]'
5180
+ model: 'Honor 5 Play'
5181
  - regex: '(?:Honor_|HW-)?CHM-U01(?:_TD)?[);/ ]'
5182
  model: 'Honor 4C'
5183
  - regex: '((?:Honor_|HW-)?H60-L(?:01|02|03|04|11|12)(?:_TD)?|HW-H60-J1)[);/ ]'
5186
  model: 'Honor 6 Play'
5187
  - regex: 'PE-(UL00|TL10)'
5188
  model: 'Honor 6 Plus'
5189
+ - regex: '(?:Honor_|HW-)?SCL-L(01|32)(?:_TD)?[);/ ]'
5190
  model: 'Honor Y6'
5191
  - regex: '(?:Honor_|HW-)?LYO-L21'
5192
  model: 'Honor Y6 II Compact' # Honor 5A
5224
  model: 'Honor 8C'
5225
  - regex: 'JSN-L(?:2[123]|42)|JSN-[TA]L00[a]?'
5226
  model: 'Honor 8X'
5227
+ - regex: 'KSA-(LX[29]|AL00)'
5228
  model: 'Honor 8S'
5229
  - regex: 'ARE-(?:AL[10]0|L22HN|TL00)'
5230
  model: 'Honor 8X Max'
5240
  model: 'Honor 9'
5241
  - regex: 'HLK-AL00'
5242
  model: 'Honor 9X'
5243
+ - regex: 'HLK-AL10'
5244
+ model: 'Honor 9X Pro'
5245
  - regex: 'LLD-AL[23]0'
5246
  model: 'Honor 9i'
5247
  - regex: 'LLD-(?:AL[01]0|L[23]1|TL10)'
5248
  model: 'Honor 9 Lite'
5249
  - regex: 'COL-(?:AL[01]0|TL[01]0|L29)'
5250
  model: 'Honor 10'
5251
+ - regex: 'HRY-(?:[AT]L00|LX[12]|LX1MEB)'
5252
  model: 'Honor 10 Lite'
5253
  - regex: 'VKY-TL00'
5254
  model: 'Honor P10 Plus'
5290
  model: 'Nova 3e'
5291
  - regex: 'INE-(?:AL00|LX1r|LX[12]|TL00)'
5292
  model: 'Nova 3i'
5293
+ - regex: 'SEA-AL00'
5294
+ model: 'Nova 5'
5295
  - regex: 'SEA-AL10'
5296
  model: 'Nova 5 Pro'
5297
  - regex: 'VCE-(L22|[AT]L00)'
5326
  model: 'P20'
5327
  - regex: 'ANE-(?:LX[123]|TL00)'
5328
  model: 'P20 Lite'
5329
+ - regex: 'CLT-(?:AL0[01]|TL00|L(?:04|[02]9))|HW-01K'
5330
  model: 'P20 Pro'
5331
+ - regex: 'ELE-L(?:04|09|29)|ELE-[AT]L00'
5332
  model: 'P30'
5333
  - regex: 'VOG-L(?:04|09|29)|VOG-TL00'
5334
  model: 'P30 Pro'
5335
+ - regex: 'MAR-(?:LX(1[BM]|2)|TL00)'
5336
  model: 'P30 Lite'
5337
  - regex: 'MAR-LX[13]A'
5338
  model: 'P30 Lite Dual SIM'
5340
  model: 'P smart'
5341
  - regex: 'STK-LX1'
5342
  model: 'P smart Z'
5343
+ - regex: 'POT-LX([13]|2J)'
5344
  model: 'P smart (2019)'
5345
  - regex: 'POT-[TA]L00a'
5346
  model: '9S'
5348
  model: 'Y3 (2017)'
5349
  - regex: 'CAG-L[02]2'
5350
  model: 'Y3 (2018)'
5351
+ - regex: 'LUA-(U22|L2[12]|U03)'
5352
  model: 'Y3II'
5353
  - regex: 'CUN-L(?:0[123]|2[123]|33)'
5354
  model: 'Y5II'
5438
  model: 'Mate 20 Pro'
5439
  - regex: 'SNE-(?:AL00|LX[0-3])'
5440
  model: 'Mate 20 Lite'
5441
+ - regex: 'EVR-(?:[TA]L00|L29|N29)'
5442
  model: 'Mate 20 X'
5443
  - regex: 'CRR-(?:L09|UL00)'
5444
  model: 'Mate S'
5450
  model: 'Mate SE'
5451
  - regex: 'SPN-AL00'
5452
  model: 'Mate 30 Lite' # Nova 5i Pro
5453
+ - regex: 'LIO-(?:[TA]L00|L29|AN00)'
5454
+ model: 'Mate 30 Pro'
5455
  - regex: 'Bucare Y330-U05'
5456
  model: 'Y330-U05'
5457
  - regex: 'DRA-L(?:01|03|21|23|X3)'
5458
  model: 'Y5 (2018)'
5459
  - regex: 'ATH-UL0[16]'
5460
  model: 'ShotX'
 
 
 
5461
  - regex: 'CMR-(?:AL[01]9|W09)'
5462
  device: 'tablet'
5463
  model: 'MediaPad M5 10.8'
5464
+ - regex: 'SCM-AL09'
5465
+ device: 'tablet'
5466
+ model: 'MediaPad M5 Pro'
5467
  - regex: 'GEM-70[1-3]L'
5468
  device: 'tablet'
5469
  model: 'MediaPad X2'
5473
  - regex: 'SHT-(?:AL|W)09'
5474
  device: 'tablet'
5475
  model: 'MediaPad M5 8.4'
5476
+ - regex: 'VRD-(?:(AL|W)09|AL10)'
5477
  device: 'tablet'
5478
  model: 'MediaPad M6 8.4'
5479
+ - regex: 'SCM-W09'
5480
+ device: 'tablet'
5481
+ model: 'MediaPad M6 10'
5482
  - regex: 'BTV-W09'
5483
  device: 'tablet'
5484
  model: 'MediaPad M3 8'
5515
  - regex: 'FDR-A01(?:L|w)'
5516
  device: 'tablet'
5517
  model: 'MediaPad T2 10.0 Pro'
5518
+ - regex: 'T1-A21[Lw]'
5519
  device: 'tablet'
5520
  model: 'MediaPad T1 10'
5521
  - regex: 'T1-701u'
5608
  - regex: 'iRola ([^/;]+) Build'
5609
  model: '$1'
5610
 
5611
+ # iRulu
5612
+ iRulu:
5613
+ regex: 'iRULU[ _](X11|V[34])[;)\ ]'
5614
+ device: 'tablet'
5615
+ model: '$1'
5616
+
5617
  # Irbis
5618
  Irbis:
5619
+ regex: 'TZ(1(?:00|50|84|65|7[35-8]|9[578])|49|7(?:1[467]|2[0156]|37|4[27]|5[23457]|62|72|7[17]|8[1]|9[47])|8(?:[34]1|5[3-7]|6[45]|7[2478]|8[1-5]|9[012])|96[0-9])|TZ(?:one|art|HIT)|(SP(?:0[56]|2[01]|4[1-36]|401|45[345]|50|51[0147]|531|55[01]))[;)\ ]'
5620
  device: 'tablet'
5621
  models:
5622
+ - regex: '(TZ(?:[0-9]+)|TZ(?:one|art|HIT))[;)\ ]'
5623
  model: '$1'
5624
+ - regex: '(SP(?:0[56]|2[01]|4[1-36]|401|45[345]|50|51[0147]|531|55[01]))[;)\ ]'
5625
  device: 'smartphone'
5626
  model: '$1'
5627
 
5637
 
5638
  # iHunt
5639
  iHunt:
5640
+ regex: 'iHunt|One_ Love_|TITAN_P11000_PRO|Like_(3|4U|3_Pro)|X300 Elite|S10_Tank_2019|S60_Discovery_2019|AlienXLite2020'
5641
  device: 'smartphone'
5642
  models:
5643
  - regex: 'iHunt_Like'
5656
  model: 'Like 4U'
5657
  - regex: 'X300 Elite'
5658
  model: 'X300 Elite'
5659
+ - regex: 'S60_Discovery_2019'
5660
+ model: 'S60 Discovery 2019'
5661
+ - regex: 'AlienXLite2020'
5662
+ model: 'Alien X Lite 2020'
5663
 
5664
  # IconBIT
5665
  IconBIT:
5666
+ regex: 'IconBIT|NT-(3506M|0704S|0909T|1009T|10[01]1T|1017T|3601P/3602P|3603P|3702S|3805C|3905T|3701S|0701S|0805C|0902S|370[23]M)'
5667
  device: 'tablet'
5668
  models:
5669
  - regex: 'NT-3506M'
5702
  - regex: 'NT-3703M'
5703
  model: 'NetTAB Matrix 3GT'
5704
 
5705
+ - regex: 'iconBIT (Movie Ultra HD 4K)'
5706
+ model: '$1'
5707
+ device: 'tv'
5708
+
5709
  # LYF
5710
  LYF:
5711
  regex: '(LYF[ _])?LS-[456][0-9]{3}|LYF/[^/]+/'
5757
  model: 'Wind 7'
5758
  - regex: 'LS-5504'
5759
  model: 'Water 7'
5760
+ - regex: 'LS-5507'
5761
+ model: 'Water 7S'
5762
  - regex: 'LS-5017'
5763
  model: 'Water 11'
5764
  - regex: 'LS-5018'
5997
 
5998
  # InFocus
5999
  InFocus:
6000
+ regex: 'IF(9001|9007|9021|9035|9031)[);/ ]'
6001
  device: 'smartphone'
6002
  models:
6003
  - regex: 'IF9001'
6455
 
6456
  # kyocera
6457
  Kyocera:
6458
+ regex: 'Kyocera|KWC-|QC-|C5120|C5170|C5155|C5215|C6730|C6750|C6522N?|C6530N|C6740|C6743|E6[89]10|KYL21|KYY23|S2151|KC-S701|S4-KC[;/) ]'
6459
  device: 'smartphone'
6460
  models:
6461
  # explicit smartphone models
6462
  - regex: 'C5120'
6463
  model: 'Milano'
6464
+ - regex: 'S4-KC'
6465
+ model: 'One S4'
6466
  - regex: 'C5155'
6467
  model: 'Rise'
6468
  - regex: 'C5170'
6506
  - regex: '(?:KWC|QC)-([a-z0-9]+)'
6507
  model: '$1'
6508
 
6509
+ # Krüger&Matz (Kruger&Matz)
6510
  Krüger&Matz:
6511
+ regex: 'Kruger[ _&]Matz|MOVE_|LIVE4_KM043[89]'
6512
  device: 'smartphone'
6513
  models:
6514
  - regex: 'MOVE_6_mini'
6515
  model: 'MOVE 6 Mini'
6516
+ - regex: 'MOVE[_ ]([78]|6S)'
6517
  model: 'MOVE $1'
6518
  - regex: 'DRIVE 4 mini LTE'
6519
  model: 'DRIVE 4 mini LTE'
6520
+ - regex: 'DRIVE 4[;/) ]'
6521
+ model: 'DRIVE 4'
6522
  - regex: 'Drive 5[;/) ]'
6523
  model: 'DRIVE 5'
6524
+ - regex: 'FLOW (4[S]?)[;/) ]'
6525
+ model: 'FLOW $1'
6526
+ - regex: 'LIVE4_(KM043[89])[;/) ]'
6527
+ model: 'LIVE 4 $1'
6528
 
6529
  # LAIQ
6530
  LAIQ:
6596
  device: 'tablet'
6597
  - regex: 'X120C'
6598
  model: 'Ilium X120C'
6599
+ - regex: 'Ilium[ _](Alpha 3|L(?:200|6[12]0|9[125]0|1[0124]00|1050|1120)|LT5[012]0|M[13579]|S(?:106|520|6[27]0)|X(?:1[12]0|2[0126]0|5[12]0|500B|710))'
6600
  model: 'Ilium $1'
6601
  - regex: 'ILIUM[ _]([^;/]+) Build'
6602
  model: 'Ilium $1'
6697
  model: 'Max X900+'
6698
  - regex: 'X50[10]'
6699
  model: 'Le 1S'
6700
+ - regex: '(X910)'
6701
+ model: '$1'
6702
  - regex: 'X900 Build'
6703
  model: 'Le X900'
6704
  - regex: 'Le ?X526 Build'
6747
 
6748
  # lenovo
6749
  Lenovo:
6750
+ regex: '(?:LNV-)?Lenovo|IdeaTab|IdeaPad|Thinkpad|Yoga Tablet|Tab2A[0-9]-[0-9]{2}[a-z]?|TB2-X30L|TB3-710I|YT3-X50[ML]|ZUK[ -_]|K50a40|TB-(8504F|X304F|X704V|X704A)|A2107A-H|S6000[ ;)]|Z2 Plus|VIBE Z2|Vibe K5 Plus'
6751
  device: 'smartphone'
6752
  models:
6753
  - regex: 'Lenovo ?G780'
6771
  - regex: 'TB2-X30[FL]'
6772
  model: 'Tab 2 A10-30'
6773
  device: 'tablet'
6774
+ - regex: 'YT3-X50[FLM]'
6775
  model: 'Yoga Tab 3'
6776
  device: 'tablet'
6777
  - regex: 'TB3-730X'
6795
  - regex: 'Lenovo ?B8000(-[FH])?'
6796
  model: 'Yoga Tablet 10'
6797
  device: 'tablet'
6798
+ - regex: 'YOGA Tablet 2 Pro-1380[FL]'
6799
+ model: 'Yoga Tablet 2 Pro 13.3"'
6800
+ device: 'tablet'
6801
+ - regex: 'YOGA Tablet 2-1050[FL]'
6802
+ model: 'Yoga Tablet 2 10.1"'
6803
+ device: 'tablet'
6804
+ - regex: 'YOGA Tablet 2-830(?:[FL]|LC)'
6805
+ model: 'Yoga Tablet 2 8.0"'
6806
+ device: 'tablet'
6807
  - regex: 'Lenovo ?B6000(-[FH])?'
6808
  model: 'Yoga Tablet 8'
6809
  device: 'tablet'
6884
  model: 'K5 Note'
6885
  - regex: '(?:Lenovo-)?A6020(?:a40|l36)(?: Build|\))'
6886
  model: 'K5 Vibe'
6887
+ - regex: 'A6020a46(?: Build|\))|Vibe K5 Plus'
6888
  model: 'K5 Vibe Plus'
6889
+ - regex: 'VIBE Z2[);/ ]'
6890
+ model: 'Vibe Z2'
6891
  - regex: 'k33a48(?: Build|\))'
6892
  model: 'K6'
6893
  - regex: 'k53a48(?: Build|\))'
7000
 
7001
  # LG
7002
  LG:
7003
+ regex: 'LG|portalmmm/2\.0 (?:KE|KG|KP|L3)|(?:VX[0-9]+|L-0[12]D|L-07C|P713|(LM-[A-Z][0-9]{3}[A-Z]{0,3}(?:\(FGN?\)|\(G\)|\.FN|\.F(?:GN?)?)?)|LM-(X625N1|G820QM[0127]))[);/ ]|NetCast|RS987|RS500|VS(?:50[01]|835|876|880|98[0578]|99[56]|(410|415|425|500|880)PP)|Nexsus 5|LML(41[34]D|211B|713D|212V)L|VK810 4G|VK815'
7004
  device: 'smartphone'
7005
  models:
7006
  - regex: 'LG-D325'
7013
  model: 'Zone 4'
7014
  - regex: 'LM-X220PM'
7015
  model: 'Tribute Empire'
7016
+ - regex: 'VS980'
7017
+ model: 'G2'
7018
+ - regex: 'LG-D85[0125]|VS985'
7019
  model: 'G3'
7020
  - regex: 'LG-D72[2458]'
7021
  model: 'G3 Beat'
7085
  model: 'Fortune 2'
7086
  - regex: 'LM-X410\.F[);/ ]'
7087
  model: 'Premier Pro'
7088
+ - regex: 'LML41[34]DL[);/ ]'
7089
  model: 'Premier Pro LTE'
7090
  - regex: 'LM-X525'
7091
  model: 'Q60'
7191
  model: 'Spirit'
7192
  - regex: '(?:LG)?C660'
7193
  model: 'Optimus Pro'
7194
+ - regex: 'LML21(?:1B|2V)L'
7195
  model: 'Rebel 4'
7196
+ - regex: 'VS876'
7197
+ model: 'Lucid 3'
7198
+ - regex: 'VS880(PP)?'
7199
+ model: 'G Vista'
7200
 
7201
  - regex: 'LG-V490'
7202
  model: 'G Pad 8.0'
7868
 
7869
  # Mobistel
7870
  Mobistel:
7871
+ regex: '(Cynus[ _][^/;)]+)( Build|\))'
7872
  device: 'smartphone'
7873
  model: '$1'
7874
 
7914
 
7915
  # motorola
7916
  Motorola:
7917
+ regex: 'MOT(?!TO)|(?<!AN)DROID ?(?:Build|[a-z0-9]+)|portalmmm/2.0 (?:E378i|L6|L7|v3)|XOOM [^;/]*Build|XT1799-2|XT1021|XT180[3-5]|(?:XT|MZ|MB|ME)[0-9]{3,4}[a-z]?(?:\(Defy\)|-0[1-5])?(?: Build|\))'
7918
  device: 'smartphone'
7919
  models:
7920
  # Explicit feature phone models
7999
  model: 'Droid Turbo'
8000
  - regex: '(?:MOT-|Motorola-)?XT10(?:28|3[1234]|68|69)'
8001
  model: 'Moto G'
8002
+ - regex: '(?:MOT-|Motorola-)?XT1799-2'
8003
+ model: 'Moto G5s'
8004
  - regex: '(?:MOT-|Motorola-)?XT180[3-5]'
8005
  model: 'Moto G5s Plus'
8006
  - regex: '(?:MOT-|Motorola-)?XT168[57]'
8017
  model: 'Moto Z'
8018
  - regex: '(?:MOT-|Motorola-)?XT1635(?:-0[1-3])?'
8019
  model: 'Moto Z Play'
8020
+ - regex: '(?:MOT-|Motorola-)?XT1710-(?:-02)?'
8021
+ model: 'Moto Z2 Play'
8022
  - regex: '(?:MOT-|Motorola-)?XT1663'
8023
  model: 'Moto M'
8024
 
8075
 
8076
  # myphone
8077
  MyPhone:
8078
+ regex: '(?:MyPhone|MyPad|MyTab)[ _][^;/)]+( Build|\))|Cube_LTE|myTab10II|HAMMER[ _](ENERGY|Titan 2|AXE[_ ](?:M[_ ]LTE|Pro)|Iron 2|Active)|C-Smart_pix|myPhone_Fun_8'
8079
  device: 'smartphone'
8080
  models:
8081
  - regex: 'MyPad[ _]([^;/]+) Build'
8091
  model: 'Cube LTE'
8092
  - regex: 'HAMMER[ _]ENERGY'
8093
  model: 'Hammer Energy'
8094
+ - regex: 'HAMMER_AXE[_ ]M[_ ]LTE'
8095
  model: 'Hammer Axe M LTE'
8096
  - regex: 'Hammer Titan 2'
8097
  model: 'Hammer Titan 2'
8098
+ - regex: 'Hammer Iron 2'
8099
+ model: 'Hammer Iron 2'
8100
+ - regex: 'Hammer Active'
8101
+ model: 'Hammer Active'
8102
+ - regex: 'Hammer AXE Pro'
8103
+ model: 'Hammer Axe Pro'
8104
  - regex: 'C-Smart_pix'
8105
  model: 'C-Smart Pix'
8106
  - regex: 'myPhone_Fun_8'
8107
  model: 'FUN 8'
8108
+ - regex: 'MyPhone[ _]([^;/)]+)( Build|\))'
8109
  model: '$1'
8110
 
8111
  # MyWigo
8312
 
8313
  # Nomi
8314
  Nomi:
8315
+ regex: 'Nomi[ _-]|(C101010 Ultra2|i501[23]|i5032|i5050|i5532|C0(700(?:[02358]|2HD)|7850)|C1010[0-3])[;/) ]'
8316
  device: 'smartphone'
8317
  models:
8318
  - regex: 'i501[23][;/) ]'
8326
  - regex: 'C101010 Ultra2'
8327
  model: 'Ultra 2'
8328
  device: 'tablet'
8329
+ - regex: '(C0(?:700(?:[02358]|2HD)|7850)|C1010[0-3])[;/) ]'
8330
+ model: '$1'
8331
+ device: 'tablet'
8332
  - regex: 'Nomi[ _-]([^;/]+) Build'
8333
  model: '$1'
8334
  - regex: 'Nomi[ _-]([^;/)]+)[;/)]'
8336
 
8337
  # NUU Mobile
8338
  NUU Mobile:
8339
+ regex: 'NUU_|(?:N(5702|5001)L|S6001L)[;)/ ]'
8340
  device: 'smartphone'
8341
  models:
8342
  - regex: 'NUU_A1'
8343
  model: 'A1'
8344
+ - regex: 'S6001L'
8345
+ model: 'G2'
8346
  - regex: 'N5702L'
8347
  model: 'G3'
8348
  - regex: '(N5001L)[;)/ ]'
8558
 
8559
  # OnePlus
8560
  OnePlus:
8561
+ regex: '(?:du_)?ONEPLUS|(?:A0001|A200[135]|A300[03]|A3010|A5000|A600[03]|A601[03]|E100[135]|GM191[03517]|GM190[013]|HD190[1357])(?: Build|\))'
8562
  device: 'smartphone'
8563
  models:
8564
  - regex: 'GM191[03517]'
8565
  model: '7 Pro'
8566
  - regex: 'GM190[013]'
8567
  model: '7'
8568
+ - regex: 'HD190[1357]'
8569
  model: '7T'
8570
  - regex: 'A0001'
8571
  model: 'One'
8590
 
8591
  # oppo
8592
  OPPO:
8593
+ regex: '(?:OB-)?OPPO[ _]?([a-z0-9]+)|N1T|(?:X90[07][0679]|U707T?|X909T?|R(?:10[01]1|2001|201[07]|6007|7005|7007|80[13579]|81[13579]|82[01379]|83[013]|800[067]|8015|810[679]|811[13]|820[057])[KLSTW]?|N520[79]|N5117|A33f|A33fw|A37fw?|PAAM00|PAC[T|M]00|PBAM00)[);/ ]|R7kf|R7plusf|R7Plusm|A1601|CPH[0-9]{4}|PCAM10|PADM00|PBBT00|PBBM[03]0|RMX18(0[1579]|11|3[13]|2[15]|[45]1|45)|CPH19(69|79|23|1[179])|RMX(1827|194[1235]|199[23]|19[01379]1|192[157])|PC[CDG]M00|PB(AT00|BT30|CM[13]0|[FD]M00)|P[CB]E[MT]00|P(AFM00|ADT00|AHM00|CA[MT]00|CDM10|CHM[13]0|CKM[08]0|CLM10|DBM00)'
8594
  device: 'smartphone'
8595
  models:
8596
  - regex: '(?:OPPO[ _]?)?U707T?[);/ ]'
8597
  model: 'Find Way S'
8598
+ - regex: '(?:OPPO[ _]?)?(?:CPH1979|PCDM10)[);/ ]'
8599
  model: 'Reno Z'
8600
  - regex: 'CPH1945'
8601
  model: 'Reno2 Z'
8603
  model: 'F11 Pro'
8604
  - regex: 'CPH1911'
8605
  model: 'F11'
8606
+ - regex: '(?:CPH1917|PCA[MT]00)[);/ ]'
8607
  model: 'Reno'
8608
+ - regex: 'PCLM10'
8609
+ model: 'Reno Ace'
8610
+ - regex: 'PCKM00'
8611
+ model: 'Reno 2'
8612
+ - regex: 'PCKM80'
8613
+ model: 'Reno 2Z'
8614
  - regex: 'CPH1921'
8615
  model: 'Reno 5G'
8616
+ - regex: 'PCGM00[);/ ]'
8617
+ model: 'Reno K3'
8618
  - regex: 'PCCM00'
8619
  model: 'Reno 10X'
8620
  - regex: 'CPH1919'
8699
  model: 'A83'
8700
  - regex: '(?:OPPO[ _]?)?CPH1801[);/ ]'
8701
  model: 'A71'
8702
+ - regex: 'PADT00[);/ ]'
8703
+ model: 'A3'
8704
  - regex: '(?:OPPO[ _]?)?CPH18(0[35]|53)[);/ ]'
8705
  model: 'A3s'
8706
  - regex: '(?:OPPO[ _]?)?(?:CPH1809|PBAT00|PBBT30)[);/ ]'
8709
  model: 'A5 (2020)'
8710
  - regex: '(?:OPPO[ _]?)?CPH1938[);/ ]'
8711
  model: 'A9 (EN)'
8712
+ - regex: 'CPH1937|PCHM30'
8713
  model: 'A9 (2020)'
8714
+ - regex: 'PCHM10'
8715
+ model: 'A11'
8716
  - regex: '(?:OPPO[ _]?)?CPH18(19|21)[);/ ]'
8717
  model: 'F7'
8718
  - regex: '(?:OPPO[ _]?)?CPH1823[);/ ]'
8723
  model: 'R15 Pro'
8724
  - regex: '(?:OPPO[ _]?)?CPH1835[);/ ]'
8725
  model: 'R15'
 
 
8726
  - regex: '(?:OPPO[ _]?)?CPH1851[);/ ]'
8727
  model: 'AX5'
8728
  - regex: 'CPH1920'
8735
  model: 'K1'
8736
  - regex: 'RMX1811'
8737
  model: 'RealMe C1'
8738
+ - regex: 'RMX194[1235]'
8739
  model: 'RealMe C2'
8740
  - regex: 'RMX1831'
8741
  model: 'RealMe U1'
8742
  - regex: '(?:OPPO[ _]?)?(?:CPH187[15]|PAFM00)[);/ ]'
8743
  model: 'Find X'
8744
+ - regex: '(?:OPPO[ _]?)?(?:PAHM00)[);/ ]'
8745
+ model: 'Find X Lamborghini'
8746
+ - regex: '(?:OPPO[ _]?)?(?:CPH1877|PBDM00)[);/ ]'
8747
  model: 'R17 Pro'
8748
  - regex: '(?:OPPO[ _]?)?(?:CPH1879|PBE[MT]00)[);/ ]'
8749
  model: 'R17'
8753
  model: 'R17 Neo'
8754
  - regex: '(?:OPPO[ _]?)?(?:CPH1901|PBFM00)[);/ ]'
8755
  model: 'A7'
8756
+ - regex: '(?:OPPO[ _]?)?(?:PDBM00)[);/ ]'
8757
+ model: 'A8'
8758
  - regex: '(?:OPPO[ _]?)?CPH1903[);/ ]'
8759
  model: 'AX7'
8760
  - regex: '(?:OPPO[ _]?)?A37f(w)?(?: Build|\))'
8761
  model: 'A37f$1'
8762
+ - regex: '(?:OPPO[ _]?)?(CPH1837|PADM00)[);/ ]'
8763
  model: 'A3'
8764
  - regex: '(?:OPPO[ _]?)?PBAM00'
8765
  model: 'A5'
8783
  model: 'Realme 3 Pro'
8784
  - regex: 'RMX1901'
8785
  model: 'Realme X'
8786
+ - regex: 'RMX199[12]'
8787
+ model: 'Realme X2'
8788
+ - regex: 'RMX1993'
8789
+ model: 'Realme X2 Dual'
8790
+ - regex: 'RMX1931'
8791
+ model: 'Realme X2 Pro'
8792
  - regex: 'RMX1921'
8793
  model: 'Realme XT'
8794
+ - regex: 'RMX19(11|27)'
8795
  model: 'Realme 5'
8796
  - regex: 'RMX1971'
8797
  model: 'Realme 5 Pro'
8798
+ - regex: 'RMX1925'
8799
+ model: 'Realme 5S'
8800
  - regex: '(PBBT00|PBBM00)[);/ ]'
8801
  model: 'A7x'
8802
  - regex: 'PCDM00[);/ ]'
8852
  model: '$1 $2'
8853
  - regex: 'Orange[ _-](Dive)72[ ;/)]'
8854
  model: '$1 72'
8855
+ - regex: 'Orange[ _-](Daytona|Dive (30|7[13])|Dublin|Fova|Gova|Hi 4G|Hiro|Kivo|Monte Carlo|Neva 80|Neva play|Nura|Reyo|Rise[_ ](3[034]|40|5[345])|Rono|Roya|San Francisco|Tactile internet 2|Tado|Yomi|Yumo|Zali)[ ;/)]'
8856
  model: '$1'
8857
  - regex: 'SPV[ \-]?([a-z0-9]+)'
8858
  model: 'SPV $1'
8871
  - regex: '(OK[AU][0-9]+[a-z]*) Build'
8872
  model: '$1'
8873
 
8874
+ # Oukitel
8875
+ Oukitel:
8876
+ regex: '(?:C15|C16|K10000)[ _]Pro'
8877
+ device: 'smartphone'
8878
+ models:
8879
+ - regex: '(C15|C16|K10000)[ _]Pro'
8880
+ model: '$1 Pro'
8881
+
8882
  # Overmax
8883
  Overmax:
8884
  regex: 'OV-[a-z]+(?:[^;(/]*)[();/ ]|Qualcore 1010'
8900
 
8901
  # Oysters
8902
  Oysters:
8903
+ regex: 'Oysters|T84ERI[ _]3G|T72HM(s_)?3G|(T74HMi|T84Bi)[_ ]4G|T74MR4G'
8904
  device: 'tablet'
8905
  models:
8906
  - regex: 'Oysters ((?:Arctic|Indian|Atlantic|Pacific)[^/;]+) Build'
8908
  model: '$1'
8909
  - regex: '(T84ERI[ _]3G|T72HM(s_)?3G|(?:(T74HMi|T84Bi)[_ ]4G))'
8910
  model: '$1'
8911
+ - regex: '(T74MR)(4G)'
8912
+ model: '$1 $2'
8913
  - regex: 'Oysters ([^/;]+)( Build|\))'
8914
  model: '$1'
8915
  # öwn
8941
 
8942
  # panasonic
8943
  Panasonic:
8944
+ regex: 'Panasonic|PANATV[0-9]+|Viera/|P902i[);/ ]|Eluga[ _]|FZ-N1|P55 Novo 4G|DMC-CM1'
8945
  device: 'smartphone'
8946
  models:
8947
  - regex: 'Eluga[ _-]([^;/]+) Build'
8948
  model: 'Eluga $1'
8949
  - regex: 'Eluga[ _-]([^;/]+)[;/)]'
8950
  model: 'Eluga $1'
8951
+ - regex: '(DMC-CM1)'
8952
+ model: 'Lumix $1'
8953
+ device: 'camera'
8954
  - regex: 'FZ-N1'
8955
  model: 'Toughpad'
8956
  - regex: 'P55 Novo 4G'
9025
 
9026
  # philips
9027
  Philips:
9028
+ regex: 'Philips|AND1E[);/ ]|NETTV/|PI3210G|TLE(821L|722G)|TPM171E'
9029
  device: 'smartphone'
9030
  models:
9031
  - regex: 'AND1E(?: TV)?[);/ ]'
9034
  - regex: '(PI3210G)'
9035
  model: '$1'
9036
  device: 'tablet'
9037
+ - regex: '(TPM171E)' # Smart Tv 2018
9038
+ model: '$1'
9039
+ device: 'tv'
9040
  - regex: '(TLE821L)[);/ ]'
9041
  model: '$1 4G LTE'
9042
  device: 'tablet'
9085
 
9086
  # Pixus
9087
  Pixus:
9088
+ regex: 'Pixus|(Ride[_ ]4G|Play[ _]Three[ _]v(?:[24].0|3.1))[;)\ ]'
9089
  device: 'tablet'
9090
  models:
9091
  - regex: 'Ride[_ ]4G'
9092
  model: 'Ride 4G'
9093
+ - regex: 'Play[ _]Three[ _]v([24].0|3.1)'
9094
+ model: 'Play Three v$1'
9095
+ - regex: 'Play Two'
9096
+ model: 'Play Two'
9097
  - regex: 'Raze'
9098
  model: 'Raze'
9099
  device: 'smartphone'
9203
 
9204
  # Rombica
9205
  Rombica:
9206
+ regex: '(Rombica|SSQ-A0500)[);/ ]'
9207
  device: 'tv'
9208
+ models:
9209
+ - regex: 'SSQ-A0500[);/ ]'
9210
+ model: 'Smart Stick 4K'
9211
+ - regex: '(Infinity K8|Smart Box (?:v005|Quad|Ultra HD v002|4K V001))[);/ ]'
9212
+ model: '$1'
9213
 
9214
  # Rover
9215
  Rover:
9253
  model: 'Neon Ray'
9254
 
9255
 
9256
+ # Santin
9257
+ Santin:
9258
+ regex: '(SANTIN|BiTBiZ_V58)[);/_ ]'
9259
  device: 'smartphone'
9260
  models:
9261
+ - regex: 'BiTBiZ_V58[);/ ]'
9262
+ model: 'BiTBiZ V58'
9263
+ - regex: 'GreenOrange[);/ ]'
9264
+ model: 'Green Orange'
9265
+ - regex: 'halove[);/ ]'
9266
+ model: 'Halove'
9267
+ - regex: 'monica[);/ ]'
9268
+ model: 'Monica'
9269
+ - regex: 'POWER[);/ ]'
9270
+ model: 'Power'
9271
+ - regex: 'GALAZ[);/ ]'
9272
+ model: 'Galaz'
9273
+ - regex: 'NEWDUN[);/ ]'
9274
+ model: 'Newdun'
9275
+ - regex: 'SANTIN[ _][#]?(Dante|Candy U7|Armor|YSL-Y7|ANT.W|N[13]|JS|S6|V9)[);/ ]'
9276
+ model: '$1'
9277
 
9278
  # Siemens
9279
  Siemens:
9731
  model: 'GALAXY S10+'
9732
  - regex: '(?:SAMSUNG-)?SM-G970[FU]'
9733
  model: 'GALAXY S10e'
9734
+ - regex: '(?:SAMSUNG-)?SM-G980F'
9735
+ model: 'GALAXY S20'
9736
+ - regex: '(?:SAMSUNG-)?SM-G981(?:[0BNUW]|U1)'
9737
+ model: 'GALAXY S20 5G'
9738
+ - regex: '(?:SAMSUNG-)?SM-G988(?:[0BNUW]|U1)'
9739
+ model: 'GALAXY S20 Ultra 5G'
9740
+ - regex: '(?:SAMSUNG-)?SM-G985F'
9741
+ model: 'GALAXY S20+'
9742
+ - regex: '(?:SAMSUNG-)?SM-G986(?:[0BNUW]|U1)'
9743
+ model: 'GALAXY S20+ 5G'
9744
+ - regex: '(?:SAMSUNG-)?SM-F700(?:[0FNUW]|U1)|SCV47'
9745
+ model: 'GALAXY Z Flip'
9746
  - regex: '(?:SAMSUNG-)?SCH-I200'
9747
  model: 'GALAXY Stellar'
9748
  - regex: '(?:SAMSUNG-)?SCH-I829'
10535
 
10536
  # Prestigio
10537
  Prestigio:
10538
+ regex: '(?:PMP|PAP|PMT|PSP|PGPS)[0-9]+[a-z0-9_]+[);/ ]'
10539
  device: 'tablet'
10540
  models:
10541
  - regex: 'PMT3277_3G'
10542
  model: 'MultiPad Ranger 7.0 3G'
10543
+ - regex: 'PGPS7799CIS08GBPG'
10544
+ model: 'Geo Vision Tour 3'
10545
  - regex: 'PMT3201_4G'
10546
  model: 'Grace 4G'
10547
  - regex: 'PSP5551DUO'
10580
 
10581
  # Qilive (Auchan)
10582
  Qilive:
10583
+ regex: 'Qilive [0-9][^;/]*|Q(8S55IN4G2|8S[56]IN4G|10S5[37]IN4G|10S[56]IN4G|10S[56]IN4GR|9S5IN4G|6T7IN)'
10584
  device: 'smartphone'
10585
  models:
10586
  - regex: 'Q8S55IN4G2'
10587
  model: 'Q8 5.5" 4G'
10588
+ - regex: 'Q8S6IN4G'
10589
+ model: 'Q8 6.0" 4G'
10590
  - regex: 'Q8S5IN4GP'
10591
  model: 'Q8 5.1" 4G'
10592
+ - regex: 'Q9S5IN4G'
10593
+ model: 'Q9 5.0" 4G'
10594
  - regex: 'Q10S53IN4G'
10595
  model: 'Q10 5.3" 4G'
10596
  - regex: 'Q10S57IN4G'
10597
  model: 'Q10 5.7" 4G'
10598
+ - regex: 'Q10S5IN4G[R]?'
10599
  model: 'Q10 5.0" 4G'
10600
  - regex: 'Q10S6IN4G'
10601
  model: 'Q10 6.0" 4G'
10720
 
10721
  # Sharp
10722
  Sharp:
10723
+ regex: 'SHARP|SBM|SH-?[0-9]+[a-z]?[);/ ]|SH-M0[89]|S3-SH|SH-Z(10|01)|AQUOS|506SH|SHL22|FS80(1[08]|32|28|0[29])[);/ ]|TG-L900S'
10724
  device: 'smartphone'
10725
  models:
10726
  # explicit smartphone models
10727
  - regex: '506SH'
10728
  model: 'Aquos Xx3'
10729
+ - regex: 'S3-SH'
10730
+ model: 'One S3'
10731
  - regex: 'SH-Z10'
10732
  model: 'Aquos zero'
10733
+ - regex: 'SH-Z01'
10734
+ model: 'Aquos S2 (C10)'
10735
  - regex: 'SH-02E'
10736
  model: 'Aquos Phone Zeta'
10737
  - regex: 'SH06D'
10738
  model: 'Aquos Phone SH-06D'
10739
  - regex: 'SHL22'
10740
  model: 'Aquos Phone SHL22'
10741
+ - regex: 'SH-M09'
10742
+ model: 'Aquos R2'
10743
+ - regex: 'FS8010|SH-M08'
10744
  model: 'Aquos S2'
10745
  - regex: 'FS8032'
10746
  model: 'Aquos S3'
10902
 
10903
  # T-Mobile
10904
  T-Mobile:
10905
+ regex: 'T-Mobile[ _][a-z0-9 ]+|REVVLRY|REVVL 2( PLUS)?[);/ ]'
10906
  device: 'smartphone'
10907
  models:
10908
  - regex: 'REVVL 2 PLUS'
10909
  model: 'REVVL 2 Plus'
10910
+ - regex: 'REVVLRY'
10911
+ model: 'REVVL Plus'
10912
  - regex: 'REVVL 2[);/ ]'
10913
  model: 'REVVL 2'
10914
  - regex: 'T-Mobile[ _]([a-z0-9_ ]+) Build'
11012
 
11013
  # teXet
11014
  teXet:
11015
+ regex: 'Texet|(NaviPad [^/;]*) Build|TM-(?:1046|1058|1057|1067|3000|3200R|3500|4003|4071|450[34]|451[30]|4377|4082R|550[83]|5010|5017|507[4-7]|5[23]77|6003|6906|702[13]|7055HD|709[69]|9747BT|9758|9751HD|9767|5513|520[410]|5505|507[13]|5581|7859|8044|9748[ _]3G|9720|7047HD[ _]3G|9757|9740|4982|4515|4083|500[3567]|5571|3204R|5016|8043|7047HD[ _]3G|8041HD|8066|705[23]|7041|8041HD|8051|8048|974[96]|973[78]W|974[170]|9743W|9750HD|7043XD|7049|7887|7037W|702[46])|TB-(771A|711A)|X-Force[\(-]?TM-5009\)?|X-Plus[\(-]?TM-5577\)?|X-pad (?:AIR 8|iX 7) 3G'
11016
  device: 'tablet'
11017
  models:
11018
  - regex: 'TM-9749'
11047
  model: 'NaviPad TM-7887 3G'
11048
  - regex: 'TM-8066'
11049
  model: 'X-pad Rapid 8.2 4G'
11050
+ - regex: '(TM-(?:1057|1067|6906|8043|9748[_ ]3G|9740|9757(?:[_ ]3G)?|7047HD[ _]3G|9747BT|9751HD|702[13]|705[23]|7041|9720|7047HD[_ ]3G|8044|8041HD|973[78]W|9743W|974[710]|9750HD|7043XD|7037W|702[46])|TB-(?:771A|711A|8041HD))'
11051
  model: '$1'
11052
  - regex: 'TM-4503'
11053
  device: 'smartphone'
11099
 
11100
  # Telefunken
11101
  Telefunken:
11102
+ regex: 'TEL-1013GIQA|(TF-MID(?:9705RG|7805G|1010G))'
11103
+ device: 'tablet'
11104
  models:
11105
  - regex: 'TEL-1013GIQA'
 
11106
  model: 'Giqa 10.1 3G'
11107
+ - regex: '(TF-MID(?:9705RG|7805G|1010G))'
11108
+ model: '$1'
11109
 
11110
  # Telego
11111
  Telego:
11333
 
11334
  # Ulefone
11335
  Ulefone:
11336
+ regex: 'Ulefone|Power_[356]|S10_Pro|(Armor(?:[ _]2)?|U00[78][ _]Pro|Be[ _]X|Be[ _]Touch(?:[ _][23])?|Be[ _](?:One|Pure)(?:[ _]Lite)?) Build'
11337
  device: 'smartphone'
11338
  models:
11339
  - regex: 'S10_Pro'
11358
  model: 'Armor 2'
11359
  - regex: 'Armor Build'
11360
  model: 'Armor'
11361
+ - regex: 'Power_([356])'
11362
  model: 'Power $1'
11363
  - regex: 'Ulefone[_ ](X|S1[ _]Pro|S[17])[);\ ]'
11364
  model: '$1'
11369
 
11370
  # UMIDIGI
11371
  UMIDIGI:
11372
+ regex: 'UMI(?:DIGI)?[ _]|A5_Pro'
11373
  device: 'smartphone'
11374
  models:
11375
+ - regex: 'A5_Pro'
11376
+ model: 'A5 Pro'
11377
  - regex: 'UMI(?:DIGI)?[ _]([^/;]+) Build'
11378
  model: '$1'
11379
 
11445
  - regex: '(?:ViewSonic-)?V500[);/ ]'
11446
  model: 'V500'
11447
  device: 'smartphone'
11448
+ - regex: 'ViewSonic A8\+[);/ ]'
11449
+ model: 'A8 Plus'
11450
+ device: 'smartphone'
11451
  - regex: '(?:ViewSonic-)?ViewPhone ?([^;/]+) Build'
11452
  model: 'ViewPhone $1'
11453
  device: 'smartphone'
11511
 
11512
  # Venso mobile
11513
  Venso:
11514
+ regex: '(CX-508|CX-551)[/;) ]'
11515
  device: 'smartphone'
11516
  model: '$1'
11517
 
11543
 
11544
  # Vestel
11545
  Vestel:
11546
+ regex: 'Venus[ _](GO|V[1-9]|Z[1-9]0)|V_?TAB|VP74|VT97PRO|VSP145M|VSP250G|VSP355[GS]'
11547
  device: 'smartphone'
11548
  models:
11549
  - regex: 'VT97PRO'
11573
  model: 'Venus V$1'
11574
  - regex: 'Venus[ _]Z([1-9]0)'
11575
  model: 'Venus Z$1'
11576
+ - regex: 'Venus[ _]GO'
11577
+ model: 'Venus Go'
11578
 
11579
  # Videocon
11580
  Videocon:
11588
 
11589
  # Vodafone
11590
  Vodafone:
11591
+ regex: 'Vodafone[ _-]|Smart ?Tab ?(?:III? ?)?(?:|4G|7|10)[);/ -]|VodafoneSmartChat|VFD[ _][0-9]+[;/) ]|VFD320|VF6[89]5|VF-(696|795|895N|1497)'
11592
  device: 'smartphone'
11593
  models:
11594
  - regex: 'VFD 100'
11633
  model: 'Smart 4 Power'
11634
  - regex: 'VodafoneSmartChat'
11635
  model: 'Smart Chat'
11636
+ - regex: 'VF-696'
11637
+ model: 'Smart Grand 6'
11638
  - regex: 'VF-795'
11639
  model: 'Smart Speed 6'
11640
  - regex: 'VF-895N'
11641
  model: 'Smart Prime 6'
11642
+ - regex: 'VF-1497'
11643
+ model: 'Tab Prime 6'
11644
+ device: 'tablet'
11645
 
11646
  # explicit table models
11647
  - regex: 'VFD 1100'
11690
 
11691
  # Vonino
11692
  Vonino:
11693
+ regex: 'Vonino|Epic (?:E8|P7)|Gyga[ _](?:X|S|QS|XS)|Jax[ _](?:Q|QS|S|X|Mini)|Magnet[ _]M[19]|Navo_QS|Onyx_(QS|Z)|Orin_QS|Pluri[ _](?:[BCMQ]7|[CQ]8)|Sirius_QS|Volt[ _][XS]|Xavy_T7|Xylo[ _][XSPQ]|Zun[ _]X[OS]?'
11694
  device: 'smartphone'
11695
  models:
11696
  - regex: 'Zun[ _]XO'
11699
  model: 'Zun XS'
11700
  - regex: 'Zun[ _]X'
11701
  model: 'Zun X'
11702
+ - regex: 'Xylo[ _](P|S|X|Q)'
11703
  model: 'Xylo $1'
11704
  - regex: 'Volt[ _]S_A7'
11705
  model: 'Volt S A7'
11831
 
11832
  # Wiko
11833
  Wiko:
11834
+ regex: '(?:WIKO[_ -])|(?:WIKO-)?CINK_[a-z0-9_]+|(?:WIKO-)?HIGHWAY_[a-z0-9_]+|(?:WIKO-)?(?:Cink([^/;]*)|Highway([^/;]*)|Iggy|Stairway|Rainbow ?(Jam|Lite|Up)?|Darkside|Darkmoon|Darkfull|Darknight|Freddy|FEVER|Jerry[2]?|Sublim|Ozzy|JIMMY|Barry|Birdy|Bloom|Getaway|Goa|Kite|Robby|Lenny[2-9]?|Slide|Sunset[2-9]?|Sunny[2-9]?|Tommy[2-9]?|PULP(?: Fab)?|Wax|HARRY|Ridge(?: Fab)?|U FEEL(?: Prime| Lite)?|U PULSE(?: LITE)?|View2 Go|View XL|View Prime)(?: Plus)?(?: 4G)?(?: Build|$)?|W_(?:C800|K[346]00|P200)|WC300|W-(V800|P[36]11|K510)-EEA|WIM Lite'
11835
  device: 'smartphone'
11836
  models:
11837
  - regex: '(?:Wiko-)?Cink([^/;]*) Build'
11910
  model: 'Sunset 2'
11911
  - regex: '(?:WIKO-)?Sunset'
11912
  model: 'Sunset'
11913
+ - regex: '(?:WIKO-)?Sunny3'
11914
+ model: 'Sunny 3'
11915
  - regex: '(?:WIKO-)?Sunny2 Plus'
11916
  model: 'Sunny 2 Plus'
11917
  - regex: '(?:WIKO-)?Sunny2'
11952
  model: 'U Feel Prime'
11953
  - regex: '(?:WIKO-)?U FEEL'
11954
  model: 'U Feel'
11955
+ - regex: '(?:WIKO-)?View2 Go'
11956
+ model: 'View 2 Go'
11957
  - regex: '(?:WIKO-)?View XL'
11958
  model: 'View XL'
11959
  - regex: '(?:WIKO-)?View Prime'
11962
  model: 'View Lite'
11963
  - regex: 'W_C800'
11964
  model: 'View 2'
11965
+ - regex: 'W_P200'
11966
+ model: 'View Max'
11967
  - regex: 'W-V800-EEA'
11968
  model: 'View 3 Lite'
11969
+ - regex: 'W-K510-EEA'
11970
+ model: 'Y60'
11971
+ - regex: 'W-P311-EEA'
11972
+ model: 'View 3'
11973
+ - regex: 'W-P611-EEA'
11974
+ model: 'View 3 Pro'
11975
  - regex: 'Wiko ([^/;]+) Build'
11976
  model: '$1'
11977
  - regex: 'Wiko ([^/; ]+)'
11978
  model: '$1'
11979
 
11980
+ # Wieppo
11981
+ Wieppo:
11982
+ regex: 'Wieppo (S6 Lite|S[658])[;/) ]'
11983
+ device: 'smartphone'
11984
+ model: '$1'
11985
+
11986
  # Wink
11987
  Wink:
11988
  regex: 'Wink_'
12066
 
12067
  # Xiaomi
12068
  Xiaomi:
12069
+ regex: 'Xiaomi(?!/MiuiBrowser)|(?:MI [a-z0-9]+|Mi-4c|MI-One[ _]?[a-z0-9]+|MIX(?: 2S?)?)[);/ ]|HM (?:[^/;]+) (?:Build|MIUI)|(?:2014501|2014011|201481[12378]|201302[23]|2013061) Build|Redmi|POCOPHONE|SKR-[AH]0|SKW-[AH]0|POCO F1|DLT-[AH]0|MIBOX[34]|MiTV4[CSX]|AWM-A0'
12070
  device: 'smartphone'
12071
  models:
12072
  # specific smartphone models
12073
  - regex: 'SKR-[AH]0'
12074
  model: 'Black Shark'
12075
+ - regex: 'AWM-A0'
12076
+ model: 'Black Shark Helo'
12077
  - regex: 'SKW-[AH]0'
12078
  model: 'Black Shark 2'
12079
+ - regex: 'DLT-[AH]0'
12080
  model: 'Black Shark 2 Pro'
12081
  - regex: 'Xiaomi_2014501|2014501 Build'
12082
  model: 'Hongmi 4G'
12139
  - regex: 'MI PAD[);/ ]'
12140
  model: 'Mi Pad'
12141
  device: 'tablet'
12142
+ - regex: 'MIBOX([34])[);/ ]'
12143
+ model: 'Mi Box $1'
12144
+ device: 'tv'
12145
+ - regex: '(MiTV)(4[CSX]|4)[);/ ]'
12146
+ model: '$1 $2'
12147
+ device: 'tv'
12148
  - regex: 'HM NOTE 1W (?:Build|MIUI)'
12149
  device: 'phablet'
12150
  model: 'Redmi Note'
12423
 
12424
  # Toshiba
12425
  Toshiba:
12426
+ regex: 'Toshiba|TSBNetTV/|portalmmm/[12].0 TS|T-01C|T-0[12]D|IS04|IS11T|AT1S0|AT300SE|AT(7-C|10-A|10[PL]E-A|100|200|270|300|330|374|400|470|500|503|570|703|830)'
12427
  device: 'smartphone'
12428
  models:
12429
  # explicit smartphone models
12439
  model: 'Regza IS11T'
12440
 
12441
  # explicit tablet models
12442
+ - regex: 'AT7-C'
12443
+ model: 'Excite'
12444
+ device: 'tablet'
12445
  - regex: 'AT1S0'
12446
  model: 'Regza AT1S0'
12447
  device: 'tablet'
12480
  model: 'Fly 5 Lite'
12481
  - regex: 'VIVAX[ _]Fly3'
12482
  model: 'Fly 3'
12483
+ - regex: 'VIVAX (Point X551)'
12484
+ model: '$1'
12485
  - regex: 'SMART Point X5010'
12486
  model: 'Smart Point X5010'
12487
 
12612
  model: 'Era Nano 3'
12613
  - regex: '(?:Fly_)?IQ440(?: Build|[;/\)])'
12614
  model: 'Energy'
12615
+ - regex: '(?:Fly_)?IQ4401(?: Build|[;/\)])'
12616
+ model: 'Era Energy 2'
12617
  - regex: '(?:Fly_)?IQ441(?: Build|[;/\)])'
12618
  model: 'Radiance'
12619
  - regex: '(?:Fly_)?IQ442(?: Build|[;/\)])'
12754
 
12755
  # Zopo
12756
  Zopo:
12757
+ regex: 'ZOPO|(?:ZOPO[_ ])?(Flash X3|ZP[0-9]{2,}[^/;]+)(?:\)| Build)'
12758
  device: 'smartphone'
12759
  models:
12760
+ - regex: '(ZOPO_C2_MOD|ZP998)[);/ ]'
12761
  model: 'C2 II'
12762
  - regex: '(?:ZOPO_)?ZP980[+][);/ ]'
12763
  model: 'ZP980+'
12767
  model: 'Speed 7 Plus'
12768
  - regex: 'ZP951[);/ ]'
12769
  model: 'Speed 7'
12770
+ - regex: 'ZP955[);/ ]'
12771
+ model: 'Speed 8'
12772
  - regex: 'ZP950[+h]?[);/ ]'
12773
  model: 'Leader Max'
12774
  - regex: 'ZP(?:900H?|910)[);/ ]'
12779
  model: 'Libero'
12780
  - regex: 'ZP330[);/ ]'
12781
  model: 'Color C'
12782
+ - regex: 'ZP370[);/ ]'
12783
+ model: 'Color S'
12784
+ - regex: 'ZP5(63|86)[);/ ]'
12785
+ model: 'Color X'
12786
+ - regex: 'ZP567[);/ ]'
12787
+ model: 'Color C5i'
12788
  - regex: 'ZP300[S+]?[);/ ]'
12789
  model: 'Field'
12790
  - regex: 'ZP200[+]?[);/ ]'
12793
  model: 'Pilot'
12794
  - regex: 'ZP1790[);/ ]'
12795
  model: 'Flash X2'
12796
+ - regex: 'ZP781[);/ ]'
12797
+ model: 'Flash G5 Plus'
12798
  - regex: '(Flash X3|ZP[0-9]{2,}[^/;]+) Build'
12799
  model: '$1'
12800
 
12801
  # ZTE
12802
  ZTE:
12803
+ regex: 'ZTE|AxonPhone|([a-z0-9]+)_USA_Cricket|(?:Blade (?:L110|L[2357]|L7A|S6|V[6789]|V8Q|V8 SE|V9 VITA|X7|A(310|460|465|475|520|530|602)|V580)|N9[15]8St|NX(?:403A|404H|406E|40[X2]|507J|503A|505J|506J|508J|510J|512J|511J|513J|521J|523J_V1|529J|531J|541J|5[48]9J|551J|563J|569[HJ]|573J|575J|591J|595J|597J|60[19]J|61[269]J|62[79]J|907J)|N951[0579]|N9180|N9101|N913[67]|N952[01]|N9560|N9810|N799D|[UV]9180|[UV]9815|Z(?:233V|331|667T|768G|792|81[25]|82[08]|83[12359]|85[125]|851M|(557|71[67]|798|836|861|916)BL|986DL|(232|718|828)TL|(233|353|558|717|799|837|862|899|917|963)VL|955A|95[678]|965|97[018]|98[1237]|986U|999)|Apex2|G (LTE|Lux)|Vec)[);/ ]|KIS II Max|Kis 3|K3DX-V5G|Z930L|Blade A5 2019-T|BLADE A6 MAX|Nubia Z9'
12804
  device: 'smartphone'
12805
  models:
12806
  # explicit smartphone models
12807
  - regex: 'N799D[);/ ]'
12808
  model: 'Blade Eg'
12809
+ - regex: 'K3DX-V5G[);/ ]'
12810
+ model: 'V5G'
12811
  - regex: 'N918St[);/ ]'
12812
  model: 'V5S'
12813
  - regex: 'N958St[);/ ]'
12852
  model: 'Nubia Z7 max'
12853
  - regex: 'NX508J[);/ ]'
12854
  model: 'Nubia Z9'
12855
+ - regex: '(NX5[12]1J|Nubia Z9 mini)[);/ ]'
12856
  model: 'Nubia Z9 mini'
12857
+ - regex: '(NX510J|Nubia Z9 Max)[);/ ]'
12858
  model: 'Nubia Z9 max'
12859
  - regex: 'NX512J[);/ ]'
12860
  model: 'Nubia Z9 max dual'
12874
  model: 'Nubia Z17'
12875
  - regex: 'NX569H[);/ ]'
12876
  model: 'Nubia Z17 Mini'
12877
+ - regex: 'NX589J[);/ ]'
12878
+ model: 'Nubia Z17 Mini S'
12879
  - regex: 'NX595J'
12880
  model: 'Nubia Z17S'
12881
+ - regex: 'NX612J[);/ ]'
12882
+ model: 'Nubia V18'
12883
+ - regex: 'NX627J'
12884
+ model: 'Nubia Z20'
12885
  - regex: 'NX513J[);/ ]'
12886
  model: 'Nubia My Prague'
12887
  - regex: 'NX591J[);/ ]'
12892
  model: 'Nubia X6'
12893
  - regex: 'NX609J[);/ ]'
12894
  model: 'Nubia Red Magic'
12895
+ - regex: 'NX619J[);/ ]'
12896
+ model: 'Nubia Red Magic Mars'
12897
+ - regex: 'NX629J[);/ ]'
12898
+ model: 'Nubia Red Magic 3'
12899
  - regex: 'NX573J'
12900
  model: 'Nubia M2 Lite'
12901
  - regex: 'NX907J[);/ ]'
13181
  model: '$1'
13182
  # MTC
13183
  MTC:
13184
+ regex: 'MTC[ _](97[82]|970|982[OT]|982|1078)|(MTC_)?SMART[ _]?(Race|Sprint|Run|Surf2)[ _]4G|MTC975'
13185
  device: 'smartphone'
13186
  models:
13187
  - regex: 'MTC[ _](97[82]|970[H]?|982[OT]|982)'
13193
  device: 'tablet'
13194
  - regex: 'SMART[ _]Race[ _]4G'
13195
  model: 'Smart Race 4G'
13196
+ - regex: '(MTC_)?SMART[ _]Sprint[ _]4G'
13197
  model: 'Smart Sprint 4G'
13198
+ - regex: 'SMART[ _]?Run[ _]4G'
13199
  model: 'Smart Run 4G'
13200
+ - regex: 'SMART[ _]Surf2[ _]4G'
13201
+ model: 'Smart Surf 2 4G'
13202
 
13203
  # MegaFon
13204
  MegaFon:
13205
+ regex: 'MegaFon|MFLoginPh|MegLogPh|(MFLogin[34]T?|MS3B|SP-A5|SP-A20i)[)\; ]'
13206
  device: 'smartphone'
13207
  models:
13208
+ - regex: 'MFLoginPh|MegLogPh'
13209
  model: 'Login+'
13210
  - regex: 'MFLogin4'
13211
  model: 'Login 4 LTE'
13212
+ - regex: 'MFLogin3T|MegaFon Login 3'
13213
+ model: 'Login 3'
13214
+ device: 'tablet'
13215
  - regex: 'MS3B'
13216
  model: 'Optima'
13217
  - regex: 'SP-A20i'
13248
 
13249
  # Starway
13250
  Starway:
13251
+ regex: 'Andromeda[ _]S(707|84[05]|8)[;/) ]'
13252
  device: 'tablet'
13253
  model: 'Andromeda S$1'
13254
 
13302
 
13303
  # Xiaolajiao
13304
  Xiaolajiao:
13305
+ regex: '(LA2-(?:L|S[N]?)|HLA Note3)[);/ ]'
13306
  device: 'smartphone'
13307
+ models:
13308
+ - regex: 'HLA Note3[);/ ]'
13309
+ model: 'Red Pepper Note 3'
13310
+ - regex: '(LA2-(?:L|S[N]?))[);/ ]'
13311
+ model: '$1'
13312
 
13313
  # Ritmix
13314
  Ritmix:
13315
+ regex: 'RMD[-_](10(?:2[68]|5[89])|726|857|870)[);/ ]'
13316
  device: 'tablet'
13317
  model: 'RMD-$1'
13318
 
13351
  model: 'Smart 4G Speedy 5.0 Plus'
13352
 
13353
  Yandex:
13354
+ regex: '(YNDX-?000SB)[;)\ ]'
13355
  device: 'smartphone'
13356
+ model: 'YNDX-000SB'
13357
 
13358
  # FORME
13359
  FORME:
13379
 
13380
  # Highscreen
13381
  Highscreen:
13382
+ regex: 'HIGHSCREEN|(Power Ice Max|Power Rage Evo|Zera[ _][UFS]|PowerFivePro|PowerFour|BOOST II)[;)/ ]'
13383
  device: 'smartphone'
13384
+ models:
13385
+ - regex: '(Power Ice Max|Power Rage Evo|Zera[ _][UFS])[;)/ ]'
13386
+ model: '$1'
13387
+ - regex: 'PowerFivePro[;)/ ]'
13388
+ model: 'Power Five Pro'
13389
+ - regex: 'PowerFour[;)/ ]'
13390
+ model: 'Power Four'
13391
+ - regex: 'HIGHSCREEN Easy-Power-Pro[;)/ ]'
13392
+ model: 'Easy Power Pro'
13393
+ - regex: 'BOOST II[;)/ ]'
13394
+ model: 'Boost 2'
13395
 
13396
  # CVTE
13397
  CVTE:
13398
  regex: 'CVTE[_ ](MSD338_(:?1G|512M))[;)/ ]'
13399
  device: 'tv'
13400
+ model: '$1'
13401
+
13402
+ # Globex
13403
+ Globex:
13404
+ regex: 'GU8012C[;)/ ]'
13405
+ device: 'tablet'
13406
+ model: 'X8'
13407
+
13408
+ # Atom
13409
+ Atom:
13410
+ regex: 'ATOM-(108AM)[;)/ ]'
13411
+ device: 'tv'
13412
+ model: '$1'
13413
+
13414
+ # Qumo
13415
+ Qumo:
13416
+ regex: 'QUMO[ _]?|(Vega[ _]?78[23])[;)/ ]'
13417
+ device: 'tablet'
13418
+ models:
13419
+ - regex: '(?:QUMO[ _]?)?Vega[ _]?(78[23]|8002)[;)/ ]'
13420
+ model: 'Vega $1'
13421
+ - regex: 'Yooda[;)/ ]'
13422
+ model: 'Yooda'
13423
+ - regex: '(Sirius 101-4G 8GB Black|Altair 701 8GB Black|Altair 7004)[;)/ ]'
13424
+ model: '$1'
13425
+ - regex: 'QUMO[ _]Quest[ _]?(35[34]|402|45[28]|476|570|600)[;)/ ]'
13426
+ device: 'smartphone'
13427
+ model: 'Quest $1'
13428
+
13429
+ # Umax
13430
+ Umax:
13431
+ regex: 'VisionBook[ _]'
13432
+ device: 'tablet'
13433
+ models:
13434
+ - regex: '(VisionBook[ _](?:7Qi 3G|7Q Plus|8Q LTE|8Q_Plus|10Qi_3G))[;)/ ]'
13435
+ model: '$1'
13436
+ - regex: '(VisionBook[ _](?:P50 LTE|P55 LTE(?: Pro)?))[;)/ ]'
13437
+ device: 'smartphone'
13438
+ model: '$1'
13439
+
13440
+ # Mann
13441
+ Mann:
13442
+ regex: '(ZUG 3|ZUG 5S(?: Q)?)[;)/ ]'
13443
+ device: 'smartphone'
13444
+ model: '$1'
13445
+
13446
+ # Unihertz
13447
+ Unihertz:
13448
+ regex: '(Titan|Jelly-Pro)[;)/ ]'
13449
+ device: 'smartphone'
13450
+ models:
13451
+ - regex: '(Jelly)-(Pro)[;)/ ]'
13452
+ model: '$1 $2'
13453
+ - regex: '(Titan)[;)/ ]'
13454
+ model: '$1'
13455
+
13456
+ # Chuwi
13457
+ Chuwi:
13458
+ regex: 'CW-(Hi8-super|Hi12|V99|V17HD3G|VX8-3G|V88-QUAD|V9-DUAL|V88S|Vi[78]|[HV]i10 (pro|plus))[;)/ ]'
13459
+ device: 'tablet'
13460
+ models:
13461
+ - regex: '(CW-Hi8-super)[;)/ ]'
13462
+ model: 'Hi8'
13463
+ - regex: 'CW-(Vi10) plus[;)/ ]'
13464
+ model: '$1 Plus'
13465
+ - regex: 'CW-(V88)-QUAD[;)/ ]'
13466
+ model: '$1 Quad'
13467
+ - regex: 'CW-(V9)-DUAL[;)/ ]'
13468
+ model: '$1 Dual'
13469
+ - regex: 'CW-(V17HD|VX8)-?(3G)[;)/ ]'
13470
+ model: '$1 $2'
13471
+ - regex: 'CW-(Hi10) pro[;)/ ]'
13472
+ model: '$1 Pro'
13473
+ - regex: 'CW-(Vi[78]|Hi12|V99|V88S)[;)/ ]'
13474
+ model: '$1'
13475
+
13476
+ # Bezkam
13477
+ Bezkam:
13478
+ regex: 'BEZKAM (BK-RAM2)[;)/ ]'
13479
+ device: 'smartphone'
13480
+ model: '$1'
13481
+
13482
+ # NG Optics
13483
+ 'NG Optics':
13484
+ regex: '(NG3128HD)[;)/ ]'
13485
+ device: 'tv'
13486
+ model: '$1'
13487
+
13488
+ # KATV1
13489
+ KATV1:
13490
+ regex: '(KATV-01) PRO[;)/ ]'
13491
+ device: 'tv'
13492
+ model: '$1 Pro'
13493
+
13494
+ # Ghong
13495
+ Ghong:
13496
+ regex: 'GHONG(V10)[;)/ ]'
13497
+ device: 'smartphone'
13498
+ model: '$1'
13499
+
13500
+ # Xoro
13501
+ Xoro:
13502
+ regex: 'TelePAD(795|731|1032|10A3|7A3)|Era 2X[;)/ ]'
13503
+ device: 'tablet'
13504
+ models:
13505
+ - regex: 'TelePAD(7|10)A3 4G[;)/ ]'
13506
+ model: 'TelePad $1 A3 4G'
13507
+ - regex: 'TelePAD(795|731|1032)[;)/ ]'
13508
+ model: 'TelePad $1'
13509
+ - regex: '(Era 2X)[;)/ ]'
13510
+ model: '$1'
13511
+ device: 'smartphone'
13512
+
13513
+ # Vinga
13514
+ Vinga:
13515
+ regex: 'VMP-(021-82|041-162|011-81)[);/ ]'
13516
+ device: 'tv'
13517
+ models:
13518
+ - regex: 'VMP-021-82'
13519
+ model: '021'
13520
+ - regex: 'VMP-041-162'
13521
+ model: '041'
13522
+ - regex: 'VMP-011-81'
13523
+ model: '011'
13524
+
13525
+ # Nuvo
13526
+ Nuvo:
13527
+ regex: 'Nuvo[_ ](NS35|Blue ND40|Green[_ ]ND[_ ]45)[);/ ]'
13528
+ device: 'smartphone'
13529
+ models:
13530
+ - regex: 'Nuvo[_ ](NS35)[);/ ]'
13531
+ model: '$1'
13532
+ - regex: 'Blue (ND40)[);/ ]'
13533
+ model: '$1'
13534
+ - regex: 'Green[_ ]ND[_ ]45[);/ ]'
13535
+ model: 'ND45'
13536
+
13537
+ # Sunvell
13538
+ Sunvell:
13539
+ regex: 'T95ZPLUS[);/ ]'
13540
+ device: 'tv'
13541
+ model: 'T95Z Plus'
13542
+
13543
+ # AllDocube
13544
+ AllDocube:
13545
+ regex: 'T1001XS[);/ ]'
13546
+ device: 'tablet'
13547
+ model: 'M5XS'
13548
+
13549
+ # Ugoos
13550
+ Ugoos:
13551
+ regex: 'UGOOS-AM6[);/ ]'
13552
+ device: 'tv'
13553
+ model: 'AM6'
13554
+
13555
+ # Yxtel
13556
+ Yxtel:
13557
+ regex: 'YXTEL_([HU]1|U3)[);/ ]'
13558
+ device: 'smartphone'
13559
+ model: '$1'
13560
+
13561
+ # Proline
13562
+ Proline:
13563
+ regex: '(H10882M-TN)[);/ ]'
13564
+ device: 'tablet'
13565
+ model: '$1'
13566
+
13567
+ # Yota
13568
+ Yota:
13569
+ regex: '(YD20[16]|YOTA 3[+])[);/ ]'
13570
+ device: 'smartphone'
13571
+ models:
13572
+ - regex: 'YD20[16][);/ ]'
13573
+ model: 'Phone 2'
13574
+ - regex: 'YOTA 3[+][);/ ]'
13575
+ model: 'Phone 3 Plus'
13576
+
13577
+ # Mystery
13578
+ Mystery:
13579
+ regex: '(MYSTERY|MID-(?:123G|72[12]|7[01348]3G|753G|833G))[);/ ]'
13580
+ device: 'tablet'
13581
+ models:
13582
+ - regex: 'MID-(123G|72[12]|7[01348]3G|753G|833G)[);/ ]'
13583
+ model: 'MID-$1'
13584
+
13585
+ # Ritzviva
13586
+ Ritzviva:
13587
+ regex: '(RITZVIVA[_ ]S500C)[);/ ]'
13588
+ device: 'smartphone'
13589
+ model: 'S500C'
13590
+
13591
+ # DeWalt
13592
+ DeWalt:
13593
+ regex: 'DeWalt (MD501)[);/ ]'
13594
+ device: 'smartphone'
13595
+ model: '$1'
13596
+
13597
+ # Runbo
13598
+ Runbo:
13599
+ regex: 'Runbo'
13600
+ device: 'smartphone'
13601
+ models:
13602
+ - regex: 'Runbo[ _-]?(X5-W|F1 Plus|F1-TT|F1-EN|F1|TT|Q5-S|X5-King)[);/ ]'
13603
+ model: '$1'
13604
+
13605
+ # NewsMy
13606
+ NewsMy:
13607
+ regex: '(CarPad-(?:II|III)-P)[);/ ]'
13608
+ device: 'car browser'
13609
+ model: '$1'
13610
+
13611
+ # Daewoo
13612
+ Daewoo:
13613
+ regex: 'Daewoo'
13614
+ device: 'tv'
13615
+ models:
13616
+ - regex: 'Daewoo (Android TV 638)[);/ ]'
13617
+ model: '$1'
13618
+
13619
+ # Vesta
13620
+ Vesta:
13621
+ regex: 'VESTA32LD86[);/ ]'
13622
+ device: 'tv'
13623
+ model: 'SmartT V2.0 32LD86S'
13624
+
13625
+ # Spectrum
13626
+ Spectrum:
13627
+ regex: '(CARBONO_5|CUARZO_6|DIAMANTE_5|VULCANO_55)[);/ ]'
13628
+ device: 'smartphone'
13629
+ models:
13630
+ - regex: 'VULCANO_55[);/ ]'
13631
+ model: 'Vulcano 5.5"'
13632
+ - regex: 'CARBONO_5[);/ ]'
13633
+ model: 'Carbono 5.0"'
13634
+ - regex: 'CUARZO_6[);/ ]'
13635
+ model: 'Cuarzo 6.0"'
13636
+ - regex: 'DIAMANTE_5[);/ ]'
13637
+ model: 'Diamante 5.0"'
13638
+
13639
+ # Kivi
13640
+ Kivi:
13641
+ regex: '(4[39]UP50GU|40UR50GU|32HR55GU|55UP50GU)[);/ ]'
13642
+ device: 'tv'
13643
+ model: '$1'
13644
+
13645
+ # Divisat
13646
+ Divisat:
13647
+ regex: '(Divisat)[);/ ]'
13648
+ device: 'tv'
13649
+ models:
13650
+ - regex: '(J-Link)[);/ ]'
13651
+ model: '$1'
13652
+
13653
+ # Kanji
13654
+ Kanji:
13655
+ regex: 'KJ-(OB03|YUBI)[);/ ]'
13656
+ device: 'tablet'
13657
+ models:
13658
+ - regex: 'KJ-OB03[);/ ]'
13659
+ model: 'Cata 7'
13660
+ - regex: 'KJ-YUBI[);/ ]'
13661
+ model: 'Yubi 3G'
13662
+
13663
+ #Kaiomy
13664
+ Kaiomy:
13665
+ regex: 'KaiCloud[ ]?(7[48]4|942)[);/ ]'
13666
+ device: 'tablet'
13667
+ model: 'KaiCloud $1'
13668
+
13669
+ # National
13670
+ National:
13671
+ regex: '(NX-32THS100)[);/ ]'
13672
+ device: 'tv'
13673
+ model: '$1'
13674
+
13675
+ # Vsun
13676
+ Vsun:
13677
+ regex: 'VSUN (ILLUSION|RACE|V9)[);/ ]'
13678
+ device: 'smartphone'
13679
+ models:
13680
+ - regex: 'ILLUSION[);/ ]'
13681
+ model: 'Illusion'
13682
+ - regex: 'RACE[);/ ]'
13683
+ model: 'Race'
13684
+ - regex: '(V9)[);/ ]'
13685
+ model: '$1'
13686
+
13687
+ # Shift Phones
13688
+ Shift Phones:
13689
+ regex: '(SHIFT6m)[);/ ]'
13690
+ device: 'smartphone'
13691
+ model: '$1'
13692
+
13693
+ # RugGear
13694
+ RugGear:
13695
+ regex: '(RG702)[);/ ]'
13696
+ device: 'smartphone'
13697
+ model: '$1'
13698
+
13699
+ # Aligator
13700
+ Aligator:
13701
+ regex: 'ALIGATOR[);/ ]'
13702
+ device: 'smartphone'
13703
+ models:
13704
+ - regex: 'ALIGATOR (S50(?:65|70))[);/ ]'
13705
+ model: '$1'
13706
+
13707
+ # Maxcom
13708
+ Maxcom:
13709
+ regex: '(MS(?:45[036]|505|514)|MS457(?:PLUS)?)[);/ ]'
13710
+ device: 'smartphone'
13711
+ models:
13712
+ - regex: '(MS457)PLUS[);/ ]'
13713
+ model: '$1 Plus'
13714
+ - regex: 'MS(45[0367]|505|514|)[);/ ]'
13715
+ model: 'MS$1'
13716
+
13717
+ # Luna
13718
+ Luna:
13719
+ regex: 'LUNA[ _](V55|G60)[);/ ]'
13720
+ device: 'smartphone'
13721
  model: '$1'
app/vendor/piwik/device-detector/regexes/device/portable_media_player.yml CHANGED
@@ -56,4 +56,4 @@ Samsung:
56
  - regex: 'YP-G50'
57
  model: 'Galaxy Player 50'
58
  - regex: 'YP-GB70D'
59
- model: 'Galaxy Player 70 Plus'
56
  - regex: 'YP-G50'
57
  model: 'Galaxy Player 50'
58
  - regex: 'YP-GB70D'
59
+ model: 'Galaxy Player 70 Plus'
assets/css/admin-style.css CHANGED
@@ -87,6 +87,10 @@ ol.matomo-list {
87
  font-weight: bold;
88
  }
89
 
 
 
 
 
90
  .postbox .table .widefat.matomo-table {
91
  border: 0;
92
  }
87
  font-weight: bold;
88
  }
89
 
90
+ .matomo-dashboard-container .postbox-container {
91
+ min-width: 40%;
92
+ }
93
+
94
  .postbox .table .widefat.matomo-table {
95
  border: 0;
96
  }
assets/js/asset_manager_core_js.js CHANGED
@@ -1,4 +1,4 @@
1
- /* Matomo Javascript - cb=e4651ae98a7539215063c712af63f642*/
2
 
3
  /*! jQuery Browser - v0.1.0 - 3/23/2012
4
  * https://github.com/jquery/jquery-browser
@@ -872,7 +872,7 @@ return result;},getValuesFromUrl:function(url){var searchString=this._removeHash
872
  hashStr=hashStr.split('#')[0];return broadcast.getParamValue(param,hashStr);},getParamValue:function(param,url){var lookFor=param+'=';var startStr=url.indexOf(lookFor);if(startStr>=0){return getSingleValue(startStr,url);}else{url=decodeURIComponent(url);lookFor=param+'[]=';startStr=url.indexOf(lookFor);if(startStr>=0){var result=[getSingleValue(startStr)];while((startStr=url.indexOf(lookFor,startStr+1))!==-1){result.push(getSingleValue(startStr));}
873
  return result;}else{return'';}}
874
  function getSingleValue(startPos){var endStr=url.indexOf("&",startPos);if(endStr===-1){endStr=url.length;}
875
- var value=url.substring(startPos+lookFor.length,endStr);if(param!='segment'){value=value.replace(/[^_%~\*\+\-\<\>!@\$\.()=,;0-9a-zA-Z]/gi,'');}
876
  return value;}},getHash:function(){return broadcast.getHashFromUrl().replace(/^#/,'').split('#')[0];},_removeHashFromUrl:function(url){var searchString='';if(url){var urlParts=url.split('#');searchString=urlParts[0];}else{searchString=window.location.search;}
877
  return searchString;}};
878
  /*!
@@ -1791,7 +1791,7 @@ if('toast'==scope.type){addToastEvent();}
1791
  if(!scope.noclear){addCloseEvent();}
1792
  function addToastEvent(){$timeout(function(){element.fadeOut('slow',function(){element.remove();});},scope.toastLength);}
1793
  function addCloseEvent(){element.on('click','.close',function(event){if(event&&event.delegateTarget){angular.element(event.delegateTarget).remove();}});}
1794
- function closeExistingNotificationHavingSameIdIfNeeded(id,notificationElement){var existingNode=angular.element('[notification-id='+id+']').not(notificationElement);if(existingNode&&existingNode.length){existingNode.remove();}}}};}})();
1795
  /*!
1796
  * Piwik - free/libre analytics platform
1797
  *
@@ -3680,7 +3680,7 @@ return instance;}});})();
3680
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
3681
  */
3682
  (function(){angular.module('piwikApp').directive('piwikLiveWidgetRefresh',piwikLiveWidgetRefresh);piwikLiveWidgetRefresh.$inject=['piwik','$timeout'];function piwikLiveWidgetRefresh(piwik,$timeout){return{restrict:'A',scope:{liveRefreshAfterMs:'@'},compile:function(element,attrs){return function(scope,element,attrs){$timeout(function(){var segment=broadcast.getValueFromHash('segment');if(!segment){segment=broadcast.getValueFromUrl('segment');}
3683
- $(element).find('#visitsLive').liveWidget({interval:scope.liveRefreshAfterMs,onUpdate:function(){var ajaxRequest=new ajaxHelper();ajaxRequest.setFormat('html');ajaxRequest.addParams({module:'Live',action:'ajaxTotalVisitors',segment:segment},'GET');ajaxRequest.setCallback(function(r){$(element).find("#visitsTotal").html(r);});ajaxRequest.send();},maxRows:10,fadeInSpeed:600,dataUrlParams:{module:'Live',action:'getLastVisitsStart',segment:segment}});});};}};}})();
3684
  /*!
3685
  * Piwik - free/libre analytics platform
3686
  *
1
+ /* Matomo Javascript - cb=37addcf7ea70a383f0f9ad805a588fe5*/
2
 
3
  /*! jQuery Browser - v0.1.0 - 3/23/2012
4
  * https://github.com/jquery/jquery-browser
872
  hashStr=hashStr.split('#')[0];return broadcast.getParamValue(param,hashStr);},getParamValue:function(param,url){var lookFor=param+'=';var startStr=url.indexOf(lookFor);if(startStr>=0){return getSingleValue(startStr,url);}else{url=decodeURIComponent(url);lookFor=param+'[]=';startStr=url.indexOf(lookFor);if(startStr>=0){var result=[getSingleValue(startStr)];while((startStr=url.indexOf(lookFor,startStr+1))!==-1){result.push(getSingleValue(startStr));}
873
  return result;}else{return'';}}
874
  function getSingleValue(startPos){var endStr=url.indexOf("&",startPos);if(endStr===-1){endStr=url.length;}
875
+ var value=url.substring(startPos+lookFor.length,endStr);if(param!='segment'&&param!='popover'&&param!='compareSegments'){value=value.replace(/[^_%~\*\+\-\<\>!@\$\.()=,;0-9a-zA-Z]/gi,'');}
876
  return value;}},getHash:function(){return broadcast.getHashFromUrl().replace(/^#/,'').split('#')[0];},_removeHashFromUrl:function(url){var searchString='';if(url){var urlParts=url.split('#');searchString=urlParts[0];}else{searchString=window.location.search;}
877
  return searchString;}};
878
  /*!
1791
  if(!scope.noclear){addCloseEvent();}
1792
  function addToastEvent(){$timeout(function(){element.fadeOut('slow',function(){element.remove();});},scope.toastLength);}
1793
  function addCloseEvent(){element.on('click','.close',function(event){if(event&&event.delegateTarget){angular.element(event.delegateTarget).remove();}});}
1794
+ function closeExistingNotificationHavingSameIdIfNeeded(id,notificationElement){var notificationStillExists=!!notificationElement.parents('body').length;var existingNode=angular.element('[notification-id='+id+']').not(notificationElement);if(notificationStillExists&&existingNode&&existingNode.length){existingNode.remove();}}}};}})();
1795
  /*!
1796
  * Piwik - free/libre analytics platform
1797
  *
3680
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
3681
  */
3682
  (function(){angular.module('piwikApp').directive('piwikLiveWidgetRefresh',piwikLiveWidgetRefresh);piwikLiveWidgetRefresh.$inject=['piwik','$timeout'];function piwikLiveWidgetRefresh(piwik,$timeout){return{restrict:'A',scope:{liveRefreshAfterMs:'@'},compile:function(element,attrs){return function(scope,element,attrs){$timeout(function(){var segment=broadcast.getValueFromHash('segment');if(!segment){segment=broadcast.getValueFromUrl('segment');}
3683
+ $(element).find('#visitsLive').liveWidget({interval:scope.liveRefreshAfterMs,onUpdate:function(){var ajaxRequest=new ajaxHelper();ajaxRequest.setFormat('html');ajaxRequest.addParams({module:'Live',action:'ajaxTotalVisitors',segment:segment},'GET');ajaxRequest.setCallback(function(r){$(element).find("#visitsTotal").replaceWith(r);});ajaxRequest.send();},maxRows:10,fadeInSpeed:600,dataUrlParams:{module:'Live',action:'getLastVisitsStart',segment:segment}});});};}};}})();
3684
  /*!
3685
  * Piwik - free/libre analytics platform
3686
  *
classes/WpMatomo/Admin/Marketplace.php CHANGED
@@ -26,8 +26,21 @@ class Marketplace {
26
  $this->settings = $settings;
27
  }
28
 
 
 
 
 
 
 
 
 
 
 
29
  public function show() {
30
  $settings = $this->settings;
 
 
 
31
  include dirname( __FILE__ ) . '/views/marketplace.php';
32
  }
33
 
26
  $this->settings = $settings;
27
  }
28
 
29
+ private function show_premium_bundle_offer() {
30
+ if (get_option('matomo_marketplace_license_key')) {
31
+ return false; // already has features
32
+ }
33
+ if (is_plugin_active('HeatmapSessionRecording/HeatmapSessionRecording.php')) {
34
+ return false; // already has features
35
+ }
36
+ return true;
37
+ }
38
+
39
  public function show() {
40
  $settings = $this->settings;
41
+
42
+ $matomo_show_offer = $this->show_premium_bundle_offer();
43
+
44
  include dirname( __FILE__ ) . '/views/marketplace.php';
45
  }
46
 
classes/WpMatomo/Admin/SystemReport.php CHANGED
@@ -10,11 +10,13 @@
10
  namespace WpMatomo\Admin;
11
 
12
  use Piwik\CliMulti;
 
13
  use Piwik\Container\StaticContainer;
14
  use Piwik\Filesystem;
15
  use Piwik\MetricsFormatter;
16
  use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
17
  use Piwik\Plugins\Diagnostics\DiagnosticService;
 
18
  use WpMatomo\Bootstrap;
19
  use WpMatomo\Capabilities;
20
  use WpMatomo\Logger;
@@ -262,11 +264,10 @@ class SystemReport {
262
  );
263
 
264
  $paths = new Paths();
265
- $upload_dir = $paths->get_upload_base_dir();
266
- $path_config_file = $upload_dir . '/' . MATOMO_CONFIG_PATH;
267
  $rows = $this->check_file_exists_and_writable( $rows, $path_config_file, 'Config', true );
268
 
269
- $path_tracker_file = $upload_dir . '/matomo.js';
270
  $rows = $this->check_file_exists_and_writable( $rows, $path_tracker_file, 'JS Tracker', false );
271
 
272
  $rows[] = array(
@@ -432,6 +433,25 @@ class SystemReport {
432
  'comment' => '',
433
  );
434
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
435
  $num_days_check_visits = 5;
436
  $had_visits = $this->had_visits_in_last_days($num_days_check_visits);
437
  if ($had_visits === false || $had_visits === true) {
@@ -820,6 +840,14 @@ class SystemReport {
820
  'value' => $_SERVER['HTTP_USER_AGENT'],
821
  );
822
  }
 
 
 
 
 
 
 
 
823
 
824
  return $rows;
825
  }
10
  namespace WpMatomo\Admin;
11
 
12
  use Piwik\CliMulti;
13
+ use Piwik\Common;
14
  use Piwik\Container\StaticContainer;
15
  use Piwik\Filesystem;
16
  use Piwik\MetricsFormatter;
17
  use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
18
  use Piwik\Plugins\Diagnostics\DiagnosticService;
19
+ use Piwik\Plugins\UserCountry\LocationProvider;
20
  use WpMatomo\Bootstrap;
21
  use WpMatomo\Capabilities;
22
  use WpMatomo\Logger;
264
  );
265
 
266
  $paths = new Paths();
267
+ $path_config_file = $paths->get_config_ini_path();
 
268
  $rows = $this->check_file_exists_and_writable( $rows, $path_config_file, 'Config', true );
269
 
270
+ $path_tracker_file = $paths->get_matomo_js_upload_path();
271
  $rows = $this->check_file_exists_and_writable( $rows, $path_tracker_file, 'JS Tracker', false );
272
 
273
  $rows[] = array(
433
  'comment' => '',
434
  );
435
 
436
+ $location_provider = LocationProvider::getCurrentProvider();
437
+ if ($location_provider) {
438
+ $rows[] = array(
439
+ 'name' => 'Location provider ID',
440
+ 'value' => $location_provider->getId(),
441
+ 'comment' => '',
442
+ );
443
+ $rows[] = array(
444
+ 'name' => 'Location provider available',
445
+ 'value' => $location_provider->isAvailable(),
446
+ 'comment' => '',
447
+ );
448
+ $rows[] = array(
449
+ 'name' => 'Location provider working',
450
+ 'value' => $location_provider->isWorking(),
451
+ 'comment' => '',
452
+ );
453
+ }
454
+
455
  $num_days_check_visits = 5;
456
  $had_visits = $this->had_visits_in_last_days($num_days_check_visits);
457
  if ($had_visits === false || $had_visits === true) {
840
  'value' => $_SERVER['HTTP_USER_AGENT'],
841
  );
842
  }
843
+ if (!\WpMatomo::is_safe_mode()) {
844
+ Bootstrap::do_bootstrap();
845
+ $rows[] = array(
846
+ 'name' => 'Language',
847
+ 'value' => Common::getBrowserLanguage()
848
+ );
849
+ }
850
+
851
 
852
  return $rows;
853
  }
classes/WpMatomo/Admin/TrackingSettings.php CHANGED
@@ -81,6 +81,7 @@ class TrackingSettings implements AdminSettingsInterface {
81
  'limit_cookies_session',
82
  'limit_cookies_visitor',
83
  'limit_cookies',
 
84
  'disable_cookies',
85
  'add_download_extensions',
86
  'track_404',
81
  'limit_cookies_session',
82
  'limit_cookies_visitor',
83
  'limit_cookies',
84
+ 'force_post',
85
  'disable_cookies',
86
  'add_download_extensions',
87
  'track_404',
classes/WpMatomo/Admin/views/marketplace.php CHANGED
@@ -6,6 +6,7 @@
6
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
  * @package matomo
8
  */
 
9
 
10
  if ( ! defined( 'ABSPATH' ) ) {
11
  exit;
@@ -27,6 +28,13 @@ $matomo_extra_url_params = '&' . http_build_query(
27
  <p><?php esc_html_e( 'Only super users can see this page', 'matomo' ); ?></p>
28
  </div>
29
  <?php } ?>
 
 
 
 
 
 
 
30
 
31
  <div id="icon-plugins" class="icon32"></div>
32
 
@@ -86,6 +94,13 @@ $matomo_extra_url_params = '&' . http_build_query(
86
  'title' => 'Most popular premium features',
87
  'features' =>
88
  array(
 
 
 
 
 
 
 
89
  array(
90
  'name' => 'Heatmap & Session Recording',
91
  'description' => 'Truly understand your visitors by seeing where they click, hover, type and scroll. Replay their actions in a video and ultimately increase conversions.',
@@ -101,13 +116,6 @@ $matomo_extra_url_params = '&' . http_build_query(
101
  'image' => '',
102
  ),
103
 
104
- array(
105
- 'name' => 'Premium Bundle',
106
- 'description' => 'All premium features in one bundle, make the most out of your Matomo for WordPress and enjoy discounts of over 20%!',
107
- 'price' => '499EUR / 579USD',
108
- 'url' => 'https://plugins.matomo.org/WpPremiumBundle?wp=1',
109
- 'image' => '',
110
- ),
111
  ),
112
  ),
113
  array(
@@ -175,6 +183,13 @@ $matomo_extra_url_params = '&' . http_build_query(
175
  'url' => 'https://plugins.matomo.org/SearchEngineKeywordsPerformance?wp=1',
176
  'image' => '',
177
  ),
 
 
 
 
 
 
 
178
  /*
179
  array(
180
  'name' => 'Activity Log',
@@ -190,6 +205,20 @@ $matomo_extra_url_params = '&' . http_build_query(
190
  echo '<h2>' . esc_html( $matomo_feature_section['title'] ) . '</h2>';
191
  echo '<div class="wp-list-table widefat plugin-install"><div id="the-list">';
192
  foreach ( $matomo_feature_section['features'] as $matomo_index => $matomo_feature ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  $matomo_style = '';
194
  $matomo_is_3_columns = count( $matomo_feature_section['features'] ) === 3;
195
  if ( $matomo_is_3_columns ) {
@@ -247,7 +276,7 @@ $matomo_extra_url_params = '&' . http_build_query(
247
  <?php
248
  if ( ! empty( $matomo_feature['price'] ) ) {
249
  ?>
250
- From <?php echo esc_html( $matomo_feature['price'] ); ?>
251
  <?php
252
  } else {
253
  ?>
6
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7
  * @package matomo
8
  */
9
+ /** @var bool $matomo_show_offer */
10
 
11
  if ( ! defined( 'ABSPATH' ) ) {
12
  exit;
28
  <p><?php esc_html_e( 'Only super users can see this page', 'matomo' ); ?></p>
29
  </div>
30
  <?php } ?>
31
+ <?php if ( $matomo_show_offer ) { ?>
32
+ <div class="notice notice-info">
33
+ <p>Limited time only: 300€ Off Matomo Premium Bundle. Now only 199€/year.
34
+ <a href="https://matomo.org/wp-premium-bundle/" target="_blank" rel="noreferrer noopener" class="button">Learn more</a></p>
35
+ <div style="clear:both;"></div>
36
+ </div>
37
+ <?php } ?>
38
 
39
  <div id="icon-plugins" class="icon32"></div>
40
 
94
  'title' => 'Most popular premium features',
95
  'features' =>
96
  array(
97
+ array(
98
+ 'name' => 'Premium Bundle',
99
+ 'description' => 'All premium features in one bundle, make the most out of your Matomo for WordPress and enjoy discounts of over 20%!',
100
+ 'price' => '499EUR / 579USD',
101
+ 'url' => 'https://plugins.matomo.org/WpPremiumBundle?wp=1',
102
+ 'image' => '',
103
+ ),
104
  array(
105
  'name' => 'Heatmap & Session Recording',
106
  'description' => 'Truly understand your visitors by seeing where they click, hover, type and scroll. Replay their actions in a video and ultimately increase conversions.',
116
  'image' => '',
117
  ),
118
 
 
 
 
 
 
 
 
119
  ),
120
  ),
121
  array(
183
  'url' => 'https://plugins.matomo.org/SearchEngineKeywordsPerformance?wp=1',
184
  'image' => '',
185
  ),
186
+ array(
187
+ 'name' => 'Paid Advertising Performance',
188
+ 'description' => 'Analyse the success of your Google Ads campaigns directly in your Matomo. See what keywords and search queries are leading to clicks for your paid ads and bringing your business the highest ROI.',
189
+ 'price' => '79EUR / 89USD',
190
+ 'url' => 'https://plugins.matomo.org/PaidAdvertisingPerformance?wp=1',
191
+ 'image' => '',
192
+ ),
193
  /*
194
  array(
195
  'name' => 'Activity Log',
205
  echo '<h2>' . esc_html( $matomo_feature_section['title'] ) . '</h2>';
206
  echo '<div class="wp-list-table widefat plugin-install"><div id="the-list">';
207
  foreach ( $matomo_feature_section['features'] as $matomo_index => $matomo_feature ) {
208
+ if ($matomo_show_offer && $matomo_feature['name'] === 'Premium Bundle') {
209
+ ?><div class="plugin-card" style="width: calc(33% - 8px);min-width:282px;max-width:350px;">
210
+ <div style="border: 6px dashed red;text-align: center">
211
+ <h2 style="font-size: 24px;">
212
+ <a href="https://matomo.org/wp-premium-bundle/" target="_blank" rel="noreferrer noopener"><span style="color: black;">Limited time!</span><br><br><span style="color:red">300€ Off Premium Bundle</span></a></h2>
213
+ <p>All premium features in one bundle.<br>
214
+ No risk 100% money back guarantee.<br><br>
215
+ <a class="button-primary" href="https://matomo.org/wp-premium-bundle/" target="_blank" rel="noreferrer noopener">Get it for only 199€/year</a>
216
+ <br>
217
+ </p>
218
+ </div>
219
+ </div><?php
220
+ continue;
221
+ }
222
  $matomo_style = '';
223
  $matomo_is_3_columns = count( $matomo_feature_section['features'] ) === 3;
224
  if ( $matomo_is_3_columns ) {
276
  <?php
277
  if ( ! empty( $matomo_feature['price'] ) ) {
278
  ?>
279
+ <?php echo esc_html( $matomo_feature['price'] ); ?>
280
  <?php
281
  } else {
282
  ?>
classes/WpMatomo/Admin/views/summary.php CHANGED
@@ -49,7 +49,7 @@ global $wp;
49
  }
50
  ?>
51
 
52
- <div id="dashboard-widgets" class="metabox-holder columns-2 has-right-sidebar">
53
  <?php
54
  $matomo_columns = array( 1, 0 );
55
  foreach ( $matomo_columns as $matomo_column_index => $matomo_column_modulo ) {
49
  }
50
  ?>
51
 
52
+ <div id="dashboard-widgets" class="metabox-holder has-right-sidebar matomo-dashboard-container">
53
  <?php
54
  $matomo_columns = array( 1, 0 );
55
  foreach ( $matomo_columns as $matomo_column_index => $matomo_column_modulo ) {
classes/WpMatomo/Admin/views/tracking.php CHANGED
@@ -158,6 +158,8 @@ if ( $was_updated ) {
158
 
159
  $matomo_form->show_checkbox( 'track_crossdomain_linking', esc_html__( 'Enable cross domain linking', 'matomo' ), esc_html__( 'When enabled, it will make sure to use the same visitor ID for the same visitor across several domains. This works only when this feature is enabled because the visitor ID is stored in a cookie and cannot be read on the other domain by default. When this feature is enabled, it will append a URL parameter "pk_vid" that contains the visitor ID when a user clicks on a URL that belongs to one of your domains. For this feature to work, you also have to configure which domains should be treated as local in your Matomo website settings.', 'matomo' ), $matomo_is_not_tracking, $matomo_full_generated_tracking_group );
160
 
 
 
161
  $matomo_form->show_checkbox( 'track_feed', esc_html__( 'Track RSS feeds', 'matomo' ), esc_html__( 'Enable to track posts in feeds via tracking pixel.', 'matomo' ), $matomo_is_not_tracking, $matomo_full_generated_tracking_group . ' matomo-track-option-manually matomo-track-option-tagmanager' );
162
 
163
  $matomo_form->show_checkbox( 'track_feed_addcampaign', esc_html__( 'Track RSS feed links as campaign', 'matomo' ), esc_html__( 'This will add Matomo campaign parameters to the RSS feed links.', 'matomo' ) . ' ' . sprintf( esc_html__( 'See %1$sMatomo documentation%2$s.', 'matomo' ), '<a href="https://matomo.org/docs/tracking-campaigns/" target="_BLANK">', '</a>' ), $matomo_is_not_tracking, $matomo_full_generated_tracking_group . ' matomo-track-option-manually matomo-track-option-tagmanager', true, 'jQuery(\'tr.matomo-feed_campaign-option\').toggle(\'hidden\');' );
158
 
159
  $matomo_form->show_checkbox( 'track_crossdomain_linking', esc_html__( 'Enable cross domain linking', 'matomo' ), esc_html__( 'When enabled, it will make sure to use the same visitor ID for the same visitor across several domains. This works only when this feature is enabled because the visitor ID is stored in a cookie and cannot be read on the other domain by default. When this feature is enabled, it will append a URL parameter "pk_vid" that contains the visitor ID when a user clicks on a URL that belongs to one of your domains. For this feature to work, you also have to configure which domains should be treated as local in your Matomo website settings.', 'matomo' ), $matomo_is_not_tracking, $matomo_full_generated_tracking_group );
160
 
161
+ $matomo_form->show_checkbox( 'force_post', esc_html__( 'Force POST requests', 'matomo' ), esc_html__( 'When enabled, Matomo will always use POST requests. This can be helpful should you experience for example HTTP 414 URI too long errors in your tracking code.', 'matomo' ), $matomo_is_not_tracking, $matomo_full_generated_tracking_group );
162
+
163
  $matomo_form->show_checkbox( 'track_feed', esc_html__( 'Track RSS feeds', 'matomo' ), esc_html__( 'Enable to track posts in feeds via tracking pixel.', 'matomo' ), $matomo_is_not_tracking, $matomo_full_generated_tracking_group . ' matomo-track-option-manually matomo-track-option-tagmanager' );
164
 
165
  $matomo_form->show_checkbox( 'track_feed_addcampaign', esc_html__( 'Track RSS feed links as campaign', 'matomo' ), esc_html__( 'This will add Matomo campaign parameters to the RSS feed links.', 'matomo' ) . ' ' . sprintf( esc_html__( 'See %1$sMatomo documentation%2$s.', 'matomo' ), '<a href="https://matomo.org/docs/tracking-campaigns/" target="_BLANK">', '</a>' ), $matomo_is_not_tracking, $matomo_full_generated_tracking_group . ' matomo-track-option-manually matomo-track-option-tagmanager', true, 'jQuery(\'tr.matomo-feed_campaign-option\').toggle(\'hidden\');' );
classes/WpMatomo/Db/WordPressTracker.php CHANGED
@@ -180,12 +180,11 @@ class WordPress extends Mysqli {
180
  if ( ! $this->activeTransaction === false ) {
181
  return;
182
  }
 
183
  $wpdb->query( 'START TRANSACTION' );
184
- if ( $this->connection->autocommit( false ) ) {
185
- $this->activeTransaction = uniqid();
186
 
187
- return $this->activeTransaction;
188
- }
189
  }
190
 
191
  /**
180
  if ( ! $this->activeTransaction === false ) {
181
  return;
182
  }
183
+
184
  $wpdb->query( 'START TRANSACTION' );
185
+ $this->activeTransaction = uniqid();
 
186
 
187
+ return $this->activeTransaction;
 
188
  }
189
 
190
  /**
classes/WpMatomo/Logger.php CHANGED
@@ -74,7 +74,7 @@ class Logger {
74
  if ( ! empty( $item['file'] ) ) {
75
  $trace .= basename( $item['file'] ) . ':' . $item['line'] . '; ';
76
  }
77
- if ( $index > 5 ) {
78
  continue;
79
  }
80
  }
74
  if ( ! empty( $item['file'] ) ) {
75
  $trace .= basename( $item['file'] ) . ':' . $item['line'] . '; ';
76
  }
77
+ if ( $index > 8 ) {
78
  continue;
79
  }
80
  }
classes/WpMatomo/Settings.php CHANGED
@@ -76,6 +76,7 @@ class Settings {
76
  'version_history' => array(),
77
  'mail_history' => array(),
78
  'disable_cookies' => false,
 
79
  'limit_cookies' => false,
80
  'limit_cookies_visitor' => 34186669, // Matomo default 13 months
81
  'limit_cookies_session' => 1800, // Matomo default 30 minutes
76
  'version_history' => array(),
77
  'mail_history' => array(),
78
  'disable_cookies' => false,
79
+ 'force_post' => false,
80
  'limit_cookies' => false,
81
  'limit_cookies_visitor' => 34186669, // Matomo default 13 months
82
  'limit_cookies_session' => 1800, // Matomo default 30 minutes
classes/WpMatomo/TrackingCode/TrackingCodeGenerator.php CHANGED
@@ -258,6 +258,9 @@ g.type=\'text/javascript\'; g.async=true; g.defer=true; g.src="' . $container_ur
258
  $options[] = '_paq.push(["setDomains", ' . wp_json_encode( $hosts ) . ']);';
259
  }
260
  }
 
 
 
261
  if ( $this->settings->get_global_option( 'limit_cookies' ) ) {
262
  $options[] = "_paq.push(['setVisitorCookieTimeout', " . wp_json_encode( $this->settings->get_global_option( 'limit_cookies_visitor' ) ) . ']);';
263
  $options[] = "_paq.push(['setSessionCookieTimeout', " . wp_json_encode( $this->settings->get_global_option( 'limit_cookies_session' ) ) . ']);';
258
  $options[] = '_paq.push(["setDomains", ' . wp_json_encode( $hosts ) . ']);';
259
  }
260
  }
261
+ if ( $this->settings->get_global_option( 'force_post' ) ) {
262
+ $options[] = "_paq.push(['setRequestMethod', 'POST']);";
263
+ }
264
  if ( $this->settings->get_global_option( 'limit_cookies' ) ) {
265
  $options[] = "_paq.push(['setVisitorCookieTimeout', " . wp_json_encode( $this->settings->get_global_option( 'limit_cookies_visitor' ) ) . ']);';
266
  $options[] = "_paq.push(['setSessionCookieTimeout', " . wp_json_encode( $this->settings->get_global_option( 'limit_cookies_session' ) ) . ']);';
matomo.php CHANGED
@@ -4,7 +4,7 @@
4
  * Description: The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
5
  * Author: Matomo
6
  * Author URI: https://matomo.org
7
- * Version: 1.0.4
8
  * Domain Path: /languages
9
  * WC requires at least: 2.4.0
10
  * WC tested up to: 4.0.0
4
  * Description: The #1 Google Analytics alternative that gives you full control over your data and protects the privacy for your users. Free, secure and open.
5
  * Author: Matomo
6
  * Author URI: https://matomo.org
7
+ * Version: 1.0.5
8
  * Domain Path: /languages
9
  * WC requires at least: 2.4.0
10
  * WC tested up to: 4.0.0
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
4
  Tags: matomo,piwik,analytics,statistics,stats,tracking,ecommerce
5
  Requires at least: 4.8
6
  Tested up to: 5.4
7
- Stable tag: 1.0.4
8
  Requires PHP: 7.2
9
  License: GPLv3 or later
10
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
@@ -163,17 +163,4 @@ Needing to know more? [Click here to view all of our FAQs on our website](https:
163
 
164
  == Changelog ==
165
 
166
- = 1.0.4 =
167
- * Update Matomo core to 3.13.4
168
- * Fix the website's timezone may be set to UTC instead of the WP timezone
169
- * Improve compatibility with PHP 7.4 by fixing more notices
170
- * Add a review link to the About page
171
- * Add a newsletter signup possibility to the About page.
172
- * Support MaxMind geolocation database
173
- * Better support for hiding login URLs eg with WPS plugin
174
- * Show header icon images
175
- * Update GeoIP DB monthly instead of weekly
176
- * Ask for a review every 90 days unless dismissed
177
- * Possibility to configure proxy client header
178
-
179
  [See changelog for all versions](https://github.com/matomo-org/wp-matomo/blob/develop/CHANGELOG.md).
4
  Tags: matomo,piwik,analytics,statistics,stats,tracking,ecommerce
5
  Requires at least: 4.8
6
  Tested up to: 5.4
7
+ Stable tag: 1.0.5
8
  Requires PHP: 7.2
9
  License: GPLv3 or later
10
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
163
 
164
  == Changelog ==
165
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  [See changelog for all versions](https://github.com/matomo-org/wp-matomo/blob/develop/CHANGELOG.md).