diff --git a/apis/centoswebpanel_api.php b/apis/centoswebpanel_api.php
index dedef55..803571e 100644
--- a/apis/centoswebpanel_api.php
+++ b/apis/centoswebpanel_api.php
@@ -163,7 +163,7 @@ public function createAccount(array $params)
*/
public function updateAccount(array $params)
{
- // TODO This doesn't actually seem to work. Figure out why and fix it
+ // TODO This doesn't actually seem to work. Figure out why and fix it - This has been fixed in 2.6.1
$params['action'] = 'udp';
return $this->apiRequest('account', $params);
}
@@ -295,4 +295,54 @@ public function getClientIp()
return $ip_address;
}
+
+ //2.6.1
+ public function createPackage(array $params)
+ {
+ $params['action'] = 'add';
+ return $this->apiRequest('packages', $params);
+ }
+
+ public function updateCustomPackage(array $params){
+ $params['action'] = 'udp';
+ return $this->apiRequest('packages', $params);
+ }
+
+ public function deleteCustomPackage(array $params){
+ $params['action'] = 'del';
+ return $this->apiRequest('packages', $params);
+ }
+
+ public function userSession(array $params){
+ if($params['module'] == 'user'){
+ unset($params['module']);
+ }
+ $params['action'] = 'list';
+ return $this->apiRequest('user_session', $params);
+ }
+
+ public function listAccounts()
+ {
+ $params['action'] = 'list';
+ return $this->apiRequest('account', $params);
+ }
+
+ public function accountDetail($username)
+ {
+ $params = [
+ 'user' => $username,
+ 'action' => 'list'
+ ];
+ return $this->apiRequest('accountdetail', $params);
+ }
+
+ public function accountQuota($username)
+ {
+ $params = [
+ 'user' => $username,
+ 'action' => 'list'
+ ];
+ return $this->apiRequest('accountquota', $params);
+ }
+
}
diff --git a/apis/centoswebpanel_response.php b/apis/centoswebpanel_response.php
index d52efd0..f6ab1ae 100644
--- a/apis/centoswebpanel_response.php
+++ b/apis/centoswebpanel_response.php
@@ -28,7 +28,7 @@ public function __construct($apiResponse)
if (!empty($this->headers)) {
$headerOne = explode(' ', $this->headers[0]);
if (count($headerOne) >= 2) {
- $this->status = $headerOne[1];
+ $this->status = $headerOne[1];
}
}
}
diff --git a/centoswebpanel.php b/centoswebpanel.php
index e8c19bb..78d1c5a 100644
--- a/centoswebpanel.php
+++ b/centoswebpanel.php
@@ -102,16 +102,98 @@ public function getPackageFields($vars = null)
$fields = new ModuleFields();
+ $fields->setHtml("
+
+
+ ");
+
+ // Fetch the 1st account from the list of accounts 2.6.1
+ $module_row = null;
+ $rows = $this->getModuleRows();
+
+ if (isset($rows[0])) {
+ $module_row = $rows[0];
+ }
+ unset($rows);
+
+ // Fetch all the plans available for the different server types
+ $packageNames = [];
+
+ if ($module_row) {
+ $api = $this->getApi($module_row->meta->host_name, $module_row->meta->port, $module_row->meta->api_key, $module_row->meta->use_ssl);
+ $response = $api->getPackages();
+ $responseData = $response->response();
+ $this->log($module_row->meta->host_name . '|getPackageFields', $response->raw(), 'output', 'true');
+ if($responseData->status == "OK"){
+ $packageNames['custom'] = Language::_('Centoswebpanel.package_fields.custom', true);
+ foreach ($responseData->msj as $key => $package) {
+ $packageNames[$package->id] = ucfirst($package->package_name);
+ }
+ }
+ }
+
+
// Create package label
$package = $fields->label(Language::_('Centoswebpanel.package_fields.package', true), 'centoswebpanel_package');
// Create package field and attach to package label
- $package->attach(
- $fields->fieldText(
- 'meta[package]',
- (isset($vars->meta['package']) ? $vars->meta['package'] : null),
- ['id' => 'centoswebpanel_package']
- )
- );
+
+ if(is_array($packageNames)){
+ $package->attach(
+ $fields->fieldSelect(
+ 'meta[package]',
+ $packageNames,
+ (isset($vars->meta['package']) ? $vars->meta['package'] : null),
+ ['id' => 'centoswebpanel_package']
+ )
+ );
+ } else {
+ $package->attach(
+ $fields->fieldText(
+ 'meta[package]',
+ (isset($vars->meta['package']) ? $vars->meta['package'] : null),
+ ['id' => 'centoswebpanel_package']
+ )
+ );
+ }
+ $yesNo['no'] = Language::_('Centoswebpanel.package_fields.no', true);
+ $yesNo['yes'] = Language::_('Centoswebpanel.package_fields.yes', true);
+
// Set the label as a field
$fields->setField($package);
@@ -121,7 +203,7 @@ public function getPackageFields($vars = null)
$inode->attach(
$fields->fieldText(
'meta[inode]',
- (isset($vars->meta['inode']) ? $vars->meta['inode'] : null),
+ (isset($vars->meta['inode']) ? $vars->meta['inode'] : 0), //null
['id' => 'centoswebpanel_inode']
)
);
@@ -134,7 +216,7 @@ public function getPackageFields($vars = null)
$nofile->attach(
$fields->fieldText(
'meta[nofile]',
- (isset($vars->meta['nofile']) ? $vars->meta['nofile'] : null),
+ (isset($vars->meta['nofile']) ? $vars->meta['nofile'] : 150),
['id' => 'centoswebpanel_nofile']
)
);
@@ -147,13 +229,69 @@ public function getPackageFields($vars = null)
$nproc->attach(
$fields->fieldText(
'meta[nproc]',
- (isset($vars->meta['nproc']) ? $vars->meta['nproc'] : null),
+ (isset($vars->meta['nproc']) ? $vars->meta['nproc'] : 40),
['id' => 'centoswebpanel_nproc']
)
);
// Set the label as a field
$fields->setField($nproc);
+ //2.6.1
+ // Create maxhouremail label
+ $maxhouremail = $fields->label(Language::_('Centoswebpanel.package_fields.maxhouremail', true), 'centoswebpanel_maxhouremail');
+ // Create maxhouremail field and attach to maxhouremail label
+ $maxhouremail->attach(
+ $fields->fieldText(
+ 'meta[maxhouremail]',
+ (isset($vars->meta['maxhouremail']) ? $vars->meta['maxhouremail'] : 100),
+ ['id' => 'centoswebpanel_maxhouremail']
+ )
+ );
+ // Set the label as a field
+ $fields->setField($maxhouremail);
+
+ // Create Autossl label
+ $autossl = $fields->label(Language::_('Centoswebpanel.package_fields.autossl', true), 'centoswebpanel_autossl');
+ // Create Autossl field and attach to Autossl label
+ $autossl->attach(
+ $fields->fieldSelect(
+ 'meta[autossl]',
+ $yesNo,
+ (isset($vars->meta['autossl']) ? $vars->meta['autossl'] : 'yes'),
+ ['id' => 'centoswebpanel_autossl']
+ )
+ );
+ // Set the label as a field
+ $fields->setField($autossl);
+
+ // Create resellerpack label
+ $resellerpack = $fields->label(Language::_('Centoswebpanel.package_fields.resellerpack', true), 'centoswebpanel_resellerpack');
+ // Create resellerpack field and attach to resellerpack label
+ $resellerpack->attach(
+ $fields->fieldSelect(
+ 'meta[resellerpack]',
+ $yesNo,
+ (isset($vars->meta['resellerpack']) ? $vars->meta['resellerpack'] : null),
+ ['id' => 'centoswebpanel_resellerpack']
+ )
+ );
+ // Set the label as a field
+ $fields->setField($resellerpack);
+
+ // Create reselleraccount label
+ $reselleraccount = $fields->label(Language::_('Centoswebpanel.package_fields.reselleraccount', true), 'centoswebpanel_reselleraccount');
+ // Create reselleraccount field and attach to reselleraccount label
+ $reselleraccount->attach(
+ $fields->fieldText(
+ 'meta[reselleraccount]',
+ (isset($vars->meta['reselleraccount']) ? $vars->meta['reselleraccount'] : null),
+ ['id' => 'centoswebpanel_reselleraccount']
+ )
+ );
+ // Set the label as a field
+ $fields->setField($reselleraccount);
+ //2.6.1
+
return $fields;
}
@@ -323,11 +461,12 @@ public function manageEditRow($module_row, array &$vars)
* - value The value for this key
* - encrypted Whether or not this field should be encrypted (default 0, not encrypted)
*/
+ //2.6.1
public function addModuleRow(array &$vars)
{
$meta_fields = ['server_name', 'host_name', 'login_port', 'port', 'api_key',
- 'use_ssl', 'account_limit', 'name_servers', 'notes'];
- $encrypted_fields = ['api_key'];
+ 'use_ssl', 'account_limit', 'name_servers', 'notes', 'server_ip', 'server_pass'];
+ $encrypted_fields = ['api_key', 'server_pass'];
// Set unspecified checkboxes
if (empty($vars['use_ssl'])) {
@@ -366,11 +505,12 @@ public function addModuleRow(array &$vars)
* - value The value for this key
* - encrypted Whether or not this field should be encrypted (default 0, not encrypted)
*/
+ //2.6.1
public function editModuleRow($module_row, array &$vars)
{
$meta_fields = ['server_name', 'host_name', 'login_port', 'port', 'api_key',
- 'use_ssl', 'account_limit', 'account_count', 'name_servers', 'notes'];
- $encrypted_fields = ['api_key'];
+ 'use_ssl', 'account_limit', 'account_count', 'name_servers', 'notes', 'server_ip', 'server_pass'];
+ $encrypted_fields = ['api_key', 'server_pass'];
// Set unspecified checkboxes
if (empty($vars['use_ssl'])) {
@@ -699,8 +839,8 @@ public function addService(
}
}
- $params = $this->getFieldsFromInput((array) $vars, $package);
- $params['server_ips'] = $row->meta->host_name;
+ $getparams = $this->getFieldsFromInput((array) $vars, $package);
+ //2.6.1
$this->validateService($package, $vars);
@@ -710,6 +850,30 @@ public function addService(
// Only provision the service if 'use_module' is true
if ($vars['use_module'] == 'true') {
+ //Create Package of Custom Plans Selected
+ if($package->meta->package == 'custom'){
+ $packageadd = $api->createPackage($getparams['custom']);
+ $this->log($row->meta->host_name . '|package_new_custom', serialize($getparams['custom']), 'input', true);
+ $this->log($row->meta->host_name . '|package_new_custom', $packageadd->raw(), 'output', true);
+
+ $getallackages = $api->getPackages();
+ $responseData = $getallackages->response();
+ $this->log($row->meta->host_name . '|getPackageFieldsCustom', $getallackages->raw(), 'output', 'true');
+ if($responseData->status == "OK"){
+ foreach ($responseData->msj as $key => $rpackage) {
+ if($rpackage->package_name === $getparams['custom']['package_name']){
+ $this->log($row->meta->host_name . '|foreach-match', serialize($rpackage->package_name), 'output', true);
+ $packageid = $rpackage->id;
+ break;
+ }
+ }
+ }
+ }
+ $params = $getparams['default'];
+ $params['package'] = ($package->meta->package == 'custom') ? $packageid : $package->meta->package;
+ $params['server_ips'] = $row->meta->server_ip ?? $row->meta->host_name;
+
+
// Create CentOS WebPanel account
$masked_params = $params;
$masked_params['pass'] = '***';
@@ -741,6 +905,11 @@ public function addService(
'value' => $vars['centoswebpanel_domain'],
'encrypted' => 0
],
+ [
+ 'key' => 'centoswebpanel_email',
+ 'value' => $vars['centoswebpanel_email'],
+ 'encrypted' => 0
+ ],
[
'key' => 'centoswebpanel_username',
'value' => $vars['centoswebpanel_username'],
@@ -777,22 +946,8 @@ public function editService($package, $service, array $vars = null, $parent_pack
$row = $this->getModuleRow();
$api = $this->getApi($row->meta->host_name, $row->meta->port, $row->meta->api_key, $row->meta->use_ssl);
- $params = $this->getFieldsFromInput((array) $vars, $package, true);
+ $getparams = $this->getFieldsFromInput((array) $vars, $package, true);
$service_fields = $this->serviceFieldsToObject($service->fields);
- $params['server_ips'] = $row->meta->host_name;
-
- // Default fields using service fields
- if (!isset($params['domain'])) {
- $params['domain'] = $service_fields->centoswebpanel_domain;
- }
-
- if (!isset($params['pass'])) {
- $params['pass'] = $service_fields->centoswebpanel_password;
- }
-
- if (!isset($params['user'])) {
- $params['user'] = $service_fields->centoswebpanel_username;
- }
$this->validateService($package, $vars, true);
@@ -800,18 +955,51 @@ public function editService($package, $service, array $vars = null, $parent_pack
return;
}
- if (isset($params['domain'])) {
- // Force domain to lower case
- $params['domain'] = strtolower($params['domain']);
- }
-
- // Remove password if not being updated
- if (isset($params['pass']) && $params['pass'] == '') {
- unset($params['pass']);
- }
+ //2.6.1
// Only update the service if 'use_module' is true
if ($vars['use_module'] == 'true') {
+ //Update Package of Custom Plans Selected
+ if($package->meta->package == 'custom'){
+ //unset reseller and accounts as not required for update
+ unset($getparams['custom']['reseller']);
+ unset($getparams['custom']['accounts']);
+ $packageupd = $api->updateCustomPackage($getparams['custom']);
+ $this->log($row->meta->host_name . '|package_update_custom', serialize($getparams['custom']), 'input', true);
+ $this->log($row->meta->host_name . '|package_update_custom', $packageupd->raw(), 'output', true);
+
+ $getallackages = $api->getPackages();
+ $responseData = $getallackages->response();
+ $this->log($row->meta->host_name . '|getPackageUpdateCustom', $getallackages->raw(), 'output', 'true');
+ if($responseData->status == "OK"){
+ foreach ($responseData->msj as $key => $rpackage) {
+ if($rpackage->package_name === $getparams['custom']['package_name']){
+ $this->log($row->meta->host_name . '|foreach-update-match', serialize($rpackage->package_name), 'output', true);
+ $packageid = $rpackage->id;
+ break;
+ }
+ }
+ }
+ }
+
+ $params = $getparams['default'];
+ $params['server_ips'] = $row->meta->server_ip ?? $row->meta->host_name;
+ $params['user'] = $service_fields->centoswebpanel_username;
+ $params['email'] = $service_fields->centoswebpanel_email;
+
+ unset($params['pass']);
+ unset($params['domain']);
+
+ if (!isset($params['processes'])) {
+ $params['processes'] = $package->meta->nproc;
+ }
+
+ if (!isset($params['openfiles'])) {
+ $params['openfiles'] = $package->meta->nofile;
+ }
+
+ $params['package'] = ($package->meta->package == 'custom') ? $packageid : $package->meta->package;
+
// Update CentOS WebPanel account
$masked_params = $params;
$masked_params['pass'] = '***';
@@ -833,15 +1021,15 @@ public function editService($package, $service, array $vars = null, $parent_pack
return;
}
- // Attempt account password change
- $password_params = ['user' => $params['user'], 'pass' => $params['pass']];
+ // Attempt account password change
+ $password_params = ['user' => $params['user'], 'pass' => $service_fields->centoswebpanel_password];
$this->log($host_name . '|account_changepass', serialize($password_params), 'input', true);
$password_response = $api->updatePassword($password_params);
$password_errors = $password_response->errors();
$password_success = $password_response->status() == 200 && empty($password_errors);
$this->log($host_name . '|account_changepass', $password_response->raw(), 'output', $password_success);
- // Attempt account package change (this seems to have no effect)
+ // // Attempt account package change (this seems to have no effect)
$package_params = ['user' => $params['user'], 'package' => $params['package']];
$this->log($host_name . '|account_changepack', serialize($package_params), 'input', true);
$package_response = $api->updatePackage($package_params);
@@ -1011,6 +1199,22 @@ public function cancelService($package, $service, $parent_package = null, $paren
$success = $user_response->status() == 200 && empty($errors);
$this->log($row->meta->host_name . '|account_remove', $user_response->raw(), 'output', $success);
+
+ $domainname = $service_fields->centoswebpanel_domain;
+ $getallackages = $api->getPackages();
+ $responsepackage = $getallackages->response();
+ if($responsepackage->status == "OK"){
+ foreach ($responsepackage->msj as $key => $rpackage) {
+ if($rpackage->package_name === $domainname){
+ $packageid = $rpackage->id;
+ break;
+ }
+ }
+ }
+ $user_response = $api->deleteCustomPackage(['package_name' => $rpackage->package_name, 'id' => $packageid]);
+ $this->log($row->meta->host_name . '|account_package_remove', $user_response->raw(), 'output', $success);
+
+
if (!$success) {
$this->Input->setErrors([
'account' => [
@@ -1071,6 +1275,20 @@ public function getAdminServiceInfo($service, $package)
$this->view = new View('admin_service_info', 'default');
$this->view->base_uri = $this->base_uri;
$this->view->setDefaultView('components' . DS . 'modules' . DS . 'centoswebpanel' . DS);
+ //2.6.1
+ $api = $this->getApi($row->meta->host_name, $row->meta->port, $row->meta->api_key, $row->meta->use_ssl);
+ $service_fields = $this->serviceFieldsToObject($service->fields);
+ $params['user'] = $service_fields->centoswebpanel_username;
+ $params['timer'] = 5;
+ $LoginSession = $api->userSession($params);
+ $sessionResponse = $LoginSession->response();
+
+ foreach ($sessionResponse->msj->details as $key => $sessionurl) {
+ $urlsession = $sessionurl->url;
+ break;
+ }
+
+ $this->log($row->meta->host_name . '|login_session', $LoginSession->raw(), 'output', true);
// Load the helpers required for this view
Loader::loadHelpers($this, ['Form', 'Html']);
@@ -1078,8 +1296,9 @@ public function getAdminServiceInfo($service, $package)
$this->view->set('module_row', $row);
$this->view->set('package', $package);
$this->view->set('service', $service);
- $this->view->set('service_fields', $this->serviceFieldsToObject($service->fields));
-
+ $this->view->set('service_fields', $service_fields);
+ $this->view->set('session_url', $urlsession);
+ //2.6.1
return $this->view->fetch();
}
@@ -1099,6 +1318,20 @@ public function getClientServiceInfo($service, $package)
$this->view = new View('client_service_info', 'default');
$this->view->base_uri = $this->base_uri;
$this->view->setDefaultView('components' . DS . 'modules' . DS . 'centoswebpanel' . DS);
+ //2.6.1
+ $api = $this->getApi($row->meta->host_name, $row->meta->port, $row->meta->api_key, $row->meta->use_ssl);
+ $service_fields = $this->serviceFieldsToObject($service->fields);
+ $params['user'] = $service_fields->centoswebpanel_username;
+ $params['timer'] = 5;
+ $LoginSession = $api->userSession($params);
+ $sessionResponse = $LoginSession->response();
+
+ foreach ($sessionResponse->msj->details as $key => $sessionurl) {
+ $urlsession = $sessionurl->url;
+ break;
+ }
+
+ $this->log($row->meta->host_name . '|login_session', $LoginSession->raw(), 'output', true);
// Load the helpers required for this view
Loader::loadHelpers($this, ['Form', 'Html']);
@@ -1106,8 +1339,9 @@ public function getClientServiceInfo($service, $package)
$this->view->set('module_row', $row);
$this->view->set('package', $package);
$this->view->set('service', $service);
- $this->view->set('service_fields', $this->serviceFieldsToObject($service->fields));
-
+ $this->view->set('service_fields', $service_fields);
+ $this->view->set('session_url', $urlsession);
+ //2.6.1
return $this->view->fetch();
}
@@ -1207,11 +1441,86 @@ public function validateConnection($api_key, $hostname, $port, $use_ssl)
true
);
$response = $api->getPackages();
-
$errors = $response->errors();
$success = $response->status() == 200 && empty($errors);
+
$this->log($hostname . '|validate_connection/packages_get', $response->raw(), 'output', $success);
if ($success) {
+ //2.6.1
+ if (!isset($this->Record)) {
+ Loader::loadComponents($this, ['Record']);
+
+ // Check if the option group exists
+ $isgroup = $this->Record->select('id')
+ ->from("package_option_groups")
+ ->where("name", "=", 'CWP Custom Hosting')
+ ->fetch();
+
+ if (!isset($isgroup->id)) {
+ // Insert the option group if it doesn't exist
+ $this->Record->insert("package_option_groups", [
+ 'company_id' => 1,
+ 'name' => "CWP Custom Hosting",
+ 'hide_options' => 1
+ ]);
+
+ // Get the ID of the inserted option group
+ $groupId = $this->Record->lastInsertId();
+
+ // Define package options to insert
+ $packageOptions = [
+ ['label' => "Bandwidth Usage", 'name' => 'cwp_bandwidth_usage'],
+ ['label' => "Disk Space", 'name' => 'cwp_disk_space'],
+ ['label' => "FTP Accounts", 'name' => 'cwp_ftp_accounts'],
+ ['label' => "Email Accounts", 'name' => 'cwp_email_accounts'],
+ ['label' => "Email Lists", 'name' => 'cwp_email_lists'],
+ ['label' => "Database", 'name' => 'cwp_database'],
+ ['label' => "Sub Domains", 'name' => 'cwp_sub_domains'],
+ ['label' => "Parked Domains", 'name' => 'cwp_parked_domains'],
+ ['label' => "Addon Domains", 'name' => 'cwp_addon_domains'],
+ ];
+
+ // Initialize the order counter
+ $order = 0;
+
+ // Batch insert package options
+ foreach ($packageOptions as $optionData) {
+ $this->Record->insert("package_options", [
+ 'company_id' => 1,
+ 'label' => $optionData['label'],
+ 'name' => $optionData['name'],
+ 'type' => 'quantity',
+ 'addable' => 1,
+ 'editable' => 0,
+ 'hidden' => 0
+ ]);
+
+ // Get the ID of the inserted option
+ $optionId = $this->Record->lastInsertId();
+
+ // Insert package option values
+ $this->Record->insert("package_option_values", [
+ 'option_id' => $optionId,
+ 'status' => "active",
+ 'name' => "Number of " . $optionData['label'],
+ 'default' => 1,
+ 'min' => 1,
+ 'order' => $order++, // Increment order counter
+ 'max' => 10,
+ 'step' => 1
+ ]);
+
+ // Link package option to the option group
+ $this->Record->insert("package_option_group", [
+ 'option_id' => $optionId,
+ 'option_group_id' => $groupId,
+ 'order' => $order // Use incremented order value
+ ]);
+ }
+ }
+ }
+
+ //2.6.1
return true;
}
} catch (Exception $e) {
@@ -1297,17 +1606,36 @@ private function generatePassword($min_length = 10, $max_length = 14)
*/
private function getFieldsFromInput(array $vars, $package)
{
- $fields = [
+ $fields['default'] = [
'domain' => isset($vars['centoswebpanel_domain']) ? $vars['centoswebpanel_domain'] : null,
'user' => isset($vars['centoswebpanel_username']) ? $vars['centoswebpanel_username'] : null,
'pass' => isset($vars['centoswebpanel_password']) ? $vars['centoswebpanel_password'] : null,
'email' => isset($vars['centoswebpanel_email']) ? $vars['centoswebpanel_email'] : null,
- 'package' => $package->meta->package,
'inode' => $package->meta->inode,
'limit_nofile' => $package->meta->nofile,
'limit_nproc' => $package->meta->nproc,
];
+ if($package->meta->package == 'custom'){
+ $fields['custom'] = [
+ 'package_name' => isset($vars['centoswebpanel_domain']) ? $vars['centoswebpanel_domain'] : null,
+ 'disk_quota' => $vars['configoptions']['cwp_disk_space'] ? $vars['configoptions']['cwp_disk_space'] * 1024 : null,
+ 'bandwidth' => $vars['configoptions']['cwp_bandwidth_usage'] ? $vars['configoptions']['cwp_bandwidth_usage'] * 1024 : null,
+ 'ftp_accounts' => $vars['configoptions']['cwp_ftp_accounts'] ?? null,
+ 'email_accounts' => $vars['configoptions']['cwp_email_accounts'] ?? null,
+ 'email_lists' => $vars['configoptions']['cwp_email_lists'] ?? null,
+ 'databases' => $vars['configoptions']['cwp_database'] ?? null,
+ 'sub_domains' => $vars['configoptions']['cwp_sub_domains'] ?? null,
+ 'parked_domains' => $vars['configoptions']['cwp_parked_domains'] ?? null,
+ 'addons_domains' => $vars['configoptions']['cwp_addon_domains'] ?? null,
+ 'hourly_emails' => $package->meta->maxhouremail ?? null,
+ ] ;
+ if($package->meta->resellerpack == "yes"){
+ $fields['custom']['reseller'] = "1";
+ $fields['custom']['accounts'] = $package->meta->reselleraccount ?? "1";
+ }
+ }
+
return $fields;
}
@@ -1476,4 +1804,110 @@ private function getPackageRules(array $vars)
return $rules;
}
+
+
+ //2.6.1
+ public function getClientTabs($package)
+ {
+ return [
+ 'tabClientActions' => [
+ 'name' => Language::_('Centoswebpanel.tab_client_actions', true),
+ 'icon' => "fa fa-server"
+ ],
+ ];
+ }
+
+ public function tabClientActions($package, $service, array $post = null)
+ {
+ $module_row = $this->getModuleRow();
+ $this->view = new View('tab_client_actions', 'default');
+ $this->view->base_uri = $this->base_uri;
+ Loader::loadHelpers($this, ['Form', 'Html']);
+
+ $service_fields = $this->serviceFieldsToObject($service->fields);
+ $api = $this->getApi($module_row->meta->host_name, $module_row->meta->port, $module_row->meta->api_key, $module_row->meta->use_ssl);
+ $domain = $service_fields->centoswebpanel_domain;
+ $domain_user = $service_fields->centoswebpanel_username;
+ $account_lists = $api->listAccounts();
+
+ $responseData = $account_lists->response();
+ if($responseData->status == "OK"){
+ foreach ($responseData->msj as $account) {
+ if($account->username == $domain_user){
+ $cwp_details['backup'] = ucfirst($account->backup);
+ $cwp_details['domain'] = $account->domain;
+ $cwp_details['email'] = $account->email;
+ $cwp_details['ip_address'] = $account->ip_address;
+ $cwp_details['username'] = $account->username;
+ $cwp_details['package_name'] = $account->package_name;
+ $cwp_details['reseller'] = ($account->reseller == "1") ? Language::_('Centoswebpanel.client.reseller', true) : Language::_('Centoswebpanel.client.standard', true);
+ $cwp_details['setup_date'] = $account->setup_date;
+ $cwp_details['status'] = ucfirst($account->status);
+
+ $account_details = $api->accountDetail($account->username);
+ $account_details_response = $account_details->response();
+ $cwp_details['details'] = $account_details_response->result;
+
+ $account_quota = $api->accountQuota($account->username);
+ $cwp_details['quota'] = $account_quota->response();
+
+ $modules = [
+ 'user' => ['session_key' => 'cwp_session'],
+ 'mysql_manager' => ['session_key' => 'mysql_session'],
+ 'domains' => ['session_key' => 'domain_session'],
+ 'crontab' => ['session_key' => 'crontab_session'],
+ 'phpini_editor' => ['session_key' => 'phpini_session'],
+ 'phpselector' => ['session_key' => 'phpselector_session'],
+ 'notification_center' => ['session_key' => 'notification_session'],
+ 'mod_security' => ['session_key' => 'modsec_session'],
+ 'statistics' => ['session_key' => 'statistics_session'],
+ 'ftp_accounts' => ['session_key' => 'ftp_session'],
+ 'backups' => ['session_key' => 'backups_session'],
+ 'protected_directory' => ['session_key' => 'pd_session'],
+ 'disk_usage' => ['session_key' => 'du_session'],
+ 'error_log' => ['session_key' => 'logs_session'],
+ 'fix_acc_perm' => ['session_key' => 'faperm_session'],
+ 'clam' => ['session_key' => 'clam_session'],
+ 'subdomains' => ['session_key' => 'subdomains_session'],
+ 'letsencrypt' => ['session_key' => 'ssl_session'],
+ 'redirect' => ['session_key' => 'redirect_session'],
+ 'email_accounts' => ['session_key' => 'eacc_session'],
+ 'forwarders_email' => ['session_key' => 'eforwarder_session'],
+ 'mail_autoreply' => ['session_key' => 'eautoreply_session'],
+ 'email_filters' => ['session_key' => 'efilters_session'],
+ 'mail_routing' => ['session_key' => 'erouting_session'],
+ 'email_importer' => ['session_key' => 'eimporter_session'],
+ 'dns_zone_editor' => ['session_key' => 'dns_session'],
+ 'addons' => ['session_key' => 'script_session'],
+ ];
+ foreach ($modules as $key => $module) {
+ $module_config = [
+ 'user' => $account->username,
+ 'timer' => 5,
+ 'module' => $key
+ ];
+ $session = $api->userSession($module_config);
+
+ foreach ($session->response()->msj->details as $key => $sessionurl) {
+ $cwp_details[$module['session_key']] = $sessionurl->url;
+ break;
+ }
+ }
+
+ }
+ }
+ }
+
+
+
+
+ $this->view->set('module_row', $module_row);
+ $this->view->set('package', $package);
+ $this->view->set('service', $service);
+ $this->view->set('service_fields', $service_fields);
+ $this->view->set('cwp_details', ($cwp_details ?? new stdClass()));
+ $this->view->setDefaultView('components' . DS . 'modules' . DS . 'centoswebpanel' . DS);
+
+ return $this->view->fetch();
+ }
}
diff --git a/config.json b/config.json
index 84d325e..add29aa 100644
--- a/config.json
+++ b/config.json
@@ -1,11 +1,15 @@
{
- "version": "2.6.0",
+ "version": "2.7.0",
"name": "Centoswebpanel.name",
"description": "Centoswebpanel.description",
"authors": [
{
"name": "Phillips Data, Inc.",
"url": "http://www.blesta.com"
+ },
+ {
+ "name": "Blesta Module",
+ "url": "http://www.blestamodule.com"
}
],
"package": {
@@ -21,8 +25,8 @@
"group": "Centoswebpanel.module_group"
},
"email_tags": {
- "module": ["host_name", "name_servers"],
+ "module": ["host_name", "name_servers", "server_ip"],
"package": ["package"],
"service": ["centoswebpanel_domain", "centoswebpanel_username", "centoswebpanel_password"]
}
-}
\ No newline at end of file
+}
diff --git a/language/cs_cz/centoswebpanel.php b/language/cs_cz/centoswebpanel.php
new file mode 100644
index 0000000..5c4b29c
--- /dev/null
+++ b/language/cs_cz/centoswebpanel.php
@@ -0,0 +1,108 @@
+Form->fieldText('host_name', (isset($vars->host_name) ? $vars->host_name : null));
?>
+
+ Form->label($this->_('Centoswebpanel.row_meta.server_ip', true), 'server_ip');
+ $this->Form->fieldText('server_ip', (isset($vars->server_ip) ? $vars->server_ip : null));
+ ?>
+
+
+ Form->label($this->_('Centoswebpanel.row_meta.server_pass', true), 'server_pass');
+ $this->Form->fieldText('server_pass', (isset($vars->server_pass) ? $vars->server_pass : null));
+ ?>
+
Form->label($this->_('Centoswebpanel.row_meta.login_port', true), 'login_port');
@@ -151,4 +163,4 @@ function updateNsRows() {
$(this).removeClass('odd_row');
});
}
-
\ No newline at end of file
+
diff --git a/views/default/admin_service_info.pdt b/views/default/admin_service_info.pdt
index b56ba08..fda88de 100644
--- a/views/default/admin_service_info.pdt
+++ b/views/default/admin_service_info.pdt
@@ -12,25 +12,7 @@
centoswebpanel_password) ? $this->Html->safe($service_fields->centoswebpanel_password) : null); ?>
meta->host_name) ? $this->Html->safe($module_row->meta->host_name) : null); ?>
- Form->create($this->Html->safe('https://' . (isset($module_row->meta->host_name) ? $module_row->meta->host_name : null) . ':' . (isset($module_row->meta->login_port) ? $module_row->meta->login_port : $this->_('Centoswebpanel.row_meta.default_login_port', true)) . '/login/index.php'), ['target' => '_blank']);
- $this->Form->fieldHidden('username', (isset($service_fields->centoswebpanel_username) ? $service_fields->centoswebpanel_username : null));
- $this->Form->fieldHidden('password', (isset($service_fields->centoswebpanel_password) ? $service_fields->centoswebpanel_password : null));
- $this->Form->fieldHidden('commit', 'Login');
- ?>
- _('Centoswebpanel.service_info.option_login'); ?>
- Form->end();
- ?>
+ _('Centoswebpanel.service_info.option_login'); ?>
-
\ No newline at end of file
diff --git a/views/default/client_service_info.pdt b/views/default/client_service_info.pdt
index bfcc3f7..b06f82b 100644
--- a/views/default/client_service_info.pdt
+++ b/views/default/client_service_info.pdt
@@ -16,27 +16,9 @@
centoswebpanel_password) ? $this->Html->safe($service_fields->centoswebpanel_password) : null); ?>
meta->host_name) ? $this->Html->safe($module_row->meta->host_name) : null); ?>
- Form->create($this->Html->safe('https://' . (isset($module_row->meta->host_name) ? $module_row->meta->host_name : null) . ':' . (isset($module_row->meta->login_port) ? $module_row->meta->login_port : $this->_('Centoswebpanel.row_meta.default_login_port', true)) . '/login/index.php'), ['target' => '_blank']);
- $this->Form->fieldHidden('username', (isset($service_fields->centoswebpanel_username) ? $service_fields->centoswebpanel_username : null));
- $this->Form->fieldHidden('password', (isset($service_fields->centoswebpanel_password) ? $service_fields->centoswebpanel_password : null));
- $this->Form->fieldHidden('commit', 'Login');
- ?>
- _('Centoswebpanel.service_info.option_login'); ?>
- Form->end();
- ?>
+ _('Centoswebpanel.service_info.option_login'); ?>
-
\ No newline at end of file
diff --git a/views/default/css/style.css b/views/default/css/style.css
new file mode 100644
index 0000000..0f4574c
--- /dev/null
+++ b/views/default/css/style.css
@@ -0,0 +1,112 @@
+.ibox {
+ border: 1px solid #e7eaec;
+ margin-bottom: 25px;
+ background-color: #fff;
+ border-radius: 5px;
+ box-shadow: 0 1px 1px rgba(0,0,0,0.1);
+}
+
+.ibox-title {
+ background-color: #f3f3f4;
+ color: #4e5365;
+ padding: 10px;
+ border-bottom: 1px solid #e7eaec;
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
+}
+
+.ibox-title h5 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+.ibox-content {
+ padding: 15px;
+}
+
+.graph-stats-wrapper {
+ margin-top: 10px;
+}
+
+.statistic-box {
+ padding: 15px;
+ background-color: #ffffff;
+ border: 1px solid #e7eaec;
+ border-radius: 5px;
+}
+
+.row.text-center {
+ margin-top: 0;
+}
+
+.col-lg-4 {
+ margin-bottom: 20px;
+}
+
+canvas {
+ margin: 0 auto;
+ display: block;
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ background-color: #f8f8f8; /* fallback for older browsers */
+}
+
+h5 {
+ text-align: center;
+ margin-top: 5px;
+ margin-bottom: 0;
+ font-size: 12px;
+ font-weight: 600;
+}
+
+
+/*button*/
+.palette-button {
+ background-color: #fff;
+ width: 170px;
+ height: 55px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 10px;
+ font-size: 16px;
+ font-weight: 600;
+ border: none;
+ border-radius: 10px;
+ cursor: pointer;
+ box-shadow: 0px 0px 10px rgb(196, 196, 196);
+ transition: all 0.3s;
+}
+.palette {
+ width: 30px;
+ transition: all 0.3s;
+}
+.palette-button:hover .palette {
+ transform: rotate(-45deg);
+}
+.palette path {
+ fill: rgb(255, 163, 183);
+ stroke-width: 0;
+}
+.drop1 {
+ fill: rgb(115, 115, 255);
+ stroke-width: 0;
+}
+.drop2 {
+ fill: red;
+ stroke-width: 0;
+}
+.drop3 {
+ fill: yellow;
+ stroke-width: 0;
+}
+.drop4 {
+ fill: rgb(104, 255, 255);
+ stroke-width: 0;
+}
+.palette-button:hover {
+ transform: scale(1.05);
+ background-color: rgb(176, 115, 255);
+ color: white;
+}
diff --git a/views/default/edit_row.pdt b/views/default/edit_row.pdt
index 7146a5e..2571462 100644
--- a/views/default/edit_row.pdt
+++ b/views/default/edit_row.pdt
@@ -25,6 +25,18 @@
$this->Form->fieldText('host_name', (isset($vars->host_name) ? $vars->host_name : null));
?>
+
+ Form->label($this->_('Centoswebpanel.row_meta.server_ip', true), 'server_ip');
+ $this->Form->fieldText('server_ip', (isset($vars->server_ip) ? $vars->server_ip : null));
+ ?>
+
+
+ Form->label($this->_('Centoswebpanel.row_meta.server_pass', true), 'server_pass');
+ $this->Form->fieldText('server_pass', (isset($vars->server_pass) ? $vars->server_pass : null));
+ ?>
+
Form->label($this->_('Centoswebpanel.row_meta.login_port', true), 'login_port');
@@ -151,4 +163,4 @@ function updateNsRows() {
$(this).removeClass('odd_row');
});
}
-
\ No newline at end of file
+
diff --git a/views/default/images/icons/backups_session.png b/views/default/images/icons/backups_session.png
new file mode 100644
index 0000000..0a07630
Binary files /dev/null and b/views/default/images/icons/backups_session.png differ
diff --git a/views/default/images/icons/clam_session.png b/views/default/images/icons/clam_session.png
new file mode 100644
index 0000000..69c56a2
Binary files /dev/null and b/views/default/images/icons/clam_session.png differ
diff --git a/views/default/images/icons/crontab_session.png b/views/default/images/icons/crontab_session.png
new file mode 100644
index 0000000..c87c129
Binary files /dev/null and b/views/default/images/icons/crontab_session.png differ
diff --git a/views/default/images/icons/cwp_session.png b/views/default/images/icons/cwp_session.png
new file mode 100644
index 0000000..4fc21f7
Binary files /dev/null and b/views/default/images/icons/cwp_session.png differ
diff --git a/views/default/images/icons/dns_session.png b/views/default/images/icons/dns_session.png
new file mode 100644
index 0000000..0a03045
Binary files /dev/null and b/views/default/images/icons/dns_session.png differ
diff --git a/views/default/images/icons/domain_session.png b/views/default/images/icons/domain_session.png
new file mode 100644
index 0000000..d744902
Binary files /dev/null and b/views/default/images/icons/domain_session.png differ
diff --git a/views/default/images/icons/du_session.png b/views/default/images/icons/du_session.png
new file mode 100644
index 0000000..fc86b35
Binary files /dev/null and b/views/default/images/icons/du_session.png differ
diff --git a/views/default/images/icons/email.png b/views/default/images/icons/email.png
new file mode 100644
index 0000000..b57329a
Binary files /dev/null and b/views/default/images/icons/email.png differ
diff --git a/views/default/images/icons/faperm_session.png b/views/default/images/icons/faperm_session.png
new file mode 100644
index 0000000..61e4a86
Binary files /dev/null and b/views/default/images/icons/faperm_session.png differ
diff --git a/views/default/images/icons/ftp_session.png b/views/default/images/icons/ftp_session.png
new file mode 100644
index 0000000..90aff7b
Binary files /dev/null and b/views/default/images/icons/ftp_session.png differ
diff --git a/views/default/images/icons/logs_session.png b/views/default/images/icons/logs_session.png
new file mode 100644
index 0000000..d750d0d
Binary files /dev/null and b/views/default/images/icons/logs_session.png differ
diff --git a/views/default/images/icons/modsec_session.png b/views/default/images/icons/modsec_session.png
new file mode 100644
index 0000000..86d65f4
Binary files /dev/null and b/views/default/images/icons/modsec_session.png differ
diff --git a/views/default/images/icons/mysql_session.png b/views/default/images/icons/mysql_session.png
new file mode 100644
index 0000000..9c79057
Binary files /dev/null and b/views/default/images/icons/mysql_session.png differ
diff --git a/views/default/images/icons/notification_session.png b/views/default/images/icons/notification_session.png
new file mode 100644
index 0000000..da80450
Binary files /dev/null and b/views/default/images/icons/notification_session.png differ
diff --git a/views/default/images/icons/pd_session.png b/views/default/images/icons/pd_session.png
new file mode 100644
index 0000000..1560d60
Binary files /dev/null and b/views/default/images/icons/pd_session.png differ
diff --git a/views/default/images/icons/phpini_session.png b/views/default/images/icons/phpini_session.png
new file mode 100644
index 0000000..cd185e0
Binary files /dev/null and b/views/default/images/icons/phpini_session.png differ
diff --git a/views/default/images/icons/phpselector_session.png b/views/default/images/icons/phpselector_session.png
new file mode 100644
index 0000000..f4b0b92
Binary files /dev/null and b/views/default/images/icons/phpselector_session.png differ
diff --git a/views/default/images/icons/redirect_session.png b/views/default/images/icons/redirect_session.png
new file mode 100644
index 0000000..d321eb8
Binary files /dev/null and b/views/default/images/icons/redirect_session.png differ
diff --git a/views/default/images/icons/script_session.png b/views/default/images/icons/script_session.png
new file mode 100644
index 0000000..220991b
Binary files /dev/null and b/views/default/images/icons/script_session.png differ
diff --git a/views/default/images/icons/ssl_session.png b/views/default/images/icons/ssl_session.png
new file mode 100644
index 0000000..b808ee0
Binary files /dev/null and b/views/default/images/icons/ssl_session.png differ
diff --git a/views/default/images/icons/statistics_session.png b/views/default/images/icons/statistics_session.png
new file mode 100644
index 0000000..d299a5b
Binary files /dev/null and b/views/default/images/icons/statistics_session.png differ
diff --git a/views/default/images/icons/subdomains_session.png b/views/default/images/icons/subdomains_session.png
new file mode 100644
index 0000000..987e851
Binary files /dev/null and b/views/default/images/icons/subdomains_session.png differ
diff --git a/views/default/images/icons/webmail.png b/views/default/images/icons/webmail.png
new file mode 100644
index 0000000..a9dd0e4
Binary files /dev/null and b/views/default/images/icons/webmail.png differ
diff --git a/views/default/js/chart.js b/views/default/js/chart.js
new file mode 100644
index 0000000..7bd27b8
--- /dev/null
+++ b/views/default/js/chart.js
@@ -0,0 +1,14 @@
+/*!
+ * Chart.js
+ * http://chartjs.org/
+ * Version: 2.5.0
+ *
+ * Copyright 2017 Nick Downie
+ * Released under the MIT license
+ * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
+ */
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){return function t(e,a,i){function n(r,s){if(!a[r]){if(!e[r]){var l="function"==typeof require&&require;if(!s&&l)return l(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=a[r]={exports:{}};e[r][0].call(d.exports,function(t){var a=e[r][1][t];return n(a?a:t)},d,d.exports,t,e,a,i)}return a[r].exports}for(var o="function"==typeof require&&require,r=0;ra?(e+.05)/(a+.05):(a+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return e<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,a=(e[0]+t)%360;return e[0]=a<0?360+a:a,this.setValues("hsl",e),this},mix:function(t,e){var a=this,i=t,n=void 0===e?.5:e,o=2*n-1,r=a.alpha()-i.alpha(),s=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,l=1-s;return this.rgb(s*a.red()+l*i.red(),s*a.green()+l*i.green(),s*a.blue()+l*i.blue()).alpha(a.alpha()*n+i.alpha()*(1-n))},toJSON:function(){return this.rgb()},clone:function(){var t,e,a=new o,i=this.values,n=a.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],e={}.toString.call(t),"[object Array]"===e?n[r]=t.slice(0):"[object Number]"===e?n[r]=t:console.error("unexpected color value:",t));return a}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,a={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,a=a>.04045?Math.pow((a+.055)/1.055,2.4):a/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var n=.4124*e+.3576*a+.1805*i,o=.2126*e+.7152*a+.0722*i,r=.0193*e+.1192*a+.9505*i;return[100*n,100*o,100*r]}function d(t){var e,a,i,n=u(t),o=n[0],r=n[1],s=n[2];return o/=95.047,r/=100,s/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*r-16,a=500*(o-r),i=200*(r-s),[e,a,i]}function c(t){return z(d(t))}function h(t){var e,a,i,n,o,r=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return o=255*l,[o,o,o];a=l<.5?l*(1+s):l+s-l*s,e=2*l-a,n=[0,0,0];for(var u=0;u<3;u++)i=r+1/3*-(u-1),i<0&&i++,i>1&&i--,o=6*i<1?e+6*(a-e)*i:2*i<1?a:3*i<2?e+(a-e)*(2/3-i)*6:e,n[u]=255*o;return n}function f(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,n*=o<=1?o:2-o,a=(o+n)/2,e=2*n/(o+n),[i,100*e,100*a])}function p(t){return o(h(t))}function m(t){return s(h(t))}function v(t){return l(h(t))}function x(t){var e=t[0]/60,a=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-a),s=255*i*(1-a*o),l=255*i*(1-a*(1-o)),i=255*i;switch(n){case 0:return[i,l,r];case 1:return[s,i,r];case 2:return[r,i,l];case 3:return[r,s,i];case 4:return[l,r,i];case 5:return[i,r,s]}}function y(t){var e,a,i=t[0],n=t[1]/100,o=t[2]/100;return a=(2-n)*o,e=n*o,e/=a<=1?a:2-a,e=e||0,a/=2,[i,100*e,100*a]}function k(t){return o(x(t))}function S(t){return s(x(t))}function M(t){return l(x(t))}function w(t){var e,a,i,n,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),e=Math.floor(6*o),a=1-l,i=6*o-e,0!=(1&e)&&(i=1-i),n=s+i*(a-s),e){default:case 6:case 0:r=a,g=n,b=s;break;case 1:r=n,g=a,b=s;break;case 2:r=s,g=a,b=n;break;case 3:r=s,g=n,b=a;break;case 4:r=n,g=s,b=a;break;case 5:r=a,g=s,b=n}return[255*r,255*g,255*b]}function C(t){return i(w(t))}function I(t){return n(w(t))}function D(t){return s(w(t))}function A(t){return l(w(t))}function T(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100,s=t[3]/100;return e=1-Math.min(1,n*(1-s)+s),a=1-Math.min(1,o*(1-s)+s),i=1-Math.min(1,r*(1-s)+s),[255*e,255*a,255*i]}function P(t){return i(T(t))}function _(t){return n(T(t))}function F(t){return o(T(t))}function V(t){return l(T(t))}function R(t){var e,a,i,n=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*n+o*-1.5372+r*-.4986,a=n*-.9689+1.8758*o+.0415*r,i=.0557*n+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,a=a>.0031308?1.055*Math.pow(a,1/2.4)-.055:a*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),a=Math.min(Math.max(0,a),1),i=Math.min(Math.max(0,i),1),[255*e,255*a,255*i]}function O(t){var e,a,i,n=t[0],o=t[1],r=t[2];return n/=95.047,o/=100,r/=108.883,n=n>.008856?Math.pow(n,1/3):7.787*n+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,a=500*(n-o),i=200*(o-r),[e,a,i]}function L(t){return z(O(t))}function B(t){var e,a,i,n,o=t[0],r=t[1],s=t[2];return o<=8?(a=100*o/903.3,n=7.787*(a/100)+16/116):(a=100*Math.pow((o+16)/116,3),n=Math.pow(a/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+n-16/116)/7.787:95.047*Math.pow(r/500+n,3),i=i/108.883<=.008859?i=108.883*(n-s/200-16/116)/7.787:108.883*Math.pow(n-s/200,3),[e,a,i]}function z(t){var e,a,i,n=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),a=360*e/2/Math.PI,a<0&&(a+=360),i=Math.sqrt(o*o+r*r),[n,i,a]}function W(t){return R(B(t))}function N(t){var e,a,i,n=t[0],o=t[1],r=t[2];return i=r/360*2*Math.PI,e=o*Math.cos(i),a=o*Math.sin(i),[n,e,a]}function E(t){return B(N(t))}function H(t){return W(N(t))}function j(t){return G[t]}function U(t){return i(j(t))}function q(t){return n(j(t))}function Y(t){return o(j(t))}function X(t){return s(j(t))}function K(t){return d(j(t))}function J(t){return u(j(t))}e.exports={rgb2hsl:i,rgb2hsv:n,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:u,rgb2lab:d,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:S,hsv2keyword:M,hwb2rgb:w,hwb2hsl:C,hwb2hsv:I,hwb2cmyk:D,hwb2keyword:A,cmyk2rgb:T,cmyk2hsl:P,cmyk2hsv:_,cmyk2hwb:F,cmyk2keyword:V,keyword2rgb:j,keyword2hsl:U,keyword2hsv:q,keyword2hwb:Y,keyword2cmyk:X,keyword2lab:K,keyword2xyz:J,xyz2rgb:R,xyz2lab:O,xyz2lch:L,lab2xyz:B,lab2rgb:W,lab2lch:z,lch2lab:N,lch2xyz:E,lch2rgb:H};var G={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Z={};for(var Q in G)Z[JSON.stringify(G[Q])]=Q},{}],5:[function(t,e,a){var i=t(4),n=function(){return new u};for(var o in i){n[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),s=r[1],l=r[2];n[s]=n[s]||{},n[s][l]=n[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var a=i[t](e);if("string"==typeof a||void 0===a)return a;for(var n=0;n0&&(t[0].yLabel?a=t[0].yLabel:e.labels.length>0&&t[0].index');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o '),n[o]&&e.push(n[o]),e.push(" ");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],s=o.data[n],l=s&&s.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:u(r.backgroundColor,n,d.backgroundColor),h=l.borderColor?l.borderColor:u(r.borderColor,n,d.borderColor),f=l.borderWidth?l.borderWidth:u(r.borderWidth,n,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;a=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&0<=p||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,S=h/100,M={x:y?-1:Math.min(m.x*(m.x<0?1:S),v.x*(v.x<0?1:S)),y:k?-1:Math.min(m.y*(m.y<0?1:S),v.y*(v.y<0?1:S))},w={x:b?1:Math.max(m.x*(m.x>0?1:S),v.x*(v.x>0?1:S)),y:x?1:Math.max(m.y*(m.y>0?1:S),v.y*(v.y>0?1:S))},C={width:.5*(w.x-M.x),height:.5*(w.y-M.y)};u=Math.min(s/C.width,l/C.height),d={x:(w.x+M.x)*-.5,y:(w.y+M.y)*-.5}}i.borderWidth=a.getMaxBorderWidth(c.data),i.outerRadius=Math.max((u-i.borderWidth)/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:0,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=d.x*i.outerRadius,i.offsetY=d.y*i.outerRadius,c.total=a.calculateTotal(),a.outerRadius=i.outerRadius-i.radiusLength*a.getRingIndex(a.index),a.innerRadius=Math.max(a.outerRadius-i.radiusLength,0),e.each(c.data,function(e,i){a.updateElement(e,i,t)})},updateElement:function(t,a,i){var n=this,o=n.chart,r=o.chartArea,s=o.options,l=s.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=s.rotation,h=s.rotation,f=n.getDataset(),g=i&&l.animateRotate?0:t.hidden?0:n.calculateCircumference(f.data[a])*(s.circumference/(2*Math.PI)),p=i&&l.animateScale?0:n.innerRadius,m=i&&l.animateScale?0:n.outerRadius,v=e.getValueAtIndexOrDefault;e.extend(t,{_datasetIndex:n.index,_index:a,_model:{x:u+o.offsetX,y:d+o.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:v(f.label,a,o.data.labels[a])}});var b=t._model;this.removeHoverStyle(t),i&&l.animateRotate||(0===a?b.startAngle=s.rotation:b.startAngle=n.getMeta().data[a-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,a=this.getDataset(),i=this.getMeta(),n=0;return e.each(i.data,function(e,i){t=a.data[i],isNaN(t)||e.hidden||(n+=Math.abs(t))}),n},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,a,i=0,n=this.index,o=t.length,r=0;ri?e:i,i=a>i?a:i;return i}})}},{}],18:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){return a.getValueOrDefault(t.showLine,e.showLines)}var a=t.helpers;t.defaults.line={showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,update:function(t){var i,n,o,r=this,s=r.getMeta(),l=s.dataset,u=s.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(s.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(o=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=h,l._datasetIndex=r.index,l._children=u,l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:o.tension?o.tension:a.getValueOrDefault(f.lineTension,c.tension),backgroundColor:o.backgroundColor?o.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:f.borderWidth||c.borderWidth,borderColor:o.borderColor?o.borderColor:f.borderColor||c.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:o.borderDash?o.borderDash:f.borderDash||c.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:o.fill?o.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:o.steppedLine?o.steppedLine:a.getValueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:o.cubicInterpolationMode?o.cubicInterpolationMode:a.getValueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode),scaleTop:h.top,scaleBottom:h.bottom,scaleZero:h.getBasePixel()},l.pivot()),i=0,n=u.length;i');var a=t.data,i=a.datasets,n=a.labels;if(i.length)for(var o=0;o '),n[o]&&e.push(n[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var a=t.data;return a.labels.length&&a.datasets.length?a.labels.map(function(i,n){var o=t.getDatasetMeta(0),r=a.datasets[0],s=o.data[n],l=s.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:u(r.backgroundColor,n,d.backgroundColor),h=l.borderColor?l.borderColor:u(r.borderColor,n,d.borderColor),f=l.borderWidth?l.borderWidth:u(r.borderWidth,n,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[n])||o.data[n].hidden,index:n}}):[]}},onClick:function(t,e){var a,i,n,o=e.index,r=this.chart;for(a=0,i=(r.data.datasets||[]).length;a0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={aspectRatio:1,scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,update:function(t){var a=this,i=a.getMeta(),n=i.dataset,o=i.data,r=n.custom||{},s=a.getDataset(),l=a.chart.options.elements.line,u=a.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),e.extend(i.dataset,{_datasetIndex:a.index,_children:o,_loop:!0,_model:{tension:r.tension?r.tension:e.getValueOrDefault(s.lineTension,l.tension),backgroundColor:r.backgroundColor?r.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:s.borderWidth||l.borderWidth,borderColor:r.borderColor?r.borderColor:s.borderColor||l.borderColor,fill:r.fill?r.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:r.borderDash?r.borderDash:s.borderDash||l.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle,scaleTop:u.top,scaleBottom:u.bottom,scaleZero:u.getBasePosition()}}),i.dataset.pivot(),e.each(o,function(e,i){a.updateElement(e,i,t)},a),a.updateBezierControlPoints()},updateElement:function(t,a,i){var n=this,o=t.custom||{},r=n.getDataset(),s=n.chart.scale,l=n.chart.options.elements.point,u=s.getPointPositionForValue(a,r.data[a]);e.extend(t,{_datasetIndex:n.index,_index:a,_scale:s,_model:{x:i?s.xCenter:u.x,y:i?s.yCenter:u.y,tension:o.tension?o.tension:e.getValueOrDefault(r.lineTension,n.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(r.pointRadius,a,l.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(r.pointBackgroundColor,a,l.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(r.pointBorderColor,a,l.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(r.pointBorderWidth,a,l.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(r.pointStyle,a,l.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(r.hitRadius,a,l.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,a=this.getMeta();e.each(a.data,function(i,n){var o=i._model,r=e.splineCurve(e.previousItem(a.data,n,!0)._model,o,e.nextItem(a.data,n,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},draw:function(t){var a=this.getMeta(),i=t||1;e.each(a.data,function(t){t.transition(i)}),a.dataset.transition(i).draw(),e.each(a.data,function(t){t.draw()})},setHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model;o.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(a.pointHoverRadius,n,this.chart.options.elements.point.hoverRadius),o.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(a.pointHoverBackgroundColor,n,e.getHoverColor(o.backgroundColor)),o.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(a.pointHoverBorderColor,n,e.getHoverColor(o.borderColor)),o.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(a.pointHoverBorderWidth,n,o.borderWidth)},removeHoverStyle:function(t){var a=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},n=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(a.radius,n,r.radius),o.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(a.pointBackgroundColor,n,r.backgroundColor),o.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(a.pointBorderColor,n,r.borderColor),o.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(a.pointBorderWidth,n,r.borderWidth)}})}},{}],21:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,a,i){var n=this;i||(t.animating=!0);for(var o=0;o1&&(a=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1);for(var i=0;it.animations[i].animationObject.numSteps&&(t.animations[i].animationObject.currentStep=t.animations[i].animationObject.numSteps),t.animations[i].animationObject.render(t.animations[i].chartInstance,t.animations[i].animationObject),t.animations[i].animationObject.onAnimationProgress&&t.animations[i].animationObject.onAnimationProgress.call&&t.animations[i].animationObject.onAnimationProgress.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].animationObject.currentStep===t.animations[i].animationObject.numSteps?(t.animations[i].animationObject.onAnimationComplete&&t.animations[i].animationObject.onAnimationComplete.call&&t.animations[i].animationObject.onAnimationComplete.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].chartInstance.animating=!1,t.animations.splice(i,1)):++i;var n=Date.now(),o=(n-e)/t.frameDuration;t.dropFrames+=o,t.animations.length>0&&t.requestAnimationFrame()}}}},{}],22:[function(t,e,a){"use strict";e.exports=function(t){var e=t.canvasHelpers={};e.drawPoint=function(e,a,i,n,o){var r,s,l,u,d,c;if("object"==typeof a&&(r=a.toString(),"[object HTMLImageElement]"===r||"[object HTMLCanvasElement]"===r))return void e.drawImage(a,n-a.width/2,o-a.height/2);if(!(isNaN(i)||i<=0)){switch(a){default:e.beginPath(),e.arc(n,o,i,0,2*Math.PI),e.closePath(),e.fill();break;case"triangle":e.beginPath(),s=3*i/Math.sqrt(3),d=s*Math.sqrt(3)/2,e.moveTo(n-s/2,o+d/3),e.lineTo(n+s/2,o+d/3),e.lineTo(n,o-2*d/3),e.closePath(),e.fill();break;case"rect":c=1/Math.SQRT2*i,e.beginPath(),e.fillRect(n-c,o-c,2*c,2*c),e.strokeRect(n-c,o-c,2*c,2*c);break;case"rectRounded":var h=i/Math.SQRT2,f=n-h,g=o-h,p=Math.SQRT2*i;t.helpers.drawRoundedRectangle(e,f,g,p,p,i/2),e.fill();break;case"rectRot":c=1/Math.SQRT2*i,e.beginPath(),e.moveTo(n-c,o),e.lineTo(n,o+c),e.lineTo(n+c,o),e.lineTo(n,o-c),e.closePath(),e.fill();break;case"cross":e.beginPath(),e.moveTo(n,o+i),e.lineTo(n,o-i),e.moveTo(n-i,o),e.lineTo(n+i,o),e.closePath();break;case"crossRot":e.beginPath(),l=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(n-l,o-u),e.lineTo(n+l,o+u),e.moveTo(n-l,o+u),e.lineTo(n+l,o-u),e.closePath();break;case"star":e.beginPath(),e.moveTo(n,o+i),e.lineTo(n,o-i),e.moveTo(n-i,o),e.lineTo(n+i,o),l=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(n-l,o-u),e.lineTo(n+l,o+u),e.moveTo(n-l,o+u),e.lineTo(n+l,o-u),e.closePath();break;case"line":e.beginPath(),e.moveTo(n-i,o),e.lineTo(n+i,o),e.closePath();break;case"dash":e.beginPath(),e.moveTo(n,o),e.lineTo(n+i,o),e.closePath()}e.stroke()}},e.clipArea=function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},e.unclipArea=function(t){t.restore()}}},{}],23:[function(t,e,a){"use strict";e.exports=function(t){function e(e){e=e||{};var a=e.data=e.data||{};return a.datasets=a.datasets||[],a.labels=a.labels||[],e.options=i.configMerge(t.defaults.global,t.defaults[e.type],e.options||{}),e}function a(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}var i=t.helpers,n=t.plugins,o=t.platform;t.types={},t.instances={},t.controllers={},t.Controller=function(a,n,r){var s=this;n=e(n);var l=o.acquireContext(a,n),u=l&&l.canvas,d=u&&u.height,c=u&&u.width;return r.ctx=l,r.canvas=u,r.config=n,r.width=c,r.height=d,r.aspectRatio=d?c/d:null,s.id=i.uid(),s.chart=r,s.config=n,s.options=n.options,s._bufferedRender=!1,t.instances[s.id]=s,Object.defineProperty(s,"data",{get:function(){return s.config.data}}),l&&u?(s.initialize(),s.update(),s):(console.error("Failed to create chart: can't acquire context from the given item"),s)},i.extend(t.Controller.prototype,{initialize:function(){var t=this;return n.notify(t,"beforeInit"),i.retinaScale(t.chart),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),n.notify(t,"afterInit"),t},clear:function(){return i.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,a=e.chart,o=e.options,r=a.canvas,s=o.maintainAspectRatio&&a.aspectRatio||null,l=Math.floor(i.getMaximumWidth(r)),u=Math.floor(s?l/s:i.getMaximumHeight(r));if((a.width!==l||a.height!==u)&&(r.width=a.width=l,r.height=a.height=u,r.style.width=l+"px",r.style.height=u+"px",i.retinaScale(a),!t)){var d={width:l,height:u};n.notify(e,"resize",[d]),e.options.onResize&&e.options.onResize(e,d),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},a=t.scale;i.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),i.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),a&&(a.id=a.id||"scale")},buildScales:function(){var e=this,a=e.options,n=e.scales={},o=[];a.scales&&(o=o.concat((a.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(a.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),a.scale&&o.push({options:a.scale,dtype:"radialLinear",isDefault:!0}),i.each(o,function(a){var o=a.options,r=i.getValueOrDefault(o.type,a.dtype),s=t.scaleService.getScaleConstructor(r);if(s){var l=new s({id:o.id,options:o,ctx:e.chart.ctx,chart:e});n[l.id]=l,a.isDefault&&(e.scale=l)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,a=[],n=[];if(i.each(e.data.datasets,function(i,o){var r=e.getDatasetMeta(o);r.type||(r.type=i.type||e.config.type),a.push(r.type),r.controller?r.controller.updateIndex(o):(r.controller=new t.controllers[r.type](e,o),n.push(r.controller))},e),a.length>1)for(var o=1;o0||(n.forEach(function(e){delete t[e]}),delete t._chartjs)}}var i=t.helpers,n=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var a=this;a.chart=t,a.index=e,a.linkScales(),a.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),a=t.getDataset();null===e.xAxisID&&(e.xAxisID=a.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=a.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&a(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,a=e.dataElementType;return a&&new a({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,a=this,i=a.getMeta(),n=a.getDataset().data||[],o=i.data;for(t=0,e=n.length;ti&&t.insertElements(i,n-i)},insertElements:function(t,e){for(var a=0;a=0;n--)e.call(a,t[n],n);else for(n=0;n=i[a].length||!i[a][n].type?i[a].push(o.configMerge(s,e)):e.type&&e.type!==i[a][n].type?i[a][n]=o.configMerge(i[a][n],s,e):i[a][n]=o.configMerge(i[a][n],e)}):(i[a]=[],o.each(e,function(e){var n=o.getValueOrDefault(e.type,"xAxes"===a?"category":"linear");i[a].push(o.configMerge(t.scaleService.getScaleDefaults(n),e))})):i.hasOwnProperty(a)&&"object"==typeof i[a]&&null!==i[a]&&"object"==typeof e?i[a]=o.configMerge(i[a],e):i[a]=e}),i},o.getValueAtIndexOrDefault=function(t,e,a){return void 0===t||null===t?a:o.isArray(t)?e=0;i--){var n=t[i];if(e(n))return n}},o.inherits=function(t){var e=this,a=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=a};return i.prototype=e.prototype,a.prototype=new i,a.extend=o.inherits,t&&o.extend(a.prototype,t),a.__super__=e.prototype,a},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,a){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return t=+t,0===t||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var a=e.x-t.x,i=e.y-t.y,n=Math.sqrt(a*a+i*i),o=Math.atan2(i,a);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:n}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,a,i){var n=t.skip?e:t,o=e,r=a.skip?e:a,s=Math.sqrt(Math.pow(o.x-n.x,2)+Math.pow(o.y-n.y,2)),l=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=s/(s+l),d=l/(s+l);u=isNaN(u)?0:u,d=isNaN(d)?0:d;var c=i*u,h=i*d;return{previous:{x:o.x-c*(r.x-n.x),y:o.y-c*(r.y-n.y)},next:{x:o.x+h*(r.x-n.x),y:o.y+h*(r.y-n.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,a,i,n,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),s=r.length;for(e=0;e0?r[e-1]:null,n=e0?r[e-1]:null,n=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,a){return a?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var a,i=Math.floor(o.log10(t)),n=t/Math.pow(10,i);return a=e?n<1.5?1:n<3?2:n<7?5:10:n<=1?1:n<=2?2:n<=5?5:10,a*Math.pow(10,i)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,a=0,i=1;return 0===t?0:1===(t/=1)?1:(a||(a=.3),i0?(a=l[0].clientX,i=l[0].clientY):(a=n.clientX,i=n.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=s.right-s.left-u-c,g=s.bottom-s.top-d-h;return a=Math.round((a-s.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-s.top-d)/g*r.height/e.currentDevicePixelRatio),{x:a,y:i}},o.addEvent=function(t,e,a){t.addEventListener?t.addEventListener(e,a):t.attachEvent?t.attachEvent("on"+e,a):t["on"+e]=a},o.removeEvent=function(t,e,a){t.removeEventListener?t.removeEventListener(e,a,!1):t.detachEvent?t.detachEvent("on"+e,a):t["on"+e]=o.noop},o.getConstraintWidth=function(t){return n(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return n(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),n=e.clientWidth-a-i,r=o.getConstraintWidth(t);return isNaN(r)?n:Math.min(n,r)},o.getMaximumHeight=function(t){var e=t.parentNode,a=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),n=e.clientHeight-a-i,r=o.getConstraintHeight(t);return isNaN(r)?n:Math.min(n,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t){var e=t.currentDevicePixelRatio=window.devicePixelRatio||1;if(1!==e){var a=t.canvas,i=t.height,n=t.width;a.height=i*e,a.width=n*e,t.ctx.scale(e,e),a.style.height=i+"px",a.style.width=n+"px"}},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,a){return e+" "+t+"px "+a},o.longestText=function(t,e,a,i){i=i||{};var n=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(n=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var s=0;o.each(a,function(e){void 0!==e&&null!==e&&o.isArray(e)!==!0?s=o.measureText(t,n,r,s,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(s=o.measureText(t,n,r,s,e))})});var l=r.length/2;if(l>a.length){for(var u=0;ui&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.drawRoundedRectangle=function(t,e,a,i,n,o){t.beginPath(),t.moveTo(e+o,a),t.lineTo(e+i-o,a),t.quadraticCurveTo(e+i,a,e+i,a+o),t.lineTo(e+i,a+n-o),t.quadraticCurveTo(e+i,a+n,e+i-o,a+n),t.lineTo(e+o,a+n),t.quadraticCurveTo(e,a+n,e,a+n-o),t.lineTo(e,a+o),t.quadraticCurveTo(e,a,e+o,a),t.closePath()},o.color=function(e){return i?i(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.error("Color.js not found!"),e)},o.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var a,i,n,r;if(!t||!e||t.length!==e.length)return!1;for(a=0,i=t.length;a0&&(s=t.getDatasetMeta(s[0]._datasetIndex).data),s},"x-axis":function(t,e){return o(t,e,!0)},point:function(t,a){var n=e(a,t.chart);return i(t,n)},nearest:function(t,a,i){var o=e(a,t.chart),r=n(t,o,i.intersect);return r.length>1&&r.sort(function(t,e){var a=t.getArea(),i=e.getArea(),n=a-i;return 0===n&&(n=t._datasetIndex-e._datasetIndex),n}),r.slice(0,1)},x:function(t,i,n){var o=e(i,t.chart),r=[],s=!1;return a(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(s=!0)}),n.intersect&&!s&&(r=[]),r},y:function(t,i,n){var o=e(i,t.chart),r=[],s=!1;return a(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(s=!0)}),n.intersect&&!s&&(r=[]),r}}}}},{}],28:[function(t,e,a){"use strict";e.exports=function(){var t=function(e,a){return this.controller=new t.Controller(e,a,this),this.controller};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('');for(var a=0;a '),t.data.datasets[a].label&&e.push(t.data.datasets[a].label),e.push("");return e.push(" "),e.join("")}}},t.Chart=t,t}},{}],29:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,a,i){function n(t){var e,a=t.isHorizontal();a?(e=t.update(t.options.fullWidth?x:C,w),I-=e.height):(e=t.update(M,S),C-=e.width),D.push({horizontal:a,minSize:e,box:t})}function o(t){var a=e.findNextWhere(D,function(e){return e.box===t});if(a)if(t.isHorizontal()){var i={left:Math.max(F,A),right:Math.max(V,T),top:0,bottom:0};t.update(t.options.fullWidth?x:C,y/2,i)}else t.update(a.minSize.width,I)}function r(t){var a=e.findNextWhere(D,function(e){return e.box===t}),i={left:0,right:0,top:R,bottom:O};a&&t.update(a.minSize.width,I,i)}function s(t){t.isHorizontal()?(t.left=t.options.fullWidth?d:F,t.right=t.options.fullWidth?a-c:F+C,t.top=E,t.bottom=E+t.height,E=t.bottom):(t.left=N,t.right=N+t.width,t.top=R,t.bottom=R+I,N=t.right)}if(t){var l=t.options.layout,u=l?l.padding:null,d=0,c=0,h=0,f=0;isNaN(u)?(d=u.left||0,c=u.right||0,h=u.top||0,f=u.bottom||0):(d=u,c=u,h=u,f=u);var g=e.where(t.boxes,function(t){return"left"===t.options.position}),p=e.where(t.boxes,function(t){return"right"===t.options.position}),m=e.where(t.boxes,function(t){return"top"===t.options.position}),v=e.where(t.boxes,function(t){return"bottom"===t.options.position}),b=e.where(t.boxes,function(t){return"chartArea"===t.options.position});m.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),v.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var x=a-d-c,y=i-h-f,k=x/2,S=y/2,M=(a-k)/(g.length+p.length),w=(i-S)/(m.length+v.length),C=x,I=y,D=[];e.each(g.concat(p,m,v),n);var A=0,T=0,P=0,_=0;e.each(m.concat(v),function(t){if(t.getPadding){var e=t.getPadding();A=Math.max(A,e.left),T=Math.max(T,e.right)}}),e.each(g.concat(p),function(t){if(t.getPadding){var e=t.getPadding();P=Math.max(P,e.top),_=Math.max(_,e.bottom)}});var F=d,V=c,R=h,O=f;e.each(g.concat(p),o),e.each(g,function(t){F+=t.width}),e.each(p,function(t){V+=t.width}),e.each(m.concat(v),o),e.each(m,function(t){R+=t.height}),e.each(v,function(t){O+=t.height}),e.each(g.concat(p),r),F=d,V=c,R=h,O=f,e.each(g,function(t){F+=t.width}),e.each(p,function(t){V+=t.width}),e.each(m,function(t){R+=t.height}),e.each(v,function(t){O+=t.height});var L=Math.max(A-F,0);F+=L,V+=Math.max(T-V,0);var B=Math.max(P-R,0);R+=B,O+=Math.max(_-O,0);var z=i-R-O,W=a-F-V;W===C&&z===I||(e.each(g,function(t){t.height=z}),e.each(p,function(t){t.height=z}),e.each(m,function(t){t.options.fullWidth||(t.width=W)}),e.each(v,function(t){t.options.fullWidth||(t.width=W)}),I=z,C=W);var N=d+L,E=h+B;e.each(g.concat(m),s),N+=C,E+=I,e.each(p,s),e.each(v,s),t.chartArea={left:F,top:R,right:F+C,bottom:R+I},e.each(b,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(C,I)})}}}}},{}],30:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function a(e,a){var i=new t.Legend({ctx:e.chart.ctx,options:a,chart:e});e.legend=i,t.layoutService.addBox(e,i)}var i=t.helpers,n=i.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var a=e.datasetIndex,i=this.chart,n=i.getDatasetMeta(a);n.hidden=null===n.hidden?!i.data.datasets[a].hidden:null,i.update()},onHover:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return i.isArray(e.datasets)?e.datasets.map(function(e,a){return{text:e.label,fillStyle:i.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(a),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:a}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){i.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:n,update:function(t,e,a){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=a,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:n,beforeSetDimensions:n,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:n,beforeBuildLabels:n,buildLabels:function(){var t=this,e=t.options.labels,a=e.generateLabels.call(t,t.chart);e.filter&&(a=a.filter(function(a){return e.filter(a,t.chart.data)})),t.options.reverse&&a.reverse(),t.legendItems=a},afterBuildLabels:n,beforeFit:n,fit:function(){var a=this,n=a.options,o=n.labels,r=n.display,s=a.ctx,l=t.defaults.global,u=i.getValueOrDefault,d=u(o.fontSize,l.defaultFontSize),c=u(o.fontStyle,l.defaultFontStyle),h=u(o.fontFamily,l.defaultFontFamily),f=i.fontString(d,c,h),g=a.legendHitBoxes=[],p=a.minSize,m=a.isHorizontal();if(m?(p.width=a.maxWidth,p.height=r?10:0):(p.width=r?10:0,p.height=a.maxHeight),r)if(s.font=f,m){var v=a.lineWidths=[0],b=a.legendItems.length?d+o.padding:0;s.textAlign="left",s.textBaseline="top",i.each(a.legendItems,function(t,i){var n=e(o,d),r=n+d/2+s.measureText(t.text).width;v[v.length-1]+r+o.padding>=a.width&&(b+=d+o.padding,v[v.length]=a.left),g[i]={left:0,top:0,width:r,height:d},v[v.length-1]+=r+o.padding}),p.height+=b}else{var x=o.padding,y=a.columnWidths=[],k=o.padding,S=0,M=0,w=d+x;i.each(a.legendItems,function(t,a){var i=e(o,d),n=i+d/2+s.measureText(t.text).width;M+w>p.height&&(k+=S+o.padding,y.push(S),S=0,M=0),S=Math.max(S,n),M+=w,g[a]={left:0,top:0,width:n,height:d}}),k+=S,y.push(S),p.width+=k}a.width=p.width,a.height=p.height},afterFit:n,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var a=this,n=a.options,o=n.labels,r=t.defaults.global,s=r.elements.line,l=a.width,u=a.lineWidths;if(n.display){var d,c=a.ctx,h=i.getValueOrDefault,f=h(o.fontColor,r.defaultFontColor),g=h(o.fontSize,r.defaultFontSize),p=h(o.fontStyle,r.defaultFontStyle),m=h(o.fontFamily,r.defaultFontFamily),v=i.fontString(g,p,m);c.textAlign="left",c.textBaseline="top",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var b=e(o,g),x=a.legendHitBoxes,y=function(e,a,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,s.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,s.borderDashOffset),c.lineJoin=h(i.lineJoin,s.borderJoinStyle),c.lineWidth=h(i.lineWidth,s.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var o=0===h(i.lineWidth,s.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,s.borderDash)),n.labels&&n.labels.usePointStyle){var l=g*Math.SQRT2/2,u=l/Math.SQRT2,d=e+u,f=a+u;t.canvasHelpers.drawPoint(c,i.pointStyle,l,d,f)}else o||c.strokeRect(e,a,b,g),c.fillRect(e,a,b,g);c.restore()}},k=function(t,e,a,i){c.fillText(a.text,b+g/2+t,e),a.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(b+g/2+t,e+g/2),c.lineTo(b+g/2+t+i,e+g/2),c.stroke())},S=a.isHorizontal();d=S?{x:a.left+(l-u[0])/2,y:a.top+o.padding,line:0}:{x:a.left+o.padding,y:a.top+o.padding,line:0};var M=g+o.padding;i.each(a.legendItems,function(t,e){var i=c.measureText(t.text).width,n=b+g/2+i,r=d.x,s=d.y;S?r+n>=l&&(s=d.y+=M,d.line++,r=d.x=a.left+(l-u[d.line])/2):s+M>a.bottom&&(r=d.x=r+a.columnWidths[d.line]+o.padding,s=d.y=a.top+o.padding,d.line++),y(r,s,t),x[e].left=r,x[e].top=s,k(r,s,t,i),S?d.x+=n+o.padding:d.y+=M})}},handleEvent:function(t){var e=this,a=e.options,i="mouseup"===t.type?"click":t.type,n=!1;if("mousemove"===i){if(!a.onHover)return}else{if("click"!==i)return;if(!a.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var s=e.legendHitBoxes,l=0;l=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){a.onClick.call(e,t.native,e.legendItems[l]),n=!0;break}if("mousemove"===i){a.onHover.call(e,t.native,e.legendItems[l]),n=!0;break}}}return n}}),t.plugins.register({beforeInit:function(t){var e=t.options.legend;e&&a(t,e)},beforeUpdate:function(e){var n=e.options.legend;n?(n=i.configMerge(t.defaults.global.legend,n),e.legend?e.legend.options=n:a(e,n)):(t.layoutService.removeBox(e,e.legend),delete e.legend)},afterEvent:function(t,e){var a=t.legend;a&&a.handleEvent(e)}})}},{}],31:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.plugins={},t.plugins={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){e.indexOf(t)===-1&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var a=e.indexOf(t);a!==-1&&e.splice(a,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length;
+},getAll:function(){return this._plugins},notify:function(t,e,a){var i,n,o,r,s,l=this.descriptors(t),u=l.length;for(i=0;ic&&rt.maxHeight){r--;break}r++,d=s*u}t.labelRotation=r},afterCalculateTickRotation:function(){i.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){i.callCallback(this.options.beforeFit,[this])},fit:function(){var t=this,n=t.minSize={width:0,height:0},o=t.options,r=o.ticks,s=o.scaleLabel,l=o.gridLines,u=o.display,d=t.isHorizontal(),c=a(r),h=1.5*a(s).size,f=o.gridLines.tickMarkLength;if(d?n.width=t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:n.width=u&&l.drawTicks?f:0,d?n.height=u&&l.drawTicks?f:0:n.height=t.maxHeight,s.display&&u&&(d?n.height+=h:n.width+=h),r.display&&u){var g=i.longestText(t.ctx,c.font,t.ticks,t.longestTextCache),p=i.numberOfLabelLines(t.ticks),m=.5*c.size;if(d){t.longestLabelWidth=g;var v=i.toRadians(t.labelRotation),b=Math.cos(v),x=Math.sin(v),y=x*g+c.size*p+m*p;n.height=Math.min(t.maxHeight,n.height+y),t.ctx.font=c.font;var k=t.ticks[0],S=e(t.ctx,k,c.font),M=t.ticks[t.ticks.length-1],w=e(t.ctx,M,c.font);0!==t.labelRotation?(t.paddingLeft="bottom"===o.position?b*S+3:b*m+3,t.paddingRight="bottom"===o.position?b*m+3:b*w+3):(t.paddingLeft=S/2+3,t.paddingRight=w/2+3)}else r.mirror?g=0:g+=t.options.ticks.padding,n.width+=g,t.paddingTop=c.size/2,t.paddingBottom=c.size/2}t.handleMargins(),t.width=n.width,t.height=n.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){i.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){return null===t||"undefined"==typeof t?NaN:"number"!=typeof t||isFinite(t)?"object"==typeof t?t instanceof Date||t.isValid?t:this.getRightValue(this.isHorizontal()?t.x:t.y):t:NaN},getLabelForIndex:i.noop,getPixelForValue:i.noop,getValueForPixel:i.noop,getPixelForTick:function(t,e){var a=this;if(a.isHorizontal()){var i=a.width-(a.paddingLeft+a.paddingRight),n=i/Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),o=n*t+a.paddingLeft;e&&(o+=n/2);var r=a.left+Math.round(o);return r+=a.isFullWidth()?a.margins.left:0}var s=a.height-(a.paddingTop+a.paddingBottom);return a.top+t*(s/(a.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var a=e.width-(e.paddingLeft+e.paddingRight),i=a*t+e.paddingLeft,n=e.left+Math.round(i);return n+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,a=t.max;return t.beginAtZero?0:e<0&&a<0?a:e>0&&a>0?e:0},draw:function(e){var n=this,o=n.options;if(o.display){var r,s,l=n.ctx,u=t.defaults.global,d=o.ticks,c=o.gridLines,h=o.scaleLabel,f=0!==n.labelRotation,g=d.autoSkip,p=n.isHorizontal();d.maxTicksLimit&&(s=d.maxTicksLimit);var m=i.getValueOrDefault(d.fontColor,u.defaultFontColor),v=a(d),b=c.drawTicks?c.tickMarkLength:0,x=i.getValueOrDefault(c.borderDash,u.borderDash),y=i.getValueOrDefault(c.borderDashOffset,u.borderDashOffset),k=i.getValueOrDefault(h.fontColor,u.defaultFontColor),S=a(h),M=i.toRadians(n.labelRotation),w=Math.cos(M),C=n.longestLabelWidth*w;l.fillStyle=m;var I=[];if(p){if(r=!1,f&&(C/=2),(C+d.autoSkipPadding)*n.ticks.length>n.width-(n.paddingLeft+n.paddingRight)&&(r=1+Math.floor((C+d.autoSkipPadding)*n.ticks.length/(n.width-(n.paddingLeft+n.paddingRight)))),s&&n.ticks.length>s)for(;!r||n.ticks.length/(r||1)>s;)r||(r=1),r+=1;g||(r=!1)}var D="right"===o.position?n.left:n.right-b,A="right"===o.position?n.left+b:n.right,T="bottom"===o.position?n.top:n.bottom-b,P="bottom"===o.position?n.top+b:n.bottom;if(i.each(n.ticks,function(t,a){if(void 0!==t&&null!==t){var s=n.ticks.length===a+1,l=r>1&&a%r>0||a%r===0&&a+r>=n.ticks.length;if((!l||s)&&void 0!==t&&null!==t){var u,h;a===("undefined"!=typeof n.zeroLineIndex?n.zeroLineIndex:0)?(u=c.zeroLineWidth,h=c.zeroLineColor):(u=i.getValueAtIndexOrDefault(c.lineWidth,a),h=i.getValueAtIndexOrDefault(c.color,a));var g,m,v,k,S,w,C,_,F,V,R="middle",O="middle";if(p){"bottom"===o.position?(O=f?"middle":"top",R=f?"right":"center",V=n.top+b):(O=f?"middle":"bottom",R=f?"left":"center",V=n.bottom-b);var L=n.getPixelForTick(a)+i.aliasPixel(u);F=n.getPixelForTick(a,c.offsetGridLines)+d.labelOffset,g=v=S=C=L,m=T,k=P,w=e.top,_=e.bottom}else{var B,z="left"===o.position,W=d.padding;d.mirror?(R=z?"left":"right",B=W):(R=z?"right":"left",B=b+W),F=z?n.right-B:n.left+B;var N=n.getPixelForTick(a);N+=i.aliasPixel(u),V=n.getPixelForTick(a,c.offsetGridLines),g=D,v=A,S=e.left,C=e.right,m=k=w=_=N}I.push({tx1:g,ty1:m,tx2:v,ty2:k,x1:S,y1:w,x2:C,y2:_,labelX:F,labelY:V,glWidth:u,glColor:h,glBorderDash:x,glBorderDashOffset:y,rotation:-1*M,label:t,textBaseline:O,textAlign:R})}}}),i.each(I,function(t){if(c.display&&(l.save(),l.lineWidth=t.glWidth,l.strokeStyle=t.glColor,l.setLineDash&&(l.setLineDash(t.glBorderDash),l.lineDashOffset=t.glBorderDashOffset),l.beginPath(),c.drawTicks&&(l.moveTo(t.tx1,t.ty1),l.lineTo(t.tx2,t.ty2)),c.drawOnChartArea&&(l.moveTo(t.x1,t.y1),l.lineTo(t.x2,t.y2)),l.stroke(),l.restore()),d.display){l.save(),l.translate(t.labelX,t.labelY),l.rotate(t.rotation),l.font=v.font,l.textBaseline=t.textBaseline,l.textAlign=t.textAlign;var e=t.label;if(i.isArray(e))for(var a=0,n=0;a0)i=t.stepSize;else{var o=e.niceNum(a.max-a.min,!1);i=e.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(a.min/i)*i,s=Math.ceil(a.max/i)*i;t.min&&t.max&&t.stepSize&&e.almostWhole((t.max-t.min)/t.stepSize,i/1e3)&&(r=t.min,s=t.max);var l=(s-r)/i;l=e.almostEquals(l,Math.round(l),i/1e3)?Math.round(l):Math.ceil(l),n.push(void 0!==t.min?t.min:r);for(var u=1;u3?i[2]-i[1]:i[1]-i[0];Math.abs(n)>1&&t!==Math.floor(t)&&(n=t-Math.floor(t));var o=e.log10(Math.abs(n)),r="";if(0!==t){var s=-1*Math.floor(o);s=Math.max(Math.min(s,20),0),r=t.toFixed(s)}else r="0";return r},logarithmic:function(t,a,i){var n=t/Math.pow(10,Math.floor(e.log10(t)));return 0===t?"0":1===n||2===n||5===n||0===a||a===i.length-1?t.toExponential():""}}}}},{}],35:[function(t,e,a){"use strict";e.exports=function(t){function e(e,a){var i=new t.Title({ctx:e.chart.ctx,options:a,chart:e});e.titleBlock=i,t.layoutService.addBox(e,i)}var a=t.helpers;t.defaults.global.title={display:!1,position:"top",fullWidth:!0,fontStyle:"bold",padding:10,text:""};var i=a.noop;t.Title=t.Element.extend({initialize:function(t){var e=this;a.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:i,update:function(t,e,a){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=a,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:i,beforeSetDimensions:i,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:i,beforeBuildLabels:i,buildLabels:i,afterBuildLabels:i,beforeFit:i,fit:function(){var e=this,i=a.getValueOrDefault,n=e.options,o=t.defaults.global,r=n.display,s=i(n.fontSize,o.defaultFontSize),l=e.minSize;e.isHorizontal()?(l.width=e.maxWidth,l.height=r?s+2*n.padding:0):(l.width=r?s+2*n.padding:0,l.height=e.maxHeight),e.width=l.width,e.height=l.height},afterFit:i,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var e=this,i=e.ctx,n=a.getValueOrDefault,o=e.options,r=t.defaults.global;if(o.display){var s,l,u,d=n(o.fontSize,r.defaultFontSize),c=n(o.fontStyle,r.defaultFontStyle),h=n(o.fontFamily,r.defaultFontFamily),f=a.fontString(d,c,h),g=0,p=e.top,m=e.left,v=e.bottom,b=e.right;i.fillStyle=n(o.fontColor,r.defaultFontColor),i.font=f,e.isHorizontal()?(s=m+(b-m)/2,l=p+(v-p)/2,u=b-m):(s="left"===o.position?m+d/2:b-d/2,l=p+(v-p)/2,u=v-p,g=Math.PI*("left"===o.position?-.5:.5)),i.save(),i.translate(s,l),i.rotate(g),i.textAlign="center",i.textBaseline="middle",i.fillText(o.text,0,0,u),i.restore()}}}),t.plugins.register({beforeInit:function(t){var a=t.options.title;a&&e(t,a)},beforeUpdate:function(i){var n=i.options.title;n?(n=a.configMerge(t.defaults.global.title,n),i.titleBlock?i.titleBlock.options=n:e(i,n)):(t.layoutService.removeBox(i,i.titleBlock),delete i.titleBlock)}})}},{}],36:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){var a=l.color(t);return a.alpha(e*a.alpha()).rgbaString()}function a(t,e){return e&&(l.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function i(t){var e=t._xScale,a=t._yScale||t._scale,i=t._index,n=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,n):"",yLabel:a?a.getLabelForIndex(i,n):"",index:i,datasetIndex:n,x:t._model.x,y:t._model.y}}function n(e){var a=t.defaults.global,i=l.getValueOrDefault;return{xPadding:e.xPadding,yPadding:e.yPadding,xAlign:e.xAlign,yAlign:e.yAlign,bodyFontColor:e.bodyFontColor,_bodyFontFamily:i(e.bodyFontFamily,a.defaultFontFamily),_bodyFontStyle:i(e.bodyFontStyle,a.defaultFontStyle),_bodyAlign:e.bodyAlign,bodyFontSize:i(e.bodyFontSize,a.defaultFontSize),bodySpacing:e.bodySpacing,titleFontColor:e.titleFontColor,_titleFontFamily:i(e.titleFontFamily,a.defaultFontFamily),_titleFontStyle:i(e.titleFontStyle,a.defaultFontStyle),titleFontSize:i(e.titleFontSize,a.defaultFontSize),_titleAlign:e.titleAlign,titleSpacing:e.titleSpacing,titleMarginBottom:e.titleMarginBottom,footerFontColor:e.footerFontColor,_footerFontFamily:i(e.footerFontFamily,a.defaultFontFamily),_footerFontStyle:i(e.footerFontStyle,a.defaultFontStyle),footerFontSize:i(e.footerFontSize,a.defaultFontSize),_footerAlign:e.footerAlign,footerSpacing:e.footerSpacing,footerMarginTop:e.footerMarginTop,caretSize:e.caretSize,cornerRadius:e.cornerRadius,backgroundColor:e.backgroundColor,opacity:0,legendColorBackground:e.multiKeyBackground,displayColors:e.displayColors}}function o(t,e){var a=t._chart.ctx,i=2*e.yPadding,n=0,o=e.body,r=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=s*d,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=r*c,i+=r?(r-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){n=Math.max(n,a.measureText(t).width+f)};return a.font=l.fontString(d,e._titleFontStyle,e._titleFontFamily),l.each(e.title,g),a.font=l.fontString(c,e._bodyFontStyle,e._bodyFontFamily),l.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,l.each(o,function(t){l.each(t.before,g),l.each(t.lines,g),l.each(t.after,g)}),f=0,a.font=l.fontString(h,e._footerFontStyle,e._footerFontFamily),l.each(e.footer,g),n+=2*e.xPadding,{width:n,height:i}}function r(t,e){var a=t._model,i=t._chart,n=t._chartInstance.chartArea,o="center",r="center";a.yi.height-e.height&&(r="bottom");var s,l,u,d,c,h=(n.left+n.right)/2,f=(n.top+n.bottom)/2;"center"===r?(s=function(t){return t<=h},l=function(t){return t>h}):(s=function(t){return t<=e.width/2},l=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},s(a.x)?(o="left",u(a.x)&&(o="center",r=c(a.y))):l(a.x)&&(o="right",d(a.x)&&(o="center",r=c(a.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function s(t,e,a){var i=t.x,n=t.y,o=t.caretSize,r=t.caretPadding,s=t.cornerRadius,l=a.xAlign,u=a.yAlign,d=o+r,c=s+r;return"right"===l?i-=e.width:"center"===l&&(i-=e.width/2),"top"===u?n+=d:n-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===l?i+=d:"right"===l&&(i-=d):"left"===l?i-=c:"right"===l&&(i+=c),{x:i,y:n}}var l=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,callbacks:{beforeTitle:l.noop,title:function(t,e){var a="",i=e.labels,n=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?a=o.xLabel:n>0&&o.indexl;)o-=2*Math.PI;for(;o=s&&o<=l,d=r>=i.innerRadius&&r<=i.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,a=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*a,y:t.y+Math.sin(e)*a}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,a=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*a,y:t.y+Math.sin(e)*a}},draw:function(){var t=this._chart.ctx,e=this._view,a=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,a,i),t.arc(e.x,e.y,e.innerRadius,i,a,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],38:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:a.defaultColor,borderWidth:3,borderColor:a.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0},t.elements.Line=t.Element.extend({draw:function(){function t(t,e){var a=e._view;e._view.steppedLine===!0?(l.lineTo(a.x,t._view.y),l.lineTo(a.x,a.y)):0===e._view.tension?l.lineTo(a.x,a.y):l.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,a.controlPointPreviousX,a.controlPointPreviousY,a.x,a.y)}var i=this,n=i._view,o=n.spanGaps,r=n.scaleZero,s=i._loop;s||("top"===n.fill?r=n.scaleTop:"bottom"===n.fill&&(r=n.scaleBottom));var l=i._chart.ctx;l.save();var u=i._children.slice(),d=-1;s&&u.length&&u.push(u[0]);var c,h,f,g;if(u.length&&n.fill){for(l.beginPath(),c=0;ce?1:-1,r=1,s=u.borderSkipped||"left"):(e=u.x-u.width/2,a=u.x+u.width/2,i=u.y,n=u.base,o=1,r=n>i?1:-1,s=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-a),Math.abs(i-n));d=d>c?c:d;var h=d/2,f=e+("left"!==s?h*o:0),g=a+("right"!==s?-h*o:0),p=i+("top"!==s?h*r:0),m=n+("bottom"!==s?-h*r:0);f!==g&&(i=p,n=m),p!==m&&(e=f,a=g)}l.beginPath(),l.fillStyle=u.backgroundColor,l.strokeStyle=u.borderColor,l.lineWidth=d;var v=[[e,n],[e,i],[a,i],[a,n]],b=["bottom","left","top","right"],x=b.indexOf(s,0);x===-1&&(x=0);var y=t(0);l.moveTo(y[0],y[1]);for(var k=1;k<4;k++)y=t(k),l.lineTo(y[0],y[1]);l.fill(),d&&l.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=!1;if(this._view){var n=a(this);i=t>=n.left&&t<=n.right&&e>=n.top&&e<=n.bottom}return i},inLabelRange:function(t,i){var n=this;if(!n._view)return!1;var o=!1,r=a(n);return o=e(n)?t>=r.left&&t<=r.right:i>=r.top&&i<=r.bottom},inXRange:function(t){var e=a(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=a(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,a,i=this._view;return e(this)?(t=i.x,a=(i.y+i.base)/2):(t=(i.x+i.base)/2,a=i.y),{x:t,y:a}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],41:[function(t,e,a){"use strict";e.exports=function(t){function e(t,e){var a=l.getStyle(t,e),i=a&&a.match(/(\d+)px/);return i?Number(i[1]):void 0}function a(t,a){var i=t.style,n=t.getAttribute("height"),o=t.getAttribute("width");if(t._chartjs={initial:{height:n,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===o||""===o){var r=e(t,"width");void 0!==r&&(t.width=r)}if(null===n||""===n)if(""===t.style.height)t.height=t.width/(a.options.aspectRatio||2);else{var s=e(t,"height");void 0!==r&&(t.height=s)}return t}function i(t,e,a,i,n){return{type:t,chart:e,native:n||null,x:void 0!==a?a:null,y:void 0!==i?i:null}}function n(t,e){
+var a=u[t.type]||t.type,n=l.getRelativePosition(t,e);return i(a,e,n.x,n.y,t)}function o(t){var e=document.createElement("iframe");return e.className="chartjs-hidden-iframe",e.style.cssText="display:block;overflow:hidden;border:0;margin:0;top:0;left:0;bottom:0;right:0;height:100%;width:100%;position:absolute;pointer-events:none;z-index:-1;",e.tabIndex=-1,l.addEvent(e,"load",function(){l.addEvent(e.contentWindow||e,"resize",t),t()}),e}function r(t,e,a){var n=t._chartjs={ticking:!1},r=function(){n.ticking||(n.ticking=!0,l.requestAnimFrame.call(window,function(){if(n.resizer)return n.ticking=!1,e(i("resize",a))}))};n.resizer=o(r),t.insertBefore(n.resizer,t.firstChild)}function s(t){if(t&&t._chartjs){var e=t._chartjs.resizer;e&&(e.parentNode.removeChild(e),t._chartjs.resizer=null),delete t._chartjs}}var l=t.helpers,u={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};return{acquireContext:function(t,e){if("string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t instanceof HTMLCanvasElement){var i=t.getContext&&t.getContext("2d");if(i instanceof CanvasRenderingContext2D)return a(t,e),i}return null},releaseContext:function(t){var e=t.canvas;if(e._chartjs){var a=e._chartjs.initial;["height","width"].forEach(function(t){var i=a[t];void 0===i||null===i?e.removeAttribute(t):e.setAttribute(t,i)}),l.each(a.style||{},function(t,a){e.style[a]=t}),e.width=e.width,delete e._chartjs}},addEventListener:function(t,e,a){var i=t.chart.canvas;if("resize"===e)return void r(i.parentNode,a,t.chart);var o=a._chartjs||(a._chartjs={}),s=o.proxies||(o.proxies={}),u=s[t.id+"_"+e]=function(e){a(n(e,t.chart))};l.addEvent(i,e,u)},removeEventListener:function(t,e,a){var i=t.chart.canvas;if("resize"===e)return void s(i.parentNode,a);var n=a._chartjs||{},o=n.proxies||{},r=o[t.id+"_"+e];r&&l.removeEvent(i,e,r)}}}},{}],42:[function(t,e,a){"use strict";var i=t(41);e.exports=function(t){t.platform={acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},t.helpers.extend(t.platform,i(t))}},{41:41}],43:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"bottom"},i=t.Scale.extend({getLabels:function(){var t=this.chart.data;return(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,a=t.getLabels();t.minIndex=0,t.maxIndex=a.length-1;var i;void 0!==t.options.ticks.min&&(i=e.indexOf(a,t.options.ticks.min),t.minIndex=i!==-1?i:t.minIndex),void 0!==t.options.ticks.max&&(i=e.indexOf(a,t.options.ticks.max),t.maxIndex=i!==-1?i:t.maxIndex),t.min=a[t.minIndex],t.max=a[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var a=this,i=a.chart.data,n=a.isHorizontal();return i.yLabels&&!n?a.getRightValue(i.datasets[e].data[t]):a.ticks[t-a.minIndex]},getPixelForValue:function(t,e,a,i){var n=this,o=Math.max(n.maxIndex+1-n.minIndex-(n.options.gridLines.offsetGridLines?0:1),1);if(void 0!==t&&isNaN(e)){var r=n.getLabels(),s=r.indexOf(t);e=s!==-1?s:e}if(n.isHorizontal()){var l=n.width/o,u=l*(e-n.minIndex);return(n.options.gridLines.offsetGridLines&&i||n.maxIndex===n.minIndex&&i)&&(u+=l/2),n.left+Math.round(u)}var d=n.height/o,c=d*(e-n.minIndex);return n.options.gridLines.offsetGridLines&&i&&(c+=d/2),n.top+Math.round(c)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,a=this,i=Math.max(a.ticks.length-(a.options.gridLines.offsetGridLines?0:1),1),n=a.isHorizontal(),o=(n?a.width:a.height)/i;return t-=n?a.left:a.top,a.options.gridLines.offsetGridLines&&(t-=o/2),e=t<=0?0:Math.round(t/o)},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType("category",i,a)}},{}],44:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:t.Ticks.formatters.linear}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=a.chart,o=n.data,r=o.datasets,s=a.isHorizontal();a.min=null,a.max=null;var l=i.stacked;if(void 0===l&&e.each(r,function(e,a){if(!l){var i=n.getDatasetMeta(a);n.isDatasetVisible(a)&&t(i)&&void 0!==i.stack&&(l=!0)}}),i.stacked||l){var u={};e.each(r,function(o,r){var s=n.getDatasetMeta(r),l=[s.type,void 0===i.stacked&&void 0===s.stack?r:"",s.stack].join(".");void 0===u[l]&&(u[l]={positiveValues:[],negativeValues:[]});var d=u[l].positiveValues,c=u[l].negativeValues;n.isDatasetVisible(r)&&t(s)&&e.each(o.data,function(t,e){var n=+a.getRightValue(t);isNaN(n)||s.data[e].hidden||(d[e]=d[e]||0,c[e]=c[e]||0,i.relativePoints?d[e]=100:n<0?c[e]+=n:d[e]+=n)})}),e.each(u,function(t){var i=t.positiveValues.concat(t.negativeValues),n=e.min(i),o=e.max(i);a.min=null===a.min?n:Math.min(a.min,n),a.max=null===a.max?o:Math.max(a.max,o)})}else e.each(r,function(i,o){var r=n.getDatasetMeta(o);n.isDatasetVisible(o)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:ia.max&&(a.max=i))})});this.handleTickRangeOptions()},getTickLimit:function(){var a,i=this,n=i.options.ticks;if(i.isHorizontal())a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.width/50));else{var o=e.getValueOrDefault(n.fontSize,t.defaults.global.defaultFontSize);a=Math.min(n.maxTicksLimit?n.maxTicksLimit:11,Math.ceil(i.height/(2*o)))}return a},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,a=this,i=a.start,n=+a.getRightValue(t),o=a.end-i;return a.isHorizontal()?(e=a.left+a.width/o*(n-i),Math.round(e)):(e=a.bottom-a.height/o*(n-i),Math.round(e))},getValueForPixel:function(t){var e=this,a=e.isHorizontal(),i=a?e.width:e.height,n=(a?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*n},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",i,a)}},{}],45:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,a=t.options,i=a.ticks;if(i.beginAtZero){var n=e.sign(t.min),o=e.sign(t.max);n<0&&o<0?t.max=0:n>0&&o>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:a,handleDirectionalChanges:a,buildTicks:function(){var a=this,i=a.options,n=i.ticks,o=a.getTickLimit();o=Math.max(2,o);var r={maxTicks:o,min:n.min,max:n.max,stepSize:e.getValueOrDefault(n.fixedStepSize,n.stepSize)},s=a.ticks=t.Ticks.generators.linear(r,a);a.handleDirectionalChanges(),a.max=e.max(s),a.min=e.min(s),n.reverse?(s.reverse(),a.start=a.max,a.end=a.min):(a.start=a.min,a.end=a.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],46:[function(t,e,a){"use strict";e.exports=function(t){var e=t.helpers,a={position:"left",ticks:{callback:t.Ticks.formatters.logarithmic}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return u?t.xAxisID===a.id:t.yAxisID===a.id}var a=this,i=a.options,n=i.ticks,o=a.chart,r=o.data,s=r.datasets,l=e.getValueOrDefault,u=a.isHorizontal();a.min=null,a.max=null,a.minNotZero=null;var d=i.stacked;if(void 0===d&&e.each(s,function(e,a){if(!d){var i=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(s,function(n,r){var s=o.getDatasetMeta(r),l=[s.type,void 0===i.stacked&&void 0===s.stack?r:"",s.stack].join(".");o.isDatasetVisible(r)&&t(s)&&(void 0===c[l]&&(c[l]=[]),e.each(n.data,function(t,e){var n=c[l],o=+a.getRightValue(t);isNaN(o)||s.data[e].hidden||(n[e]=n[e]||0,i.relativePoints?n[e]=100:n[e]+=o)}))}),e.each(c,function(t){var i=e.min(t),n=e.max(t);a.min=null===a.min?i:Math.min(a.min,i),a.max=null===a.max?n:Math.max(a.max,n)})}else e.each(s,function(i,n){var r=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(r)&&e.each(i.data,function(t,e){var i=+a.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===a.min?a.min=i:ia.max&&(a.max=i),0!==i&&(null===a.minNotZero||in?{start:e-a-5,end:e}:{start:e,end:e+a+5}}function o(t){var o,r,s,l=a(t),u=Math.min(t.height/2,t.width/2),d={l:t.width,r:0,t:t.height,b:0},c={};t.ctx.font=l.font,t._pointLabelSizes=[];var h=e(t);for(o=0;od.r&&(d.r=m.end,c.r=g),v.startd.b&&(d.b=v.end,c.b=g)}t.setReductions(u,d,c)}function r(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function s(t){return 0===t||180===t?"center":t<180?"left":"right"}function l(t,e,a,i){if(f.isArray(e))for(var n=a.y,o=1.5*i,r=0;r270||t<90)&&(a.y-=e.h)}function d(t){var i=t.ctx,n=f.getValueOrDefault,o=t.options,r=o.angleLines,d=o.pointLabels;i.lineWidth=r.lineWidth,i.strokeStyle=r.color;var c=t.getDistanceFromCenterForValue(o.reverse?t.min:t.max),h=a(t);i.textBaseline="top";for(var p=e(t)-1;p>=0;p--){if(r.display){var m=t.getPointPosition(p,c);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(m.x,m.y),i.stroke(),i.closePath()}var v=t.getPointPosition(p,c+5),b=n(d.fontColor,g.defaultFontColor);i.font=h.font,i.fillStyle=b;var x=t.getIndexAngle(p),y=f.toDegrees(x);i.textAlign=s(y),u(y,t._pointLabelSizes[p],v),l(i,t.pointLabels[p]||"",v,h.size)}}function c(t,a,i,n){var o=t.ctx;if(o.strokeStyle=f.getValueAtIndexOrDefault(a.color,n-1),o.lineWidth=f.getValueAtIndexOrDefault(a.lineWidth,n-1),t.options.lineArc)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var r=e(t);if(0===r)return;o.beginPath();var s=t.getPointPosition(0,i);o.moveTo(s.x,s.y);for(var l=1;l0&&a>0?e:0)},draw:function(){var t=this,e=t.options,a=e.gridLines,i=e.ticks,n=f.getValueOrDefault;if(e.display){var o=t.ctx,r=n(i.fontSize,g.defaultFontSize),s=n(i.fontStyle,g.defaultFontStyle),l=n(i.fontFamily,g.defaultFontFamily),u=f.fontString(r,s,l);f.each(t.ticks,function(s,l){if(l>0||e.reverse){var d=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),h=t.yCenter-d;if(a.display&&0!==l&&c(t,a,d,l),i.display){var f=n(i.fontColor,g.defaultFontColor);if(o.font=u,i.showLabelBackdrop){var p=o.measureText(s).width;o.fillStyle=i.backdropColor,o.fillRect(t.xCenter-p/2-i.backdropPaddingX,h-r/2-i.backdropPaddingY,p+2*i.backdropPaddingX,r+2*i.backdropPaddingY)}o.textAlign="center",o.textBaseline="middle",o.fillStyle=f,o.fillText(s,t.xCenter,h)}}}),e.lineArc||d(t)}}});t.scaleService.registerScaleType("radialLinear",m,p)}},{}],48:[function(t,e,a){"use strict";var i=t(1);i="function"==typeof i?i:window.moment,e.exports=function(t){var e=t.helpers,a={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},n={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},o=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return null===t||null===e?null:"undefined"!=typeof this.labelMoments[t]?this.labelMoments[t][e]:null},getLabelDiff:function(t,e){var a=this;return null===t||null===e?null:(void 0===a.labelDiffs&&a.buildLabelDiffs(),"undefined"!=typeof a.labelDiffs[t]?a.labelDiffs[t][e]:null)},getMomentStartOf:function(t){var e=this;return"week"===e.options.time.unit&&e.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(e.options.time.isoWeekday):t.clone().startOf(e.tickUnit)},determineDataLimits:function(){var t=this;t.labelMoments=[];var a=[];t.chart.data.labels&&t.chart.data.labels.length>0?(e.each(t.chart.data.labels,function(e){var i=t.parseTime(e);i.isValid()&&(t.options.time.round&&i.startOf(t.options.time.round),a.push(i))},t),t.firstTick=i.min.call(t,a),t.lastTick=i.max.call(t,a)):(t.firstTick=null,t.lastTick=null),e.each(t.chart.data.datasets,function(n,o){var r=[],s=t.chart.isDatasetVisible(o);"object"==typeof n.data[0]&&null!==n.data[0]?e.each(n.data,function(e){var a=t.parseTime(t.getRightValue(e));a.isValid()&&(t.options.time.round&&a.startOf(t.options.time.round),r.push(a),s&&(t.firstTick=null!==t.firstTick?i.min(t.firstTick,a):a,t.lastTick=null!==t.lastTick?i.max(t.lastTick,a):a))},t):r=a,t.labelMoments.push(r)},t),t.options.time.min&&(t.firstTick=t.parseTime(t.options.time.min)),t.options.time.max&&(t.lastTick=t.parseTime(t.options.time.max)),t.firstTick=(t.firstTick||i()).clone(),t.lastTick=(t.lastTick||i()).clone()},buildLabelDiffs:function(){var t=this;t.labelDiffs=[];var a=[];t.chart.data.labels&&t.chart.data.labels.length>0&&e.each(t.chart.data.labels,function(e){var i=t.parseTime(e);i.isValid()&&(t.options.time.round&&i.startOf(t.options.time.round),a.push(i.diff(t.firstTick,t.tickUnit,!0)))},t),e.each(t.chart.data.datasets,function(i){var n=[];"object"==typeof i.data[0]&&null!==i.data[0]?e.each(i.data,function(e){var a=t.parseTime(t.getRightValue(e));a.isValid()&&(t.options.time.round&&a.startOf(t.options.time.round),n.push(a.diff(t.firstTick,t.tickUnit,!0)))},t):n=a,t.labelDiffs.push(n)},t)},buildTicks:function(){var i=this;i.ctx.save();var n=e.getValueOrDefault(i.options.ticks.fontSize,t.defaults.global.defaultFontSize),o=e.getValueOrDefault(i.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),r=e.getValueOrDefault(i.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),s=e.fontString(n,o,r);if(i.ctx.font=s,i.ticks=[],i.unitScale=1,i.scaleSizeInUnits=0,i.options.time.unit)i.tickUnit=i.options.time.unit||"day",i.displayFormat=i.options.time.displayFormats[i.tickUnit],i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0),i.unitScale=e.getValueOrDefault(i.options.time.unitStepSize,1);else{var l=i.isHorizontal()?i.width:i.height,u=i.tickFormatFunction(i.firstTick,0,[]),d=i.ctx.measureText(u).width,c=Math.cos(e.toRadians(i.options.ticks.maxRotation)),h=Math.sin(e.toRadians(i.options.ticks.maxRotation));d=d*c+n*h;var f=l/d;i.tickUnit=i.options.time.minUnit,i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0),i.displayFormat=i.options.time.displayFormats[i.tickUnit];for(var g=0,p=a.units[g];g=Math.ceil(i.scaleSizeInUnits/f)){i.unitScale=e.getValueOrDefault(i.options.time.unitStepSize,p.steps[m]);break}break}if(p.maxStep===!1||Math.ceil(i.scaleSizeInUnits/f)=0&&(i.lastTick=y),i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0)}i.options.time.displayFormat&&(i.displayFormat=i.options.time.displayFormat),i.ticks.push(i.firstTick.clone());for(var S=i.unitScale;S<=i.scaleSizeInUnits;S+=i.unitScale){var M=x.clone().add(S,i.tickUnit);if(i.options.time.max&&M.diff(i.lastTick,i.tickUnit,!0)>=0)break;i.ticks.push(M)}var w=i.ticks[i.ticks.length-1].diff(i.lastTick,i.tickUnit);0===w&&0!==i.scaleSizeInUnits||(i.options.time.max?(i.ticks.push(i.lastTick.clone()),i.scaleSizeInUnits=i.lastTick.diff(i.ticks[0],i.tickUnit,!0)):(i.ticks.push(i.lastTick.clone()),i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0))),i.ctx.restore(),i.labelDiffs=void 0},getLabelForIndex:function(t,e){var a=this,i=a.chart.data.labels&&t_('Centoswebpanel.manage.module_rows_heading.name'); ?>
_('Centoswebpanel.manage.module_rows_heading.hostname'); ?>
_('Centoswebpanel.manage.module_rows_heading.accounts'); ?>
- _('Centoswebpanel.manage.module_rows_heading.options'); ?>
+ _('Centoswebpanel.manage.module_rows_heading.options'); ?>
+ _('Centoswebpanel.client.cwp_session'); ?>
rows[$i]->meta->server_name) ? $this->Html->safe($module->rows[$i]->meta->server_name) : null); ?>
rows[$i]->meta->host_name) ? $this->Html->safe($module->rows[$i]->meta->host_name) : null); ?>
_('Centoswebpanel.manage.module_rows.count', false, (isset($module->rows[$i]->meta->account_count) ? $module->rows[$i]->meta->account_count : 0), ((isset($module->rows[$i]->meta->account_limit) ? $module->rows[$i]->meta->account_limit : null) == '' ? '∞' : $module->rows[$i]->meta->account_limit)); ?>
-
+
_('Centoswebpanel.manage.module_rows.edit'); ?>
Form->create($this->base_uri . 'settings/company/modules/deleterow/');
@@ -41,6 +42,18 @@
Form->end(); ?>
+
+ Form->create($this->Html->safe('https://' . (isset($module->rows[$i]->meta->host_name) ? $module->rows[$i]->meta->host_name : null) . ':2031/login/index.php'), ['target' => '_blank']);
+ $this->Form->fieldHidden('username', 'root');
+ $this->Form->fieldHidden('password', (isset($module->rows[$i]->meta->server_pass) ? $module->rows[$i]->meta->server_pass : null));
+ $this->Form->fieldHidden('commit', 'Login');
+ ?>
+ _('Centoswebpanel.client.logn'); ?>
+ Form->end();
+ ?>
+
@@ -106,6 +119,20 @@
\ No newline at end of file
+
diff --git a/views/default/tab_client_actions.pdt b/views/default/tab_client_actions.pdt
new file mode 100644
index 0000000..0cac7a6
--- /dev/null
+++ b/views/default/tab_client_actions.pdt
@@ -0,0 +1,438 @@
+
+
+
+account_info->db_used;
+$db_max = $account_info->account_info->db_max;
+$bandwidth_used = round($account_info->account_info->bandwidth_used);
+$bandwidth = $account_info->account_info->bandwidth;
+$ftp_accounts_used = $account_info->account_info->ftp_accounts_used;
+$ftp_accounts = $account_info->account_info->ftp_accounts;
+$email_accounts_used = $account_info->account_info->email_accounts_used;
+$email_accounts = $account_info->account_info->email_accounts;
+$sub_domains_used = $account_info->account_info->sub_domains_used;
+$sub_domains = $account_info->account_info->sub_domains;
+$addons_domains_used = $account_info->account_info->addons_domains_used;
+$addons_domains = $account_info->account_info->addons_domains - 1;
+$space_usage = $account_info->account_info->space_usage;
+$space_disk = $account_info->account_info->space_disk;
+?>
+
+
+
+
+
+
_('Centoswebpanel.client.domaininfo'); ?>
+
+
+
+
+
+ _('Centoswebpanel.client.domain'); ?> Html->safe($cwp_details['domain']) : null); ?>
+ _('Centoswebpanel.client.status'); ?> Html->safe($cwp_details['status']) : null); ?>
+
+
+ _('Centoswebpanel.client.backup'); ?> Html->safe($cwp_details['backup']) : null); ?>
+ _('Centoswebpanel.client.type'); ?> Html->safe($cwp_details['reseller']) : null); ?>
+
+
+ _('Centoswebpanel.client.package'); ?> Html->safe($cwp_details['package_name']) : null); ?>
+ _('Centoswebpanel.client.ip'); ?> Html->safe($cwp_details['ip_address']) : null); ?>
+
+
+ _('Centoswebpanel.service_info.username'); ?> Html->safe($cwp_details['username']) : null); ?>
+ _('Centoswebpanel.service_info.password'); ?> centoswebpanel_password) ? $this->Html->safe($service_fields->centoswebpanel_password) : null); ?>
+
+
+ _('Centoswebpanel.client.name_server'); ?>
+
+ meta->name_servers;
+ if (is_array($nameServers) && !empty($nameServers)) {
+ foreach ($nameServers as $server) {
+ echo $server . ' ';
+ }
+ }
+ ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
_('Centoswebpanel.client.planstatus'); ?>
+
+
+
+
+
+
_('Centoswebpanel.client.mysql'); ?> /
+
+
+
+
_('Centoswebpanel.client.email'); ?> /
+
+
+
+
_('Centoswebpanel.client.domains'); ?> /
+
+
+
+
_('Centoswebpanel.client.subdomains'); ?> /
+
+
+
+
_('Centoswebpanel.client.ftp'); ?> /
+
+
+
+
_('Centoswebpanel.client.bandwidth'); ?> / _('Centoswebpanel.client.MB'); ?>
+
+
+
+
+
+
+
+
+
+
+
+
_('Centoswebpanel.client.quickactions'); ?>
+
+
+
+ [
+ 'icon' => 'cwp_session.png',
+ 'translation_key' => 'Centoswebpanel.client.cwp_session'
+ ],
+ 'mysql_session' => [
+ 'icon' => 'mysql_session.png',
+ 'translation_key' => 'Centoswebpanel.client.mysql_session'
+ ],
+ 'domain_session' => [
+ 'icon' => 'domain_session.png',
+ 'translation_key' => 'Centoswebpanel.client.domain_session'
+ ]
+ ];
+
+ foreach ($sessions as $session_key => $session_info) {
+ if (isset($cwp_details[$session_key])) {
+ ?>
+
+
+
+ _($session_info['translation_key']); ?>
+
+
+
+
+
+ _('Centoswebpanel.client.webmail'); ?>
+
+
+
+
+
+
+
+ [
+ 'icon' => 'crontab_session.png',
+ 'translation_key' => 'Centoswebpanel.client.crontab_session'
+ ],
+ 'phpini_session' => [
+ 'icon' => 'phpini_session.png',
+ 'translation_key' => 'Centoswebpanel.client.phpini_session'
+ ],
+ 'phpselector_session' => [
+ 'icon' => 'phpselector_session.png',
+ 'translation_key' => 'Centoswebpanel.client.phpselector_session'
+ ],
+ 'notification_session' => [
+ 'icon' => 'notification_session.png',
+ 'translation_key' => 'Centoswebpanel.client.notification_session'
+ ]
+ ];
+
+ foreach ($sessions as $session_key => $session_info) {
+ if (isset($cwp_details[$session_key])) {
+ ?>
+
+
+
+ _($session_info['translation_key']); ?>
+
+
+
+
+
+
+
+
+ [
+ 'icon' => 'modsec_session.png',
+ 'translation_key' => 'Centoswebpanel.client.modsec_session'
+ ],
+ 'statistics_session' => [
+ 'icon' => 'statistics_session.png',
+ 'translation_key' => 'Centoswebpanel.client.statistics_session'
+ ],
+ 'ftp_session' => [
+ 'icon' => 'ftp_session.png',
+ 'translation_key' => 'Centoswebpanel.client.ftp_session'
+ ],
+ 'backups_session' => [
+ 'icon' => 'backups_session.png',
+ 'translation_key' => 'Centoswebpanel.client.backups_session'
+ ]
+ ];
+
+ foreach ($sessions as $session_key => $session_info) {
+ if (isset($cwp_details[$session_key])) {
+ ?>
+
+
+
+ _($session_info['translation_key']); ?>
+
+
+
+
+
+
+
+
+ [
+ 'icon' => 'pd_session.png',
+ 'translation_key' => 'Centoswebpanel.client.pd_session'
+ ],
+ 'du_session' => [
+ 'icon' => 'du_session.png',
+ 'translation_key' => 'Centoswebpanel.client.du_session'
+ ],
+ 'logs_session' => [
+ 'icon' => 'logs_session.png',
+ 'translation_key' => 'Centoswebpanel.client.logs_session'
+ ],
+ 'faperm_session' => [
+ 'icon' => 'faperm_session.png',
+ 'translation_key' => 'Centoswebpanel.client.faperm_session'
+ ]
+ ];
+
+ foreach ($sessions as $session_key => $session_info) {
+ if (isset($cwp_details[$session_key])) {
+ ?>
+
+
+
+ _($session_info['translation_key']); ?>
+
+
+
+
+
+
+
+
+ [
+ 'icon' => 'clam_session.png',
+ 'translation_key' => 'Centoswebpanel.client.clam_session'
+ ],
+ 'subdomains_session' => [
+ 'icon' => 'subdomains_session.png',
+ 'translation_key' => 'Centoswebpanel.client.subdomains_session'
+ ],
+ 'ssl_session' => [
+ 'icon' => 'ssl_session.png',
+ 'translation_key' => 'Centoswebpanel.client.ssl_session'
+ ],
+ 'redirect_session' => [
+ 'icon' => 'redirect_session.png',
+ 'translation_key' => 'Centoswebpanel.client.redirect_session'
+ ]
+ ];
+
+ foreach ($sessions as $session_key => $session_info) {
+ if (isset($cwp_details[$session_key])) {
+ ?>
+
+
+
+ _($session_info['translation_key']); ?>
+
+
+
+
+
+
+
+
+ [
+ 'icon' => 'email.png',
+ 'translation_key' => 'Centoswebpanel.client.eacc_session'
+ ],
+ 'eforwarder_session' => [
+ 'icon' => 'email-forwarders.png',
+ 'translation_key' => 'Centoswebpanel.client.eforwarder_session'
+ ],
+ 'eautoreply_session' => [
+ 'icon' => 'email-auto-reply.png',
+ 'translation_key' => 'Centoswebpanel.client.eautoreply_session'
+ ],
+ 'efilters_session' => [
+ 'icon' => 'email-filters.png',
+ 'translation_key' => 'Centoswebpanel.client.efilters_session'
+ ]
+ ];
+
+ foreach ($sessions as $session_key => $session_info) {
+ if (isset($cwp_details[$session_key])) {
+ ?>
+
+
+
+ _($session_info['translation_key']); ?>
+
+
+
+
+
+
+
+
+ [
+ 'icon' => 'email-routing.png',
+ 'translation_key' => 'Centoswebpanel.client.erouting_session'
+ ],
+ 'eimporter_session' => [
+ 'icon' => 'email-importer.png',
+ 'translation_key' => 'Centoswebpanel.client.eimporter_session'
+ ],
+ 'dns_session' => [
+ 'icon' => 'dns_session.png',
+ 'translation_key' => 'Centoswebpanel.client.dns_session'
+ ],
+ 'script_session' => [
+ 'icon' => 'script_session.png',
+ 'translation_key' => 'Centoswebpanel.client.script_session'
+ ]
+ ];
+
+ foreach ($sessions as $session_key => $session_info) {
+ if (isset($cwp_details[$session_key])) {
+ ?>
+
+
+
+ _($session_info['translation_key']); ?>
+
+
+
+
+
+
+
+
+
+