diff --git a/.gitfox/lint.yaml b/.gitfox/lint.yaml index 318f4d8ff9..abf897e7cc 100644 --- a/.gitfox/lint.yaml +++ b/.gitfox/lint.yaml @@ -39,7 +39,7 @@ spec: type: run spec: container: - image: hub.zentao.net/ci/zentao-package:master + image: hub.zentao.net/ci/zentao-package:master-250527 script: - DOWNGRADE_CODE_DIR=$(mktemp -d) - mkdir $DOWNGRADE_CODE_DIR/diff diff --git a/.gitfox/unittestcheck.yaml b/.gitfox/unittestcheck.yaml index 1c4e410496..03f1b4cb0a 100644 --- a/.gitfox/unittestcheck.yaml +++ b/.gitfox/unittestcheck.yaml @@ -18,7 +18,13 @@ spec: - DOWNGRADE_GIT_REPO=$(jq -r .pkg.downgrade.gitRepo < ci.json) - DOWNGRADE_EXT_GIT_REPO=$(jq -r .pkg.downgradeExt.gitRepo < ci.json) + - EXT_BRANCH=$(jq -r .pkg.zentaoext.gitVersion < ci.json) + - MAX_BRANCH=$(jq -r .pkg.zentaomax.gitVersion < ci.json) + - IPD_BRANCH=$(jq -r .pkg.zentaoipd.gitVersion < ci.json) - echo "XUANVERSION=${XUANVERSION}" >> $GITFOX_CUSTOM_ENV + - echo "EXT_BRANCH=${EXT_BRANCH}" >> $GITFOX_CUSTOM_ENV + - echo "MAX_BRANCH=${MAX_BRANCH}" >> $GITFOX_CUSTOM_ENV + - echo "IPD_BRANCH=${IPD_BRANCH}" >> $GITFOX_CUSTOM_ENV - echo "export ZENTAOEXT_GIT_REPO=${ZENTAOEXT_GIT_REPO}" >> $GITFOX_CUSTOM_ENV - echo "export DOWNGRADE_GIT_REPO=${DOWNGRADE_GIT_REPO}" >> @@ -42,12 +48,12 @@ spec: script: - git clone -q http://${GITFOX_SERVER}/git/xuan/xuanxuan.git xuansrc && cd xuansrc && git checkout $XUANVERSION && cd - - - git clone --depth 1 -q + - git clone --depth 1 -q -b ${EXT_BRANCH} http://${GITFOX_SERVER}/git/${ZENTAOEXT_GIT_REPO}.git zentaoext - - git clone --depth 1 + - git clone --depth 1 -b ${MAX_BRANCH} http://${GITFOX_SERVER}/git/zentao/zentaomax.git zentaomax - - git clone --depth 1 + - git clone --depth 1 -b ${IPD_BRANCH} http://${GITFOX_SERVER}/git/zentao/zentaoipd.git zentaoipd - name: 版本变量设定 type: run @@ -101,15 +107,13 @@ spec: -f misc/ci/Dockerfile.test . - name: unit test type: run - when: | - build.target == "main" spec: envs: MYSQL_INTERNAL: "true" container: image: hub.qc.oop.cc/zentao-ztf:${{ build.number }}-${{ build.after }} script: - - git rev-list $(git rev-parse origin/main )..$(git rev-parse HEAD) + - git rev-list $(git rev-parse origin/$GITFOX_TARGET_BRANCH)..$(git rev-parse HEAD) - sh -c 'nohup /usr/bin/entrypoint.sh >/dev/null 2>&1 &' - . /etc/s6/s6-init/envs - sleep 5 diff --git a/.gitfox/unittestforcommitid.yaml b/.gitfox/unittestforcommitid.yaml index cd6799e728..894f511527 100644 --- a/.gitfox/unittestforcommitid.yaml +++ b/.gitfox/unittestforcommitid.yaml @@ -26,15 +26,13 @@ spec: - docker buildx build --pull --push --platform linux/amd64 --build-arg VERSION=${ZENTAO_VERSION} --build-arg MIRROR=true -t hub.qc.oop.cc/zentao-ztf:${GITFOX_BUILD_NUMBER}-${GITFOX_COMMIT} -f misc/ci/Dockerfile.test . - name: unit test type: run - when: | - build.target == "main" spec: envs: MYSQL_INTERNAL: "true" container: image: hub.qc.oop.cc/zentao-ztf:${{ build.number }}-${{ build.after }} script: - - git rev-list $(git rev-parse origin/main )..$(git rev-parse HEAD) + - git rev-list $(git rev-parse origin/$GITFOX_TARGET_BRANCH )..$(git rev-parse HEAD) - sh -c 'nohup /usr/bin/entrypoint.sh >/dev/null 2>&1 &' - . /etc/s6/s6-init/envs - sleep 5 diff --git a/VERSION b/VERSION index 2a813a8652..328328a48d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -21.7 \ No newline at end of file +21.7.1 diff --git a/api/v1/entries/testresults.php b/api/v1/entries/testresults.php index a915d33511..cc570e834b 100644 --- a/api/v1/entries/testresults.php +++ b/api/v1/entries/testresults.php @@ -84,7 +84,7 @@ class testresultsEntry extends entry $reals[$stepID] = $step->real; } $this->setPost('result', $results); - $this->setPost('reals', $reals); + $this->setPost('real', $reals); } $control->runCase($runID, $caseID, $version); diff --git a/ci.json b/ci.json index ee64caeac2..c07e0e66df 100644 --- a/ci.json +++ b/ci.json @@ -6,13 +6,13 @@ }, "zentaoext": { "gitRepo": "zentao/zentaoext", - "gitVersion": "patch/11.7" + "gitVersion": "release/12.0" }, "zentaomax": { - "gitVersion": "patch/6.7" + "gitVersion": "release/7.0" }, "zentaoipd": { - "gitVersion": "patch/3.7" + "gitVersion": "release/4.0" }, "devops": { "gitRepo": "zentao/devops" diff --git a/config/config.php b/config/config.php index 682acf0585..0486149295 100644 --- a/config/config.php +++ b/config/config.php @@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}} if(!function_exists('getWebRoot')){function getWebRoot(){}} /* 基本设置。Basic settings. */ -$config->version = '21.7'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. +$config->version = '21.7.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it. $config->liteVersion = '1.2'; // 迅捷版版本。 The version of Lite. $config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP. $config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time. diff --git a/config/zentaopms.php b/config/zentaopms.php index 7f6d012c62..97041891c9 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -429,6 +429,7 @@ define('TABLE_ACL', '`' . $config->db->prefix . 'acl`'); define('TABLE_DESIGN', '`' . $config->db->prefix . 'design`'); define('TABLE_DESIGNSPEC', '`' . $config->db->prefix . 'designspec`'); +define('TABLE_DELIVERABLE', '`' . $config->db->prefix . 'deliverable`'); define('TABLE_DOCLIB', '`' . $config->db->prefix . 'doclib`'); define('TABLE_DOC', '`' . $config->db->prefix . 'doc`'); define('TABLE_DOCBLOCK', '`' . $config->db->prefix . 'docblock`'); @@ -672,6 +673,7 @@ $config->objectTables['demand'] = TABLE_DEMAND; $config->objectTables['demandpool'] = TABLE_DEMANDPOOL; $config->objectTables['demandspec'] = TABLE_DEMANDSPEC; $config->objectTables['demandreview'] = TABLE_DEMANDREVIEW; +$config->objectTables['deliverable'] = TABLE_DELIVERABLE; $config->objectTables['todo'] = TABLE_TODO; $config->objectTables['custom'] = TABLE_LANG; $config->objectTables['branch'] = TABLE_BRANCH; diff --git a/db/demo.sql b/db/demo.sql index 73027466c9..302ade2ed0 100644 --- a/db/demo.sql +++ b/db/demo.sql @@ -578,7 +578,8 @@ REPLACE INTO `zt_searchdict` (`key`, `value`) VALUES (39564, '验'), (39588, '骤'), (65292, ','); -REPLACE INTO `zt_searchindex` (`id`, `vision`, `objectType`, `objectID`, `title`, `content`, `addedDate`, `editedDate`) VALUES +TRUNCATE TABLE `zt_searchindex`; +INSERT INTO `zt_searchindex` (`id`, `vision`, `objectType`, `objectID`, `title`, `content`, `addedDate`, `editedDate`) VALUES (1, 'rnd', 'program', 1, ' 20225 19994 31649 29702', '', '2024-04-02 14:25:12', '2024-04-02 14:25:12'), (2, 'rnd', 'product', 1, ' 20844 21496 20225 19994 32593 31449 24314 35774', ' 24314 31435 20844 21496 20225 19994 32593 31449 65292 21487 20197 26356 22909 23545 22806 23637 31034 12290', '2024-04-02 14:30:13', '2024-04-02 14:30:13'), (3, 'rnd', 'product', 2, ' 20225 19994 20869 37096 24037 26102 31649 29702 31995 32479', '', '2024-04-02 14:30:55', '2024-04-02 14:30:55'), diff --git a/db/endemo.sql b/db/endemo.sql index 906cdc4be1..0ae568f0c4 100644 --- a/db/endemo.sql +++ b/db/endemo.sql @@ -577,7 +577,8 @@ REPLACE INTO `zt_searchdict` (`key`, `value`) VALUES (39564, '验'), (39588, '骤'), (65292, ','); -REPLACE INTO `zt_searchindex` (`id`, `vision`, `objectType`, `objectID`, `title`, `content`, `addedDate`, `editedDate`) VALUES +TRUNCATE TABLE `zt_searchindex`; +INSERT INTO `zt_searchindex` (`id`, `vision`, `objectType`, `objectID`, `title`, `content`, `addedDate`, `editedDate`) VALUES (1, 'rnd', 'program', 1, ' 20225 19994 31649 29702', '', '2024-04-02 14:25:12', '2024-04-02 14:25:12'), (2, 'rnd', 'product', 1, ' 20844 21496 20225 19994 32593 31449 24314 35774', ' 24314 31435 20844 21496 20225 19994 32593 31449 65292 21487 20197 26356 22909 23545 22806 23637 31034 12290', '2024-04-02 14:30:13', '2024-04-02 14:30:13'), (3, 'rnd', 'product', 2, ' 20225 19994 20869 37096 24037 26102 31649 29702 31995 32479', '', '2024-04-02 14:30:55', '2024-04-02 14:30:55'), diff --git a/db/standard/zentao21.7.1.sql b/db/standard/zentao21.7.1.sql new file mode 100644 index 0000000000..5d92c6b88e --- /dev/null +++ b/db/standard/zentao21.7.1.sql @@ -0,0 +1,4318 @@ +CREATE TABLE `zt_acl` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `objectType` char(30) NOT NULL DEFAULT '', + `objectID` mediumint(9) NOT NULL DEFAULT 0, + `type` char(40) NOT NULL DEFAULT 'whitelist', + `source` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_action` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` text DEFAULT NULL, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `actor` varchar(100) NOT NULL DEFAULT '', + `action` varchar(80) NOT NULL DEFAULT '', + `date` datetime DEFAULT NULL, + `comment` text DEFAULT NULL, + `files` text DEFAULT NULL, + `extra` text DEFAULT NULL, + `read` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `efforted` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `actor` (`actor`), + KEY `project` (`project`), + KEY `action` (`action`), + KEY `objectID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_actionrecent` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` text DEFAULT NULL, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `actor` varchar(100) NOT NULL DEFAULT '', + `action` varchar(80) NOT NULL DEFAULT '', + `date` datetime DEFAULT NULL, + `comment` text DEFAULT NULL, + `files` text DEFAULT NULL, + `extra` text DEFAULT NULL, + `read` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `efforted` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `date` (`date`), + KEY `actor` (`actor`), + KEY `project` (`project`), + KEY `action` (`action`), + KEY `objectID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_activity` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `process` mediumint(9) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `optional` varchar(255) NOT NULL DEFAULT '', + `tailorNorm` varchar(255) NOT NULL DEFAULT '', + `content` mediumtext DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `order` mediumint(8) DEFAULT 0, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_ai_assistant` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) NOT NULL, + `modelId` mediumint(8) unsigned NOT NULL, + `desc` text NOT NULL, + `systemMessage` text NOT NULL, + `greetings` text NOT NULL, + `icon` varchar(30) NOT NULL DEFAULT 'coding-1', + `enabled` enum('0','1') NOT NULL DEFAULT '1', + `createdDate` datetime NOT NULL, + `publishedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_ai_message` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `appID` mediumint(8) unsigned NOT NULL, + `user` mediumint(8) unsigned NOT NULL, + `type` enum('req','res','ntf') NOT NULL, + `content` text NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE `zt_ai_miniprogram` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) NOT NULL, + `category` varchar(30) NOT NULL, + `desc` text DEFAULT NULL, + `model` mediumint(8) unsigned DEFAULT NULL, + `icon` varchar(30) NOT NULL DEFAULT 'writinghand-7', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) NOT NULL, + `editedDate` datetime NOT NULL, + `published` enum('0','1') NOT NULL DEFAULT '0', + `publishedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `prompt` text NOT NULL, + `builtIn` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE `zt_ai_miniprogramfield` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `appID` mediumint(8) unsigned NOT NULL, + `name` varchar(30) NOT NULL, + `type` enum('radio','checkbox','text','textarea') DEFAULT 'text', + `placeholder` text DEFAULT NULL, + `options` text DEFAULT NULL, + `required` enum('0','1') DEFAULT '1', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE `zt_ai_miniprogramstar` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `appID` mediumint(8) unsigned NOT NULL, + `userID` mediumint(8) unsigned NOT NULL, + `createdDate` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `appID` (`appID`,`userID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE `zt_ai_model` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(20) NOT NULL, + `vendor` varchar(20) NOT NULL, + `credentials` text NOT NULL, + `proxy` text DEFAULT NULL, + `name` varchar(20) DEFAULT NULL, + `desc` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) DEFAULT NULL, + `editedDate` datetime DEFAULT NULL, + `enabled` enum('0','1') NOT NULL DEFAULT '1', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_ai_prompt` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(20) NOT NULL, + `desc` text DEFAULT NULL, + `model` mediumint(8) unsigned DEFAULT NULL, + `module` varchar(30) DEFAULT NULL, + `source` text DEFAULT NULL, + `targetForm` varchar(30) DEFAULT NULL, + `purpose` text DEFAULT NULL, + `elaboration` text DEFAULT NULL, + `role` text DEFAULT NULL, + `characterization` text DEFAULT NULL, + `status` enum('draft','active') NOT NULL DEFAULT 'draft', + `createdBy` varchar(30) NOT NULL, + `createdDate` datetime NOT NULL, + `editedBy` varchar(30) DEFAULT NULL, + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_ai_promptrole` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) DEFAULT NULL, + `desc` text DEFAULT NULL, + `model` mediumint(8) unsigned DEFAULT NULL, + `role` text DEFAULT NULL, + `characterization` text DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_api` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `product` varchar(255) NOT NULL DEFAULT '', + `lib` int(11) unsigned NOT NULL DEFAULT 0, + `module` int(11) unsigned NOT NULL DEFAULT 0, + `title` varchar(100) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `protocol` varchar(10) NOT NULL DEFAULT '', + `method` varchar(10) NOT NULL DEFAULT '', + `requestType` varchar(100) NOT NULL DEFAULT '', + `responseType` varchar(100) NOT NULL DEFAULT '', + `status` varchar(20) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL DEFAULT '0', + `desc` mediumtext DEFAULT NULL, + `version` smallint(6) unsigned NOT NULL DEFAULT 0, + `params` text DEFAULT NULL, + `paramsExample` text DEFAULT NULL, + `responseExample` text DEFAULT NULL, + `response` text DEFAULT NULL, + `commonParams` text DEFAULT NULL, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_api_lib_release` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `lib` int(11) unsigned NOT NULL DEFAULT 0, + `desc` varchar(255) NOT NULL DEFAULT '', + `version` varchar(255) NOT NULL DEFAULT '', + `snap` mediumtext DEFAULT NULL, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_apispec` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `doc` int(11) unsigned NOT NULL DEFAULT 0, + `module` int(11) unsigned NOT NULL DEFAULT 0, + `title` varchar(100) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `protocol` varchar(10) NOT NULL DEFAULT '', + `method` varchar(10) NOT NULL DEFAULT '', + `requestType` varchar(100) NOT NULL DEFAULT '', + `responseType` varchar(100) NOT NULL DEFAULT '', + `status` varchar(20) NOT NULL DEFAULT '', + `owner` varchar(255) NOT NULL DEFAULT '0', + `desc` mediumtext DEFAULT NULL, + `version` smallint(6) unsigned NOT NULL DEFAULT 0, + `params` text DEFAULT NULL, + `paramsExample` text DEFAULT NULL, + `responseExample` text DEFAULT NULL, + `response` text DEFAULT NULL, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_apistruct` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `lib` int(11) unsigned NOT NULL DEFAULT 0, + `name` varchar(30) NOT NULL DEFAULT '', + `type` varchar(50) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `version` smallint(6) unsigned NOT NULL DEFAULT 0, + `attribute` text DEFAULT NULL, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_apistruct_spec` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(50) NOT NULL DEFAULT '', + `desc` varchar(255) NOT NULL DEFAULT '', + `attribute` text DEFAULT NULL, + `version` smallint(6) unsigned NOT NULL DEFAULT 0, + `addedBy` varchar(30) NOT NULL DEFAULT '0', + `addedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_approval` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `flow` mediumint(8) NOT NULL DEFAULT 0, + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(9) NOT NULL DEFAULT 0, + `nodes` mediumtext DEFAULT NULL, + `version` mediumint(9) NOT NULL DEFAULT 0, + `status` varchar(20) NOT NULL DEFAULT 'doing', + `result` varchar(20) NOT NULL DEFAULT '', + `extra` text DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_approvalflow` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `code` varchar(100) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `version` mediumint(8) NOT NULL DEFAULT 1, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `workflow` varchar(30) NOT NULL DEFAULT '', + `deleted` tinyint(4) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_approvalflowobject` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `root` int(8) NOT NULL DEFAULT 0, + `flow` int(8) NOT NULL DEFAULT 0, + `objectType` char(30) NOT NULL DEFAULT '', + `objectID` mediumint(9) NOT NULL DEFAULT 0, + `extra` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_approvalflowspec` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `flow` mediumint(8) NOT NULL DEFAULT 0, + `version` mediumint(8) NOT NULL DEFAULT 0, + `nodes` mediumtext DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_approvalnode` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `approval` mediumint(8) NOT NULL DEFAULT 0, + `type` enum('review','cc') NOT NULL DEFAULT 'review', + `title` varchar(255) NOT NULL DEFAULT '', + `account` char(30) NOT NULL DEFAULT '', + `node` varchar(100) NOT NULL DEFAULT '', + `reviewType` varchar(100) NOT NULL DEFAULT 'manual', + `agentType` varchar(100) NOT NULL DEFAULT 'pass', + `multipleType` enum('and','or') NOT NULL DEFAULT 'and', + `percent` smallint(6) NOT NULL DEFAULT 0, + `needAll` enum('0','1') NOT NULL DEFAULT '0', + `solicit` enum('0','1') NOT NULL DEFAULT '0', + `prev` mediumtext DEFAULT NULL, + `next` mediumtext DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'wait', + `result` varchar(10) NOT NULL DEFAULT '', + `date` date DEFAULT NULL, + `opinion` mediumtext DEFAULT NULL, + `extra` mediumtext DEFAULT NULL, + `revertTo` char(30) NOT NULL DEFAULT '', + `forwardBy` char(30) NOT NULL DEFAULT '', + `reviewedBy` char(30) NOT NULL DEFAULT '', + `reviewedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_reviewed_date` (`reviewedDate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_approvalobject` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `approval` int(8) NOT NULL DEFAULT 0, + `objectType` char(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) NOT NULL DEFAULT 0, + `reviewers` text DEFAULT NULL, + `opinion` text DEFAULT NULL, + `result` varchar(10) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `appliedBy` char(30) NOT NULL DEFAULT '', + `appliedDate` datetime DEFAULT NULL, + `desc` text DEFAULT NULL, + `extra` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_approvalrole` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `code` char(30) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `users` longtext DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_artifactrepo` ( + `id` smallint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(45) NOT NULL DEFAULT '', + `products` varchar(255) NOT NULL DEFAULT '', + `serverID` smallint(8) NOT NULL DEFAULT 0, + `repoName` varchar(45) NOT NULL DEFAULT '', + `format` varchar(10) NOT NULL DEFAULT '', + `type` char(7) NOT NULL DEFAULT '', + `status` varchar(10) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` tinyint(4) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_assetlib` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_attend` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `date` date DEFAULT NULL, + `signIn` time DEFAULT NULL, + `signOut` time DEFAULT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `ip` varchar(100) NOT NULL DEFAULT '', + `device` varchar(30) NOT NULL DEFAULT '', + `client` varchar(20) NOT NULL DEFAULT '', + `manualIn` time DEFAULT NULL, + `manualOut` time DEFAULT NULL, + `reason` varchar(30) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `reviewStatus` varchar(30) DEFAULT NULL, + `reviewedBy` char(30) NOT NULL DEFAULT '', + `reviewedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `attend` (`date`,`account`), + KEY `account` (`account`), + KEY `date` (`date`), + KEY `status` (`status`), + KEY `reason` (`reason`), + KEY `reviewStatus` (`reviewStatus`), + KEY `reviewedBy` (`reviewedBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_attendstat` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `month` char(10) NOT NULL DEFAULT '', + `normal` decimal(12,2) NOT NULL DEFAULT 0.00, + `late` decimal(12,2) NOT NULL DEFAULT 0.00, + `early` decimal(12,2) NOT NULL DEFAULT 0.00, + `absent` decimal(12,2) NOT NULL DEFAULT 0.00, + `trip` decimal(12,2) NOT NULL DEFAULT 0.00, + `egress` decimal(12,2) NOT NULL DEFAULT 0.00, + `lieu` decimal(12,2) NOT NULL DEFAULT 0.00, + `paidLeave` decimal(12,2) NOT NULL DEFAULT 0.00, + `unpaidLeave` decimal(12,2) NOT NULL DEFAULT 0.00, + `timeOvertime` decimal(12,2) NOT NULL DEFAULT 0.00, + `restOvertime` decimal(12,2) NOT NULL DEFAULT 0.00, + `holidayOvertime` decimal(12,2) NOT NULL DEFAULT 0.00, + `deserve` decimal(12,2) NOT NULL DEFAULT 0.00, + `actual` decimal(12,2) NOT NULL DEFAULT 0.00, + `status` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `attend` (`month`,`account`), + KEY `account` (`account`), + KEY `month` (`month`), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_auditcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL DEFAULT 'waterfall', + `practiceArea` char(30) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT '', + `title` varchar(255) NOT NULL DEFAULT '', + `objectType` char(30) NOT NULL DEFAULT '', + `objectID` int(11) NOT NULL DEFAULT 0, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_auditplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `dateType` char(30) NOT NULL DEFAULT '', + `config` text DEFAULT NULL, + `objectID` mediumint(9) NOT NULL DEFAULT 0, + `objectType` char(30) NOT NULL DEFAULT '', + `process` mediumint(9) NOT NULL DEFAULT 0, + `processType` char(30) NOT NULL DEFAULT '', + `checkDate` date DEFAULT NULL, + `checkedBy` varchar(30) NOT NULL DEFAULT '', + `realCheckDate` date DEFAULT NULL, + `result` char(30) NOT NULL DEFAULT '', + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `checkBy` varchar(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_auditresult` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `auditplan` mediumint(8) NOT NULL DEFAULT 0, + `listID` mediumint(8) NOT NULL DEFAULT 0, + `result` char(30) NOT NULL DEFAULT '', + `checkedBy` varchar(30) NOT NULL DEFAULT '', + `checkedDate` date DEFAULT NULL, + `comment` text DEFAULT NULL, + `severity` char(30) NOT NULL DEFAULT '', + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_autocache` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `code` varchar(30) NOT NULL DEFAULT '', + `fields` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `cache` (`code`,`fields`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_automation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `node` int(11) unsigned NOT NULL DEFAULT 0, + `product` int(11) unsigned NOT NULL DEFAULT 0, + `scriptPath` varchar(255) NOT NULL DEFAULT '', + `shell` mediumtext DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_basicmeas` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `purpose` varchar(50) NOT NULL DEFAULT '', + `scope` char(30) NOT NULL DEFAULT '', + `object` char(30) NOT NULL DEFAULT '', + `name` varchar(90) NOT NULL DEFAULT '', + `code` char(30) NOT NULL DEFAULT '', + `unit` varchar(100) NOT NULL DEFAULT '', + `configure` text DEFAULT NULL, + `params` text DEFAULT NULL, + `definition` text DEFAULT NULL, + `source` varchar(255) NOT NULL DEFAULT '', + `collectType` varchar(30) NOT NULL DEFAULT '', + `collectConf` text DEFAULT NULL, + `execTime` varchar(30) NOT NULL DEFAULT '', + `collectedBy` varchar(10) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `order` mediumint(8) unsigned NOT NULL DEFAULT 0, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_block` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `dashboard` varchar(20) NOT NULL DEFAULT '', + `module` varchar(20) NOT NULL DEFAULT '', + `title` varchar(100) NOT NULL DEFAULT '', + `block` varchar(30) NOT NULL DEFAULT '', + `code` varchar(30) NOT NULL DEFAULT '', + `width` enum('1','2','3') NOT NULL DEFAULT '1', + `height` smallint(6) unsigned NOT NULL DEFAULT 3, + `left` enum('0','1','2') NOT NULL DEFAULT '0', + `top` smallint(5) unsigned NOT NULL DEFAULT 0, + `params` text DEFAULT NULL, + `hidden` tinyint(1) unsigned NOT NULL DEFAULT 0, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_branch` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `default` enum('0','1') NOT NULL DEFAULT '0', + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `desc` varchar(255) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `closedDate` date DEFAULT NULL, + `order` smallint(6) unsigned NOT NULL DEFAULT 0, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_budget` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `stage` char(30) NOT NULL DEFAULT '', + `subject` mediumint(8) NOT NULL DEFAULT 0, + `amount` char(30) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_bug` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `injection` mediumint(8) unsigned NOT NULL DEFAULT 0, + `identify` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `plan` mediumint(8) unsigned NOT NULL DEFAULT 0, + `story` mediumint(8) unsigned NOT NULL DEFAULT 0, + `storyVersion` smallint(6) NOT NULL DEFAULT 1, + `task` mediumint(8) unsigned NOT NULL DEFAULT 0, + `toTask` mediumint(8) unsigned NOT NULL DEFAULT 0, + `toStory` mediumint(8) NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `keywords` varchar(255) NOT NULL DEFAULT '', + `severity` tinyint(4) NOT NULL DEFAULT 0, + `pri` tinyint(3) unsigned NOT NULL DEFAULT 0, + `type` varchar(30) NOT NULL DEFAULT '', + `os` varchar(255) NOT NULL DEFAULT '', + `browser` varchar(255) NOT NULL DEFAULT '', + `hardware` varchar(30) NOT NULL DEFAULT '', + `found` varchar(30) NOT NULL DEFAULT '', + `steps` mediumtext DEFAULT NULL, + `status` enum('active','resolved','closed') NOT NULL DEFAULT 'active', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL DEFAULT '', + `confirmed` tinyint(1) NOT NULL DEFAULT 0, + `activatedCount` smallint(6) NOT NULL DEFAULT 0, + `activatedDate` datetime DEFAULT NULL, + `feedbackBy` varchar(100) NOT NULL DEFAULT '', + `notifyEmail` varchar(100) NOT NULL DEFAULT '', + `mailto` text DEFAULT NULL, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `openedBuild` varchar(255) NOT NULL DEFAULT '', + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deadline` date DEFAULT NULL, + `resolvedBy` varchar(30) NOT NULL DEFAULT '', + `resolution` varchar(30) NOT NULL DEFAULT '', + `resolvedBuild` varchar(30) NOT NULL DEFAULT '', + `resolvedDate` datetime DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `duplicateBug` mediumint(8) unsigned NOT NULL DEFAULT 0, + `relatedBug` varchar(255) NOT NULL DEFAULT '', + `case` mediumint(8) unsigned NOT NULL DEFAULT 0, + `caseVersion` smallint(6) NOT NULL DEFAULT 1, + `feedback` mediumint(8) unsigned NOT NULL DEFAULT 0, + `result` mediumint(8) unsigned NOT NULL DEFAULT 0, + `repo` mediumint(8) unsigned NOT NULL DEFAULT 0, + `mr` mediumint(8) unsigned NOT NULL DEFAULT 0, + `entry` text DEFAULT NULL, + `lines` varchar(10) NOT NULL DEFAULT '', + `v1` varchar(255) NOT NULL DEFAULT '', + `v2` varchar(255) NOT NULL DEFAULT '', + `repoType` varchar(30) NOT NULL DEFAULT '', + `issueKey` varchar(50) NOT NULL DEFAULT '', + `testtask` mediumint(8) unsigned NOT NULL DEFAULT 0, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`), + KEY `status` (`status`), + KEY `plan` (`plan`), + KEY `story` (`story`), + KEY `case` (`case`), + KEY `toStory` (`toStory`), + KEY `result` (`result`), + KEY `assignedTo` (`assignedTo`), + KEY `deleted` (`deleted`), + KEY `project` (`project`), + KEY `product_status_deleted` (`product`,`status`,`deleted`), + KEY `idx_repo` (`repo`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_build` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` varchar(255) NOT NULL DEFAULT '0', + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `builds` varchar(255) NOT NULL DEFAULT '', + `name` char(150) NOT NULL DEFAULT '', + `system` mediumint(8) unsigned NOT NULL DEFAULT 0, + `scmPath` char(255) NOT NULL DEFAULT '', + `filePath` char(255) NOT NULL DEFAULT '', + `date` date DEFAULT NULL, + `stories` text DEFAULT NULL, + `bugs` text DEFAULT NULL, + `artifactRepoID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `builder` char(30) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`), + KEY `idx_system` (`system`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_burn` ( + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `task` mediumint(8) unsigned NOT NULL DEFAULT 0, + `date` date NOT NULL, + `estimate` float NOT NULL DEFAULT 0, + `left` float NOT NULL DEFAULT 0, + `consumed` float NOT NULL DEFAULT 0, + `storyPoint` float NOT NULL DEFAULT 0, + UNIQUE KEY `execution_task` (`execution`,`date`,`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_case` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` mediumint(8) unsigned NOT NULL DEFAULT 0, + `lib` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` mediumint(8) unsigned NOT NULL DEFAULT 0, + `path` mediumint(8) unsigned NOT NULL DEFAULT 0, + `story` mediumint(30) unsigned NOT NULL DEFAULT 0, + `storyVersion` smallint(6) NOT NULL DEFAULT 1, + `title` varchar(255) NOT NULL DEFAULT '', + `precondition` text DEFAULT NULL, + `keywords` varchar(255) NOT NULL DEFAULT '', + `pri` tinyint(3) unsigned NOT NULL DEFAULT 3, + `type` char(30) NOT NULL DEFAULT '1', + `auto` varchar(10) NOT NULL DEFAULT 'no', + `frame` varchar(10) NOT NULL DEFAULT '', + `stage` varchar(255) NOT NULL DEFAULT '', + `howRun` varchar(30) NOT NULL DEFAULT '', + `script` longtext DEFAULT NULL, + `scriptedBy` varchar(30) NOT NULL DEFAULT '', + `scriptedDate` date DEFAULT NULL, + `scriptStatus` varchar(30) NOT NULL DEFAULT '', + `scriptLocation` varchar(255) NOT NULL DEFAULT '', + `status` char(30) NOT NULL DEFAULT '1', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL DEFAULT '', + `frequency` enum('1','2','3') NOT NULL DEFAULT '1', + `order` tinyint(30) unsigned NOT NULL DEFAULT 0, + `openedBy` char(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `reviewedBy` varchar(255) NOT NULL DEFAULT '', + `reviewedDate` date DEFAULT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `version` tinyint(3) unsigned NOT NULL DEFAULT 0, + `linkCase` varchar(255) NOT NULL DEFAULT '', + `fromBug` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fromCaseID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fromCaseVersion` mediumint(8) unsigned NOT NULL DEFAULT 1, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `lastRunner` varchar(30) NOT NULL DEFAULT '', + `lastRunDate` datetime DEFAULT NULL, + `lastRunResult` char(30) NOT NULL DEFAULT '', + `scene` int(11) NOT NULL DEFAULT 0, + `sort` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `story` (`story`), + KEY `fromBug` (`fromBug`), + KEY `module` (`module`), + KEY `scene` (`scene`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_casespec` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `case` mediumint(9) NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `precondition` text DEFAULT NULL, + `files` text DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `case` (`case`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_casestep` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `case` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` smallint(6) unsigned NOT NULL DEFAULT 0, + `type` varchar(10) NOT NULL DEFAULT 'step', + `desc` text DEFAULT NULL, + `expect` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `case` (`case`), + KEY `version` (`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_cfd` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `execution` int(8) NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT '', + `name` char(30) NOT NULL DEFAULT '', + `count` smallint(6) NOT NULL DEFAULT 0, + `date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `execution_type_name_date` (`execution`,`type`,`name`,`date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_chart` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `code` varchar(255) NOT NULL DEFAULT '', + `driver` enum('mysql','duckdb') NOT NULL DEFAULT 'mysql', + `mode` enum('text','builder') NOT NULL DEFAULT 'builder', + `dimension` mediumint(8) unsigned NOT NULL DEFAULT 0, + `type` varchar(30) NOT NULL DEFAULT '', + `group` varchar(255) NOT NULL DEFAULT '', + `dataset` varchar(30) NOT NULL DEFAULT '0', + `desc` text DEFAULT NULL, + `acl` enum('open','private') NOT NULL DEFAULT 'open', + `whitelist` text DEFAULT NULL, + `settings` mediumtext DEFAULT NULL, + `filters` mediumtext DEFAULT NULL, + `step` tinyint(3) unsigned NOT NULL DEFAULT 0, + `fields` mediumtext DEFAULT NULL, + `langs` text DEFAULT NULL, + `sql` mediumtext DEFAULT NULL, + `version` varchar(10) NOT NULL DEFAULT '1', + `stage` enum('draft','published') NOT NULL DEFAULT 'draft', + `builtin` tinyint(1) unsigned NOT NULL DEFAULT 0, + `objects` mediumtext DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_charter` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `level` varchar(255) NOT NULL DEFAULT '', + `category` char(30) NOT NULL DEFAULT '', + `market` varchar(30) NOT NULL DEFAULT '', + `check` enum('0','1') NOT NULL DEFAULT '0', + `appliedBy` char(30) NOT NULL DEFAULT '', + `appliedDate` datetime DEFAULT NULL, + `appliedReviewer` text DEFAULT NULL, + `budget` char(30) NOT NULL DEFAULT '', + `budgetUnit` char(30) NOT NULL DEFAULT '', + `product` text DEFAULT NULL, + `roadmap` text DEFAULT NULL, + `plan` text DEFAULT NULL, + `type` varchar(30) NOT NULL DEFAULT 'roadmap', + `filesConfig` text DEFAULT NULL, + `spec` mediumtext DEFAULT NULL, + `status` char(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `charterFiles` text DEFAULT NULL, + `completionFiles` text DEFAULT NULL, + `canceledFiles` text DEFAULT NULL, + `prevCanceledStatus` varchar(30) NOT NULL DEFAULT '', + `closedBy` char(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `closedReason` varchar(255) NOT NULL DEFAULT '', + `activatedBy` char(30) NOT NULL DEFAULT '', + `activatedDate` datetime DEFAULT NULL, + `activatedReviewer` text DEFAULT NULL, + `reviewedBy` varchar(255) NOT NULL DEFAULT '', + `reviewedResult` char(30) NOT NULL DEFAULT '', + `reviewedDate` datetime DEFAULT NULL, + `reviewStatus` varchar(30) NOT NULL DEFAULT 'wait', + `completedBy` varchar(30) NOT NULL DEFAULT '', + `completedDate` datetime DEFAULT NULL, + `completedReviewer` text DEFAULT NULL, + `canceledBy` varchar(30) NOT NULL DEFAULT '', + `canceledDate` datetime DEFAULT NULL, + `canceledReviewer` text DEFAULT NULL, + `meetingDate` date DEFAULT NULL, + `meetingLocation` varchar(255) NOT NULL DEFAULT '', + `meetingMinutes` mediumtext DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_cmcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` char(30) NOT NULL DEFAULT '', + `projectType` varchar(255) NOT NULL DEFAULT '', + `title` int(11) NOT NULL DEFAULT 0, + `contents` text DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `order` int(11) NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_company` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(120) DEFAULT NULL, + `phone` char(20) DEFAULT NULL, + `fax` char(20) DEFAULT NULL, + `address` char(120) DEFAULT NULL, + `zipcode` char(10) DEFAULT NULL, + `website` char(120) DEFAULT NULL, + `backyard` char(120) DEFAULT NULL, + `guest` enum('1','0') NOT NULL DEFAULT '0', + `admins` char(255) DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_compile` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL DEFAULT '', + `job` mediumint(8) unsigned NOT NULL DEFAULT 0, + `queue` mediumint(8) NOT NULL DEFAULT 0, + `status` varchar(100) NOT NULL DEFAULT '', + `logs` longtext DEFAULT NULL, + `atTime` varchar(10) NOT NULL DEFAULT '', + `testtask` mediumint(8) unsigned NOT NULL DEFAULT 0, + `tag` varchar(255) NOT NULL DEFAULT '', + `times` tinyint(3) unsigned NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `updateDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_created_status` (`createdDate`,`status`,`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_config` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT '', + `owner` char(30) NOT NULL DEFAULT '', + `module` varchar(30) NOT NULL DEFAULT '', + `section` char(30) NOT NULL DEFAULT '', + `key` char(30) NOT NULL DEFAULT '', + `value` longtext DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`vision`,`owner`,`module`,`section`,`key`), + KEY `vision` (`vision`), + KEY `owner` (`owner`), + KEY `module` (`module`), + KEY `key` (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_cron` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `m` varchar(20) NOT NULL DEFAULT '', + `h` varchar(20) NOT NULL DEFAULT '', + `dom` varchar(20) NOT NULL DEFAULT '', + `mon` varchar(20) NOT NULL DEFAULT '', + `dow` varchar(20) NOT NULL DEFAULT '', + `command` text DEFAULT NULL, + `remark` varchar(255) NOT NULL DEFAULT '', + `type` varchar(20) NOT NULL DEFAULT '', + `buildin` tinyint(1) NOT NULL DEFAULT 0, + `status` varchar(20) NOT NULL DEFAULT '', + `lastTime` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `lastTime` (`lastTime`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_dashboard` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `dimension` int(8) NOT NULL DEFAULT 0, + `module` mediumint(8) NOT NULL DEFAULT 0, + `desc` mediumtext DEFAULT NULL, + `layout` mediumtext DEFAULT NULL, + `filters` mediumtext DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_dataset` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(155) NOT NULL DEFAULT '', + `sql` text DEFAULT NULL, + `fields` mediumtext DEFAULT NULL, + `objects` mediumtext DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_dataview` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(155) NOT NULL DEFAULT '', + `code` varchar(50) NOT NULL DEFAULT '', + `mode` varchar(50) NOT NULL DEFAULT 'builder', + `driver` enum('mysql','duckdb') NOT NULL DEFAULT 'mysql', + `view` varchar(57) NOT NULL DEFAULT '', + `sql` text DEFAULT NULL, + `fields` text DEFAULT NULL, + `langs` text DEFAULT NULL, + `objects` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` tinyint(4) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_demand` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `pool` int(8) NOT NULL DEFAULT 0, + `module` int(8) NOT NULL DEFAULT 0, + `product` varchar(255) NOT NULL DEFAULT '', + `parent` mediumint(8) NOT NULL DEFAULT 0, + `pri` char(30) NOT NULL DEFAULT '', + `category` char(30) NOT NULL DEFAULT '', + `source` char(30) NOT NULL DEFAULT '', + `sourceNote` varchar(255) NOT NULL DEFAULT '', + `title` varchar(255) NOT NULL DEFAULT '', + `feedbackedBy` varchar(255) NOT NULL DEFAULT '', + `email` varchar(255) NOT NULL DEFAULT '', + `assignedTo` char(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `reviewedBy` text DEFAULT NULL, + `reviewedDate` datetime DEFAULT NULL, + `status` char(30) NOT NULL DEFAULT '', + `stage` enum('wait','distributed','inroadmap','incharter','developing','delivering','delivered','closed') NOT NULL DEFAULT 'wait', + `duration` char(30) NOT NULL DEFAULT '', + `BSA` char(30) NOT NULL DEFAULT '', + `story` mediumint(8) NOT NULL DEFAULT 0, + `roadmap` mediumint(8) NOT NULL DEFAULT 0, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `mailto` text DEFAULT NULL, + `duplicateDemand` mediumint(8) DEFAULT NULL, + `childDemands` varchar(255) NOT NULL DEFAULT '', + `version` varchar(255) NOT NULL DEFAULT '', + `parentVersion` smallint(6) NOT NULL DEFAULT 0, + `vision` varchar(255) NOT NULL DEFAULT 'or', + `color` varchar(255) NOT NULL DEFAULT '', + `changedBy` char(30) NOT NULL DEFAULT '', + `changedDate` datetime DEFAULT NULL, + `closedBy` char(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `closedReason` varchar(30) NOT NULL DEFAULT '', + `submitedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `activatedDate` datetime DEFAULT NULL, + `distributedBy` varchar(30) NOT NULL DEFAULT '', + `distributedDate` datetime DEFAULT NULL, + `feedback` mediumint(9) NOT NULL DEFAULT 0, + `keywords` varchar(255) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_demandpool` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `status` char(30) NOT NULL DEFAULT '', + `products` varchar(255) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `owner` text DEFAULT NULL, + `reviewer` text DEFAULT NULL, + `acl` char(30) DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_demandreview` ( + `demand` mediumint(9) NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 0, + `reviewer` varchar(30) NOT NULL DEFAULT '', + `result` varchar(30) NOT NULL DEFAULT '', + `reviewDate` datetime DEFAULT NULL, + UNIQUE KEY `demand` (`demand`,`version`,`reviewer`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_demandspec` ( + `demand` mediumint(9) NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `spec` mediumtext DEFAULT NULL, + `verify` mediumtext DEFAULT NULL, + `files` text DEFAULT NULL, + UNIQUE KEY `demand` (`demand`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_deploy` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `begin` datetime DEFAULT NULL, + `end` datetime DEFAULT NULL, + `estimate` datetime DEFAULT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `host` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT '', + `owner` char(30) NOT NULL DEFAULT '', + `members` text DEFAULT NULL, + `notify` text DEFAULT NULL, + `cases` text DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `result` varchar(20) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_deployproduct` ( + `deploy` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `release` mediumint(8) unsigned NOT NULL DEFAULT 0, + UNIQUE KEY `deploy_product_release` (`deploy`,`product`,`release`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_deploystep` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `deploy` mediumint(8) unsigned NOT NULL DEFAULT 0, + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `stage` varchar(30) NOT NULL DEFAULT '', + `content` text DEFAULT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `assignedTo` char(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `finishedBy` char(30) NOT NULL DEFAULT '', + `finishedDate` datetime DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_dept` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(60) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT 0, + `order` smallint(6) unsigned NOT NULL DEFAULT 0, + `position` char(30) NOT NULL DEFAULT '', + `function` char(255) NOT NULL DEFAULT '', + `manager` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `path` (`path`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_design` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` varchar(255) NOT NULL DEFAULT '', + `product` varchar(255) NOT NULL DEFAULT '', + `commit` text DEFAULT NULL, + `commitedBy` varchar(30) NOT NULL DEFAULT '', + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `story` char(30) NOT NULL DEFAULT '', + `storyVersion` smallint(6) unsigned NOT NULL DEFAULT 1, + `desc` mediumtext DEFAULT NULL, + `version` smallint(6) NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_designspec` ( + `design` mediumint(8) NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `files` varchar(255) NOT NULL DEFAULT '', + UNIQUE KEY `design` (`design`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_dimension` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(90) NOT NULL DEFAULT '', + `code` varchar(45) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `acl` enum('open','private') NOT NULL DEFAULT 'open', + `whitelist` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_doc` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `lib` varchar(30) NOT NULL DEFAULT '', + `template` varchar(30) NOT NULL DEFAULT '', + `templateType` varchar(30) NOT NULL DEFAULT '', + `chapterType` varchar(30) NOT NULL DEFAULT '', + `module` varchar(30) NOT NULL DEFAULT '', + `title` varchar(255) NOT NULL DEFAULT '', + `keywords` varchar(255) NOT NULL DEFAULT '', + `type` varchar(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT 'normal', + `parent` smallint(6) unsigned NOT NULL DEFAULT 0, + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT 0, + `order` smallint(6) unsigned NOT NULL DEFAULT 0, + `views` smallint(6) unsigned NOT NULL DEFAULT 0, + `assetLib` mediumint(8) unsigned NOT NULL DEFAULT 0, + `assetLibType` varchar(30) NOT NULL DEFAULT '', + `from` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fromVersion` smallint(6) NOT NULL DEFAULT 1, + `draft` longtext DEFAULT NULL, + `collects` smallint(6) unsigned NOT NULL DEFAULT 0, + `addedBy` varchar(30) NOT NULL DEFAULT '', + `addedDate` datetime DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `approvedDate` date DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `editingDate` text DEFAULT NULL, + `editedList` text DEFAULT NULL, + `mailto` text DEFAULT NULL, + `acl` varchar(10) NOT NULL DEFAULT 'open', + `groups` varchar(255) NOT NULL DEFAULT '', + `users` text DEFAULT NULL, + `version` smallint(6) unsigned NOT NULL DEFAULT 1, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`), + KEY `lib` (`lib`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_docaction` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `doc` mediumint(8) unsigned NOT NULL DEFAULT 0, + `action` varchar(80) NOT NULL DEFAULT '', + `actor` char(30) NOT NULL DEFAULT '', + `date` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `doc` (`doc`), + KEY `actor` (`actor`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_docblock` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `doc` mediumint(8) unsigned NOT NULL DEFAULT 0, + `type` varchar(50) NOT NULL DEFAULT '', + `settings` text DEFAULT NULL, + `content` mediumtext DEFAULT NULL, + `extra` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_doc` (`doc`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_doccontent` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `doc` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `digest` varchar(255) NOT NULL DEFAULT '', + `content` longtext DEFAULT NULL, + `rawContent` longtext DEFAULT NULL, + `files` text DEFAULT NULL, + `type` varchar(10) NOT NULL DEFAULT '', + `addedBy` varchar(30) NOT NULL DEFAULT '', + `addedDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `version` smallint(6) unsigned NOT NULL DEFAULT 0, + `fromVersion` smallint(6) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `doc_version` (`doc`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_doclib` ( + `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL DEFAULT '', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(60) NOT NULL DEFAULT '', + `baseUrl` varchar(255) NOT NULL DEFAULT '', + `acl` varchar(10) NOT NULL DEFAULT 'open', + `groups` varchar(255) NOT NULL DEFAULT '', + `users` text DEFAULT NULL, + `main` enum('0','1') NOT NULL DEFAULT '0', + `collector` text DEFAULT NULL, + `desc` mediumtext DEFAULT NULL, + `order` tinyint(5) unsigned NOT NULL DEFAULT 0, + `addedBy` varchar(30) NOT NULL DEFAULT '', + `addedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `orderBy` varchar(30) NOT NULL DEFAULT 'id_asc', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `execution` (`execution`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_duckdbqueue` ( + `object` varchar(255) NOT NULL DEFAULT '', + `updatedTime` datetime DEFAULT NULL, + `syncTime` datetime DEFAULT NULL, + UNIQUE KEY `object` (`object`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_durationestimation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `stage` mediumint(9) NOT NULL DEFAULT 0, + `workload` varchar(255) NOT NULL DEFAULT '', + `worktimeRate` varchar(255) NOT NULL DEFAULT '', + `people` varchar(255) NOT NULL DEFAULT '', + `startDate` date DEFAULT NULL, + `endDate` date DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_effort` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` text DEFAULT NULL, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `account` varchar(30) NOT NULL DEFAULT '', + `work` text DEFAULT NULL, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `date` date DEFAULT NULL, + `left` float NOT NULL DEFAULT 0, + `consumed` float NOT NULL DEFAULT 0, + `begin` smallint(4) unsigned zerofill NOT NULL DEFAULT 0000, + `end` smallint(4) unsigned zerofill NOT NULL DEFAULT 0000, + `extra` text DEFAULT NULL, + `order` tinyint(3) unsigned NOT NULL DEFAULT 0, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `execution` (`execution`), + KEY `objectID` (`objectID`), + KEY `date` (`date`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_entry` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL DEFAULT '', + `account` varchar(30) NOT NULL DEFAULT '', + `code` varchar(20) NOT NULL DEFAULT '', + `key` varchar(32) NOT NULL DEFAULT '', + `freePasswd` enum('0','1') NOT NULL DEFAULT '0', + `ip` varchar(100) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `calledTime` int(11) unsigned NOT NULL DEFAULT 0, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_expect` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `userID` mediumint(8) NOT NULL DEFAULT 0, + `project` mediumint(8) NOT NULL DEFAULT 0, + `expect` text DEFAULT NULL, + `progress` text DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_extension` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(150) NOT NULL DEFAULT '', + `code` varchar(30) NOT NULL DEFAULT '', + `version` varchar(50) NOT NULL DEFAULT '', + `author` varchar(100) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `license` text DEFAULT NULL, + `type` varchar(20) NOT NULL DEFAULT 'extension', + `site` varchar(150) NOT NULL DEFAULT '', + `zentaoCompatible` text DEFAULT NULL, + `installedTime` datetime DEFAULT NULL, + `depends` varchar(100) NOT NULL DEFAULT '', + `dirs` mediumtext DEFAULT NULL, + `files` mediumtext DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`), + KEY `name` (`name`), + KEY `installedTime` (`installedTime`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_extuser` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `code` varchar(255) NOT NULL, + `account` char(30) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_faq` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `module` mediumint(9) NOT NULL DEFAULT 0, + `product` mediumint(9) NOT NULL DEFAULT 0, + `question` varchar(255) NOT NULL DEFAULT '', + `answer` text DEFAULT NULL, + `addedtime` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_feedback` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT '', + `solution` char(30) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `pri` tinyint(3) unsigned NOT NULL DEFAULT 2, + `status` varchar(30) NOT NULL DEFAULT '', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `public` enum('0','1') NOT NULL DEFAULT '0', + `notify` enum('0','1') NOT NULL DEFAULT '0', + `notifyEmail` varchar(100) NOT NULL DEFAULT '', + `source` varchar(255) NOT NULL DEFAULT '', + `likes` text DEFAULT NULL, + `result` mediumint(8) unsigned NOT NULL DEFAULT 0, + `faq` mediumint(8) unsigned NOT NULL DEFAULT 0, + `openedBy` char(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `reviewedBy` varchar(255) NOT NULL DEFAULT '', + `reviewedDate` datetime DEFAULT NULL, + `processedBy` char(30) NOT NULL DEFAULT '', + `processedDate` datetime DEFAULT NULL, + `closedBy` char(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `closedReason` varchar(30) NOT NULL DEFAULT '', + `editedBy` char(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedTo` varchar(255) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `activatedBy` varchar(30) NOT NULL DEFAULT '', + `activatedDate` datetime DEFAULT NULL, + `feedbackBy` varchar(100) NOT NULL DEFAULT '', + `repeatFeedback` mediumint(8) NOT NULL DEFAULT 0, + `mailto` varchar(255) NOT NULL DEFAULT '', + `keywords` varchar(255) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_feedbackview` ( + `account` char(30) NOT NULL DEFAULT '', + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + UNIQUE KEY `account_product` (`account`,`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_file` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `pathname` char(100) NOT NULL DEFAULT '', + `title` varchar(255) NOT NULL DEFAULT '', + `extension` char(30) NOT NULL DEFAULT '', + `size` int(11) unsigned NOT NULL DEFAULT 0, + `objectType` char(30) NOT NULL DEFAULT '', + `objectID` mediumint(9) NOT NULL DEFAULT 0, + `gid` char(48) NOT NULL DEFAULT '', + `addedBy` char(30) NOT NULL DEFAULT '', + `addedDate` datetime DEFAULT NULL, + `downloads` mediumint(8) unsigned NOT NULL DEFAULT 0, + `extra` varchar(255) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `objectType` (`objectType`), + KEY `objectID` (`objectID`), + KEY `gid` (`gid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_gapanalysis` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `account` varchar(30) NOT NULL DEFAULT '', + `role` varchar(20) NOT NULL DEFAULT '', + `analysis` mediumtext DEFAULT NULL, + `needTrain` enum('no','yes') NOT NULL DEFAULT 'no', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `project_account` (`project`,`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_group` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `name` char(30) NOT NULL DEFAULT '', + `role` char(30) NOT NULL DEFAULT '', + `desc` char(255) NOT NULL DEFAULT '', + `acl` text DEFAULT NULL, + `developer` enum('0','1') NOT NULL DEFAULT '1', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_grouppriv` ( + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` char(30) NOT NULL DEFAULT '', + `method` char(30) NOT NULL DEFAULT '', + UNIQUE KEY `group` (`group`,`module`,`method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_history` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `action` mediumint(8) unsigned NOT NULL DEFAULT 0, + `field` varchar(30) NOT NULL DEFAULT '', + `old` text DEFAULT NULL, + `oldValue` text DEFAULT NULL, + `new` text DEFAULT NULL, + `newValue` text DEFAULT NULL, + `diff` mediumtext DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `action` (`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_holiday` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(30) NOT NULL DEFAULT '', + `type` enum('holiday','working') NOT NULL DEFAULT 'holiday', + `desc` text DEFAULT NULL, + `year` char(4) NOT NULL DEFAULT '', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_host` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(30) NOT NULL DEFAULT 'normal', + `hostType` varchar(30) NOT NULL DEFAULT '', + `mac` varchar(128) NOT NULL DEFAULT '', + `memory` varchar(30) NOT NULL DEFAULT '', + `diskSize` varchar(30) NOT NULL DEFAULT '', + `status` varchar(50) NOT NULL DEFAULT '', + `secret` varchar(50) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `tokenSN` varchar(50) NOT NULL DEFAULT '', + `tokenTime` datetime DEFAULT NULL, + `oldTokenSN` varchar(50) NOT NULL DEFAULT '', + `vsoft` varchar(30) NOT NULL DEFAULT '', + `heartbeat` datetime DEFAULT NULL, + `zap` varchar(10) NOT NULL DEFAULT '', + `vnc` int(11) NOT NULL DEFAULT 0, + `ztf` int(11) NOT NULL DEFAULT 0, + `zd` int(11) NOT NULL DEFAULT 0, + `ssh` int(11) NOT NULL DEFAULT 0, + `parent` int(11) unsigned NOT NULL DEFAULT 0, + `image` int(11) unsigned NOT NULL DEFAULT 0, + `admin` smallint(5) unsigned NOT NULL DEFAULT 0, + `serverRoom` mediumint(8) unsigned NOT NULL DEFAULT 0, + `cpuNumber` varchar(16) NOT NULL DEFAULT '', + `cpuCores` varchar(30) NOT NULL DEFAULT '', + `intranet` varchar(128) NOT NULL DEFAULT '', + `extranet` varchar(128) NOT NULL DEFAULT '', + `osName` varchar(64) NOT NULL DEFAULT '', + `osVersion` varchar(64) NOT NULL DEFAULT '', + `group` varchar(128) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_image` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `host` int(11) unsigned NOT NULL DEFAULT 0, + `name` varchar(64) NOT NULL DEFAULT '', + `localName` varchar(64) NOT NULL DEFAULT '', + `address` varchar(64) NOT NULL DEFAULT '', + `path` varchar(64) NOT NULL DEFAULT '', + `status` varchar(20) NOT NULL DEFAULT '', + `osName` varchar(32) NOT NULL DEFAULT '', + `from` varchar(10) NOT NULL DEFAULT 'zentao', + `memory` float unsigned NOT NULL DEFAULT 0, + `disk` float unsigned NOT NULL DEFAULT 0, + `fileSize` float unsigned NOT NULL DEFAULT 0, + `md5` varchar(64) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `restoreDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_instance` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `space` mediumint(8) unsigned NOT NULL DEFAULT 0, + `solution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` char(50) NOT NULL DEFAULT '', + `appID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `appName` char(50) NOT NULL DEFAULT '', + `appVersion` char(20) NOT NULL DEFAULT '', + `chart` char(50) NOT NULL DEFAULT '', + `logo` varchar(255) NOT NULL DEFAULT '', + `version` char(50) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `introduction` text DEFAULT NULL, + `source` char(20) NOT NULL DEFAULT '', + `channel` char(20) NOT NULL DEFAULT '', + `k8name` char(64) NOT NULL DEFAULT '', + `status` char(20) NOT NULL DEFAULT '', + `pinned` enum('0','1') NOT NULL DEFAULT '0', + `domain` char(255) NOT NULL DEFAULT '', + `smtpSnippetName` char(30) NOT NULL DEFAULT '', + `ldapSnippetName` char(30) NOT NULL DEFAULT '', + `ldapSettings` text DEFAULT NULL, + `dbSettings` text DEFAULT NULL, + `autoBackup` tinyint(1) NOT NULL DEFAULT 0, + `backupKeepDays` int(10) unsigned NOT NULL DEFAULT 1, + `autoRestore` tinyint(1) NOT NULL DEFAULT 0, + `env` text DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdAt` datetime DEFAULT NULL, + `deleted` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `space` (`space`), + KEY `k8name` (`k8name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_intervention` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `activity` mediumint(8) NOT NULL DEFAULT 0, + `status` char(30) NOT NULL DEFAULT '', + `partake` text DEFAULT NULL, + `begin` date DEFAULT NULL, + `realBegin` date DEFAULT NULL, + `situation` varchar(255) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `project` (`project`,`activity`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_issue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `resolvedBy` varchar(30) NOT NULL DEFAULT '', + `project` varchar(255) NOT NULL DEFAULT '', + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `pri` char(30) NOT NULL DEFAULT '', + `severity` char(30) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT '', + `activity` varchar(255) NOT NULL DEFAULT '', + `deadline` date DEFAULT NULL, + `resolution` char(30) NOT NULL DEFAULT '', + `resolutionComment` text DEFAULT NULL, + `objectID` varchar(255) NOT NULL DEFAULT '', + `resolvedDate` date DEFAULT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `owner` varchar(255) NOT NULL DEFAULT '', + `lib` mediumint(8) unsigned NOT NULL DEFAULT 0, + `from` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 1, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `activateBy` varchar(30) NOT NULL DEFAULT '', + `activateDate` date DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` date DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `approvedDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_job` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL DEFAULT '', + `repo` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `frame` varchar(20) NOT NULL DEFAULT '', + `engine` varchar(20) NOT NULL DEFAULT '', + `autoRun` enum('0','1') NOT NULL DEFAULT '1', + `server` mediumint(8) unsigned NOT NULL DEFAULT 0, + `pipeline` varchar(500) NOT NULL DEFAULT '', + `triggerType` varchar(255) NOT NULL DEFAULT '', + `sonarqubeServer` mediumint(8) unsigned NOT NULL DEFAULT 0, + `projectKey` varchar(255) NOT NULL DEFAULT '', + `svnDir` varchar(255) NOT NULL DEFAULT '', + `atDay` varchar(255) NOT NULL DEFAULT '', + `atTime` varchar(10) NOT NULL DEFAULT '', + `customParam` text DEFAULT NULL, + `comment` varchar(255) NOT NULL DEFAULT '', + `triggerActions` varchar(255) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `lastExec` datetime DEFAULT NULL, + `lastStatus` varchar(255) NOT NULL DEFAULT '', + `lastTag` varchar(255) NOT NULL DEFAULT '', + `lastSyncDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_repo_deleted` (`repo`,`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_kanban` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `space` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL DEFAULT '', + `team` text DEFAULT NULL, + `desc` mediumtext DEFAULT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text DEFAULT NULL, + `archived` enum('0','1') NOT NULL DEFAULT '1', + `performable` enum('0','1') NOT NULL DEFAULT '0', + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `order` mediumint(8) NOT NULL DEFAULT 0, + `displayCards` smallint(6) NOT NULL DEFAULT 0, + `showWIP` enum('0','1') NOT NULL DEFAULT '1', + `fluidBoard` enum('0','1') NOT NULL DEFAULT '0', + `colWidth` smallint(4) NOT NULL DEFAULT 264, + `minColWidth` smallint(4) NOT NULL DEFAULT 200, + `maxColWidth` smallint(4) NOT NULL DEFAULT 384, + `object` varchar(255) NOT NULL DEFAULT '', + `alignment` varchar(10) NOT NULL DEFAULT 'center', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `closedBy` char(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `activatedBy` char(30) NOT NULL DEFAULT '', + `activatedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_kanbancard` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) unsigned NOT NULL DEFAULT 0, + `region` mediumint(8) unsigned NOT NULL DEFAULT 0, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fromID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fromType` varchar(30) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT 'doing', + `pri` mediumint(8) unsigned NOT NULL DEFAULT 0, + `assignedTo` text DEFAULT NULL, + `desc` mediumtext DEFAULT NULL, + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `estimate` float unsigned NOT NULL DEFAULT 0, + `progress` float unsigned NOT NULL DEFAULT 0, + `color` char(7) NOT NULL DEFAULT '', + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text DEFAULT NULL, + `order` mediumint(8) NOT NULL DEFAULT 0, + `archived` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `archivedBy` char(30) NOT NULL DEFAULT '', + `archivedDate` datetime DEFAULT NULL, + `assignedBy` char(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_kanbancell` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) NOT NULL DEFAULT 0, + `lane` mediumint(8) NOT NULL DEFAULT 0, + `column` mediumint(8) NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT '', + `cards` mediumtext DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `card_group` (`kanban`,`type`,`lane`,`column`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_kanbancolumn` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `parent` mediumint(8) NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT '', + `region` mediumint(8) unsigned NOT NULL DEFAULT 0, + `group` mediumint(8) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `color` char(30) NOT NULL DEFAULT '', + `limit` smallint(6) NOT NULL DEFAULT -1, + `order` mediumint(8) NOT NULL DEFAULT 0, + `archived` enum('0','1') NOT NULL DEFAULT '0', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_kanbangroup` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `kanban` mediumint(8) unsigned NOT NULL DEFAULT 0, + `region` mediumint(8) unsigned NOT NULL DEFAULT 0, + `order` smallint(6) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_kanbanlane` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `execution` mediumint(8) NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT '', + `region` mediumint(8) unsigned NOT NULL DEFAULT 0, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `groupby` char(30) NOT NULL DEFAULT '', + `extra` char(30) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL DEFAULT '', + `color` char(30) NOT NULL DEFAULT '', + `order` smallint(6) NOT NULL DEFAULT 0, + `lastEditedTime` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_kanbanregion` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `space` mediumint(8) unsigned NOT NULL DEFAULT 0, + `kanban` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `order` mediumint(8) NOT NULL DEFAULT 0, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_kanbanspace` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(50) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL DEFAULT '', + `team` text DEFAULT NULL, + `desc` mediumtext DEFAULT NULL, + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text DEFAULT NULL, + `status` enum('active','closed') NOT NULL DEFAULT 'active', + `order` mediumint(8) NOT NULL DEFAULT 0, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `closedBy` char(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `activatedBy` char(30) NOT NULL DEFAULT '', + `activatedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_lang` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `lang` varchar(30) NOT NULL DEFAULT '', + `module` varchar(30) NOT NULL DEFAULT '', + `section` varchar(50) NOT NULL DEFAULT '', + `key` varchar(60) NOT NULL DEFAULT '', + `value` text DEFAULT NULL, + `system` enum('0','1') NOT NULL DEFAULT '1', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + UNIQUE KEY `lang` (`lang`,`module`,`section`,`key`,`vision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_leave` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL DEFAULT '', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `start` time DEFAULT NULL, + `finish` time DEFAULT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT 0.0, + `backDate` datetime DEFAULT NULL, + `type` varchar(30) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `reviewedBy` char(30) NOT NULL DEFAULT '', + `reviewedDate` datetime DEFAULT NULL, + `level` tinyint(3) NOT NULL DEFAULT 0, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `reviewers` text DEFAULT NULL, + `backReviewers` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `type` (`type`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_lieu` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL DEFAULT '', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `start` time DEFAULT NULL, + `finish` time DEFAULT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT 0.0, + `overtime` char(255) NOT NULL DEFAULT '', + `trip` char(255) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `reviewedBy` char(30) NOT NULL DEFAULT '', + `reviewedDate` datetime DEFAULT NULL, + `level` tinyint(3) NOT NULL DEFAULT 0, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `reviewers` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_log` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `action` mediumint(8) unsigned NOT NULL DEFAULT 0, + `date` datetime DEFAULT NULL, + `url` varchar(255) NOT NULL DEFAULT '', + `contentType` varchar(30) NOT NULL DEFAULT '', + `data` text DEFAULT NULL, + `result` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `objectType` (`objectType`), + KEY `obejctID` (`objectID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_mark` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(50) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` varchar(50) NOT NULL DEFAULT '', + `account` char(30) NOT NULL DEFAULT '', + `date` datetime DEFAULT NULL, + `mark` varchar(50) NOT NULL DEFAULT '', + `extra` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `idx_object` (`objectType`,`objectID`), + KEY `idx_account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_market` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `industry` char(255) NOT NULL DEFAULT '', + `scale` decimal(10,2) NOT NULL DEFAULT 0.00, + `maturity` char(255) NOT NULL DEFAULT '', + `speed` varchar(255) NOT NULL DEFAULT '', + `competition` char(255) NOT NULL DEFAULT '', + `strategy` varchar(255) NOT NULL DEFAULT '', + `ppm` varchar(20) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_marketreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `market` mediumint(8) NOT NULL DEFAULT 0, + `research` mediumint(8) NOT NULL DEFAULT 0, + `maturity` varchar(30) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL DEFAULT '', + `participants` char(255) NOT NULL DEFAULT '', + `source` varchar(30) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT '', + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `publishedBy` varchar(30) NOT NULL DEFAULT '', + `publishedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_measqueue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL DEFAULT '', + `mid` mediumint(8) unsigned NOT NULL DEFAULT 0, + `status` varchar(100) NOT NULL DEFAULT '', + `logs` text DEFAULT NULL, + `execTime` varchar(10) NOT NULL DEFAULT '', + `params` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `updateDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `status_deleted` (`status`,`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_measrecords` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `type` varchar(30) NOT NULL DEFAULT '', + `mid` mediumint(8) NOT NULL DEFAULT 0, + `measCode` char(50) NOT NULL DEFAULT '', + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `params` text DEFAULT NULL, + `year` char(4) NOT NULL DEFAULT '', + `month` char(6) NOT NULL DEFAULT '', + `week` char(8) NOT NULL DEFAULT '', + `day` char(8) NOT NULL DEFAULT '', + `value` varchar(255) NOT NULL DEFAULT '', + `date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `time` (`year`,`month`,`day`,`week`), + KEY `product` (`product`), + KEY `project` (`project`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_meastemplate` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL DEFAULT '', + `content` mediumtext DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_meeting` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL DEFAULT 0, + `execution` mediumint(8) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(255) NOT NULL DEFAULT '', + `begin` time DEFAULT NULL, + `end` time DEFAULT NULL, + `dept` mediumint(8) NOT NULL DEFAULT 0, + `mode` varchar(255) NOT NULL DEFAULT '', + `host` varchar(30) NOT NULL DEFAULT '', + `participant` text DEFAULT NULL, + `date` date DEFAULT NULL, + `room` int(11) NOT NULL DEFAULT 0, + `minutes` text DEFAULT NULL, + `minutedBy` varchar(30) NOT NULL DEFAULT '', + `minutedDate` datetime DEFAULT NULL, + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_meetingroom` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `position` varchar(30) NOT NULL DEFAULT '', + `seats` int(11) NOT NULL DEFAULT 0, + `equipment` varchar(255) NOT NULL DEFAULT '', + `openTime` varchar(255) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_metric` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `purpose` varchar(50) NOT NULL DEFAULT '', + `scope` char(30) NOT NULL DEFAULT '', + `object` char(30) NOT NULL DEFAULT '', + `stage` enum('wait','released') DEFAULT 'wait', + `type` enum('php','sql') DEFAULT 'php', + `name` varchar(90) NOT NULL DEFAULT '', + `alias` varchar(90) NOT NULL DEFAULT '', + `code` varchar(90) NOT NULL DEFAULT '', + `unit` varchar(10) NOT NULL DEFAULT '', + `dateType` varchar(50) NOT NULL DEFAULT '', + `collector` text DEFAULT NULL, + `desc` text DEFAULT NULL, + `definition` text DEFAULT NULL, + `when` varchar(30) NOT NULL DEFAULT '', + `event` varchar(30) NOT NULL DEFAULT '', + `cronCFG` varchar(30) NOT NULL DEFAULT '', + `time` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `implementedBy` varchar(30) NOT NULL DEFAULT '', + `implementedDate` datetime DEFAULT NULL, + `delistedBy` varchar(30) NOT NULL DEFAULT '', + `delistedDate` datetime DEFAULT NULL, + `builtin` enum('0','1') NOT NULL DEFAULT '0', + `fromID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `order` mediumint(8) unsigned NOT NULL DEFAULT 0, + `lastCalcRows` int(11) NOT NULL DEFAULT 0, + `lastCalcTime` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_metriclib` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `metricID` mediumint(9) NOT NULL DEFAULT 0, + `metricCode` varchar(100) NOT NULL DEFAULT '', + `system` char(30) NOT NULL DEFAULT '0', + `program` char(30) NOT NULL DEFAULT '', + `project` char(30) NOT NULL DEFAULT '', + `product` char(30) NOT NULL DEFAULT '', + `execution` char(30) NOT NULL DEFAULT '', + `code` char(30) NOT NULL DEFAULT '', + `pipeline` char(30) NOT NULL DEFAULT '', + `repo` char(30) NOT NULL DEFAULT '', + `user` text DEFAULT NULL, + `dept` char(30) NOT NULL DEFAULT '', + `year` char(4) NOT NULL DEFAULT '0', + `month` char(2) NOT NULL DEFAULT '0', + `week` char(2) NOT NULL DEFAULT '0', + `day` char(2) NOT NULL DEFAULT '0', + `value` varchar(100) NOT NULL DEFAULT '0', + `calcType` enum('cron','inference') NOT NULL DEFAULT 'cron', + `calculatedBy` varchar(30) NOT NULL DEFAULT '', + `date` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `metricID` (`metricID`), + KEY `metricCode` (`metricCode`), + KEY `date` (`date`), + KEY `deleted` (`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_module` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `root` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` char(60) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT 0, + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT '', + `from` mediumint(8) unsigned NOT NULL DEFAULT 0, + `owner` varchar(30) NOT NULL DEFAULT '', + `collector` text DEFAULT NULL, + `short` varchar(30) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `root` (`root`), + KEY `type` (`type`), + KEY `path` (`path`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_mr` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `hostID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `sourceProject` varchar(50) NOT NULL DEFAULT '', + `sourceBranch` varchar(100) NOT NULL DEFAULT '', + `targetProject` varchar(50) NOT NULL DEFAULT '', + `targetBranch` varchar(100) NOT NULL DEFAULT '', + `mriid` int(10) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `description` text DEFAULT NULL, + `assignee` varchar(255) NOT NULL DEFAULT '', + `reviewer` varchar(255) NOT NULL DEFAULT '', + `approver` varchar(255) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `status` char(30) NOT NULL DEFAULT '', + `mergeStatus` char(30) NOT NULL DEFAULT '', + `approvalStatus` char(30) NOT NULL DEFAULT '', + `needApproved` enum('0','1') NOT NULL DEFAULT '0', + `needCI` enum('0','1') NOT NULL DEFAULT '0', + `repoID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `jobID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `executionID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `compileID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `compileStatus` char(30) NOT NULL DEFAULT '', + `removeSourceBranch` enum('0','1') NOT NULL DEFAULT '0', + `squash` enum('0','1') NOT NULL DEFAULT '0', + `isFlow` enum('0','1') NOT NULL DEFAULT '0', + `synced` enum('0','1') NOT NULL DEFAULT '1', + `syncError` varchar(255) NOT NULL DEFAULT '', + `hasNoConflict` enum('0','1') NOT NULL DEFAULT '0', + `diffs` longtext DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_mrapproval` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `mrID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `account` varchar(255) NOT NULL DEFAULT '', + `date` datetime DEFAULT NULL, + `action` char(30) NOT NULL DEFAULT '', + `comment` text DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_nc` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `auditplan` mediumint(8) NOT NULL DEFAULT 0, + `listID` mediumint(8) NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `type` char(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT 'active', + `severity` char(30) NOT NULL DEFAULT '', + `deadline` date DEFAULT NULL, + `resolvedBy` varchar(30) NOT NULL DEFAULT '', + `resolution` char(30) NOT NULL DEFAULT '', + `resolvedDate` date DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` date DEFAULT NULL, + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` date DEFAULT NULL, + `activateDate` date DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_notify` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectType` varchar(50) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `action` mediumint(8) NOT NULL DEFAULT 0, + `toList` text DEFAULT NULL, + `ccList` text DEFAULT NULL, + `subject` text DEFAULT NULL, + `data` text DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `sendTime` datetime DEFAULT NULL, + `status` varchar(10) NOT NULL DEFAULT 'wait', + `failReason` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `objectType` (`objectType`), + KEY `status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_oauth` ( + `account` varchar(30) NOT NULL DEFAULT '', + `openID` varchar(255) NOT NULL DEFAULT '', + `providerType` varchar(30) NOT NULL DEFAULT '', + `providerID` mediumint(8) unsigned NOT NULL DEFAULT 0, + UNIQUE KEY `account_openID` (`account`,`openID`,`providerType`,`providerID`), + KEY `account` (`account`), + KEY `providerType` (`providerType`), + KEY `providerID` (`providerID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_object` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) NOT NULL DEFAULT 0, + `from` mediumint(8) NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `category` char(30) NOT NULL DEFAULT '', + `version` varchar(255) NOT NULL DEFAULT '', + `type` enum('reviewed','taged') NOT NULL DEFAULT 'reviewed', + `enabled` enum('0','1') NOT NULL DEFAULT '1', + `range` text DEFAULT NULL, + `data` text DEFAULT NULL, + `storyEst` char(30) NOT NULL DEFAULT '', + `taskEst` char(30) NOT NULL DEFAULT '', + `requestEst` char(30) NOT NULL DEFAULT '', + `testEst` char(30) NOT NULL DEFAULT '', + `devEst` char(30) NOT NULL DEFAULT '', + `designEst` char(30) NOT NULL DEFAULT '', + `end` date DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_opportunity` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `source` char(30) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT '', + `strategy` char(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT 'active', + `impact` mediumint(8) NOT NULL DEFAULT 0, + `chance` mediumint(8) NOT NULL DEFAULT 0, + `ratio` mediumint(8) NOT NULL DEFAULT 0, + `pri` char(30) NOT NULL DEFAULT '', + `identifiedDate` date DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` date DEFAULT NULL, + `approvedDate` date DEFAULT NULL, + `prevention` mediumtext DEFAULT NULL, + `plannedClosedDate` date DEFAULT NULL, + `actualClosedDate` date DEFAULT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT 0, + `from` mediumint(8) unsigned NOT NULL DEFAULT 0, + `desc` mediumtext DEFAULT NULL, + `version` smallint(6) NOT NULL DEFAULT 1, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `activatedBy` varchar(30) NOT NULL DEFAULT '', + `activatedDate` datetime DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `canceledBy` varchar(30) NOT NULL DEFAULT '', + `canceledDate` datetime DEFAULT NULL, + `cancelReason` char(30) NOT NULL DEFAULT '', + `hangupedBy` varchar(30) NOT NULL DEFAULT '', + `hangupedDate` datetime DEFAULT NULL, + `resolution` mediumtext DEFAULT NULL, + `resolvedBy` varchar(30) NOT NULL DEFAULT '', + `resolvedDate` datetime DEFAULT NULL, + `lastCheckedBy` varchar(30) NOT NULL DEFAULT '', + `lastCheckedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_overtime` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `year` char(4) NOT NULL DEFAULT '', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `start` time DEFAULT NULL, + `finish` time DEFAULT NULL, + `hours` float(4,1) unsigned NOT NULL DEFAULT 0.0, + `leave` varchar(255) NOT NULL DEFAULT '', + `type` varchar(30) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `status` varchar(30) NOT NULL DEFAULT '', + `rejectReason` varchar(100) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `reviewedBy` char(30) NOT NULL DEFAULT '', + `reviewedDate` datetime DEFAULT NULL, + `level` tinyint(3) NOT NULL DEFAULT 0, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `reviewers` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `type` (`type`), + KEY `status` (`status`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_pipeline` ( + `id` smallint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` char(30) NOT NULL DEFAULT '', + `name` varchar(50) NOT NULL DEFAULT '', + `url` varchar(255) DEFAULT NULL, + `account` varchar(30) DEFAULT NULL, + `password` varchar(255) DEFAULT NULL, + `token` varchar(255) DEFAULT NULL, + `private` char(32) DEFAULT NULL, + `instanceID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_pivot` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `dimension` mediumint(8) unsigned NOT NULL DEFAULT 0, + `group` varchar(255) NOT NULL DEFAULT '', + `code` varchar(255) NOT NULL DEFAULT '', + `driver` enum('mysql','duckdb') NOT NULL DEFAULT 'mysql', + `mode` varchar(10) NOT NULL DEFAULT 'builder', + `name` text DEFAULT NULL, + `desc` text DEFAULT NULL, + `acl` enum('open','private') NOT NULL DEFAULT 'open', + `whitelist` text DEFAULT NULL, + `sql` text DEFAULT NULL, + `fields` text DEFAULT NULL, + `langs` text DEFAULT NULL, + `vars` text DEFAULT NULL, + `objects` text DEFAULT NULL, + `settings` text DEFAULT NULL, + `filters` text DEFAULT NULL, + `step` tinyint(3) unsigned NOT NULL DEFAULT 0, + `stage` enum('draft','published') NOT NULL DEFAULT 'draft', + `builtin` enum('0','1') NOT NULL DEFAULT '0', + `version` varchar(10) NOT NULL DEFAULT '1', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `dimension` (`dimension`), + KEY `group` (`group`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_pivotdrill` ( + `pivot` mediumint(9) NOT NULL, + `version` varchar(10) NOT NULL DEFAULT '1', + `field` varchar(255) NOT NULL, + `object` varchar(40) NOT NULL, + `whereSql` mediumtext NOT NULL, + `condition` mediumtext NOT NULL, + `status` enum('design','published') NOT NULL DEFAULT 'published', + `account` varchar(30) NOT NULL DEFAULT '', + `type` enum('auto','manual') NOT NULL DEFAULT 'manual' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_pivotspec` ( + `pivot` mediumint(8) NOT NULL, + `version` varchar(10) NOT NULL, + `driver` enum('mysql','duckdb') NOT NULL DEFAULT 'mysql', + `mode` varchar(10) NOT NULL DEFAULT 'builder', + `name` text DEFAULT NULL, + `desc` text DEFAULT NULL, + `sql` text DEFAULT NULL, + `fields` text DEFAULT NULL, + `langs` text DEFAULT NULL, + `vars` text DEFAULT NULL, + `objects` text DEFAULT NULL, + `settings` text DEFAULT NULL, + `filters` text DEFAULT NULL, + `createdDate` datetime DEFAULT NULL, + UNIQUE KEY `idx_pivot_version` (`pivot`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_planstory` ( + `plan` mediumint(8) unsigned NOT NULL DEFAULT 0, + `story` mediumint(8) unsigned NOT NULL DEFAULT 0, + `order` mediumint(9) NOT NULL DEFAULT 0, + UNIQUE KEY `plan_story` (`plan`,`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_practice` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` mediumint(8) unsigned NOT NULL DEFAULT 0, + `code` char(50) NOT NULL DEFAULT '', + `title` varchar(255) NOT NULL DEFAULT '', + `labels` varchar(255) NOT NULL DEFAULT '', + `summary` varchar(255) NOT NULL DEFAULT '', + `content` text DEFAULT NULL, + `contributor` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_priv` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL DEFAULT '', + `method` varchar(30) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `edition` varchar(30) NOT NULL DEFAULT ',open,biz,max,', + `vision` varchar(30) NOT NULL DEFAULT ',rnd,', + `system` enum('0','1') NOT NULL DEFAULT '0', + `order` mediumint(8) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `priv` (`module`,`method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_privlang` ( + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `objectType` enum('priv','manager') NOT NULL DEFAULT 'priv', + `lang` varchar(30) NOT NULL DEFAULT '', + `key` varchar(100) NOT NULL DEFAULT '', + `value` varchar(255) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + UNIQUE KEY `objectlang` (`objectID`,`objectType`,`lang`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_privmanager` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `code` varchar(100) NOT NULL DEFAULT '', + `type` enum('view','module','package') NOT NULL DEFAULT 'package', + `edition` varchar(30) NOT NULL DEFAULT ',open,biz,max,', + `vision` varchar(30) NOT NULL DEFAULT ',rnd,', + `order` mediumint(8) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_privrelation` ( + `priv` varchar(100) NOT NULL DEFAULT '', + `type` varchar(30) NOT NULL DEFAULT '', + `relationPriv` varchar(100) NOT NULL DEFAULT '', + UNIQUE KEY `privrelation` (`priv`,`type`,`relationPriv`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_process` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `model` char(30) NOT NULL DEFAULT 'waterfall', + `name` varchar(255) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT '', + `abbr` char(30) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `order` mediumint(9) NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_product` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `program` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(110) NOT NULL DEFAULT '', + `code` varchar(45) NOT NULL DEFAULT '', + `shadow` tinyint(1) unsigned NOT NULL DEFAULT 0, + `bind` enum('0','1') NOT NULL DEFAULT '0', + `line` mediumint(8) NOT NULL DEFAULT 0, + `type` varchar(30) NOT NULL DEFAULT 'normal', + `status` varchar(30) NOT NULL DEFAULT '', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `PO` varchar(30) NOT NULL DEFAULT '', + `QD` varchar(30) NOT NULL DEFAULT '', + `RD` varchar(30) NOT NULL DEFAULT '', + `feedback` varchar(30) NOT NULL DEFAULT '', + `ticket` varchar(30) NOT NULL DEFAULT '', + `workflowGroup` int(8) NOT NULL DEFAULT 0, + `acl` enum('open','private','custom') NOT NULL DEFAULT 'open', + `groups` text DEFAULT NULL, + `whitelist` text DEFAULT NULL, + `reviewer` text DEFAULT NULL, + `PMT` text DEFAULT NULL, + `draftEpics` mediumint(8) NOT NULL DEFAULT 0, + `activeEpics` mediumint(8) NOT NULL DEFAULT 0, + `changingEpics` mediumint(8) NOT NULL DEFAULT 0, + `reviewingEpics` mediumint(8) NOT NULL DEFAULT 0, + `finishedEpics` mediumint(8) NOT NULL DEFAULT 0, + `closedEpics` mediumint(8) NOT NULL DEFAULT 0, + `totalEpics` mediumint(8) NOT NULL DEFAULT 0, + `draftRequirements` mediumint(8) NOT NULL DEFAULT 0, + `activeRequirements` mediumint(8) NOT NULL DEFAULT 0, + `changingRequirements` mediumint(8) NOT NULL DEFAULT 0, + `reviewingRequirements` mediumint(8) NOT NULL DEFAULT 0, + `finishedRequirements` mediumint(8) NOT NULL DEFAULT 0, + `closedRequirements` mediumint(8) NOT NULL DEFAULT 0, + `totalRequirements` mediumint(8) NOT NULL DEFAULT 0, + `draftStories` mediumint(8) NOT NULL DEFAULT 0, + `activeStories` mediumint(8) NOT NULL DEFAULT 0, + `changingStories` mediumint(8) NOT NULL DEFAULT 0, + `reviewingStories` mediumint(8) NOT NULL DEFAULT 0, + `finishedStories` mediumint(8) NOT NULL DEFAULT 0, + `closedStories` mediumint(8) NOT NULL DEFAULT 0, + `totalStories` mediumint(8) NOT NULL DEFAULT 0, + `unresolvedBugs` mediumint(8) NOT NULL DEFAULT 0, + `closedBugs` mediumint(8) NOT NULL DEFAULT 0, + `fixedBugs` mediumint(8) NOT NULL DEFAULT 0, + `totalBugs` mediumint(8) NOT NULL DEFAULT 0, + `plans` mediumint(8) NOT NULL DEFAULT 0, + `releases` mediumint(8) NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `createdVersion` varchar(20) NOT NULL DEFAULT '', + `closedDate` date DEFAULT NULL, + `order` mediumint(8) unsigned NOT NULL DEFAULT 0, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `acl` (`acl`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_productplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` varchar(255) NOT NULL DEFAULT '0', + `parent` mediumint(9) NOT NULL DEFAULT 0, + `title` varchar(90) NOT NULL DEFAULT '', + `status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait', + `desc` mediumtext DEFAULT NULL, + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `finishedDate` datetime DEFAULT NULL, + `closedDate` datetime DEFAULT NULL, + `order` text DEFAULT NULL, + `closedReason` varchar(20) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `end` (`end`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_programactivity` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `process` mediumint(8) NOT NULL DEFAULT 0, + `activity` mediumint(8) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `content` text DEFAULT NULL, + `reason` varchar(255) NOT NULL DEFAULT '', + `result` char(30) NOT NULL DEFAULT '', + `linkedBy` char(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_programoutput` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `process` mediumint(8) NOT NULL DEFAULT 0, + `activity` mediumint(8) NOT NULL DEFAULT 0, + `output` mediumint(8) NOT NULL DEFAULT 0, + `content` text DEFAULT NULL, + `name` varchar(255) NOT NULL DEFAULT '', + `reason` varchar(255) NOT NULL DEFAULT '', + `result` char(30) NOT NULL DEFAULT '', + `linkedBy` char(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_programprocess` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `process` mediumint(8) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT '', + `abbr` char(30) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `reason` varchar(255) NOT NULL DEFAULT '', + `linkedBy` char(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_programreport` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `template` mediumint(8) NOT NULL DEFAULT 0, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `params` text DEFAULT NULL, + `content` text DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_project` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL DEFAULT 0, + `charter` mediumint(8) NOT NULL DEFAULT 0, + `model` char(30) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT 'sprint', + `category` char(30) NOT NULL DEFAULT '', + `lifetime` char(30) NOT NULL DEFAULT '', + `budget` varchar(30) NOT NULL DEFAULT '0', + `budgetUnit` char(30) NOT NULL DEFAULT 'CNY', + `attribute` varchar(30) NOT NULL DEFAULT '', + `percent` float unsigned NOT NULL DEFAULT 0, + `milestone` enum('0','1') NOT NULL DEFAULT '0', + `output` text DEFAULT NULL, + `auth` char(30) NOT NULL DEFAULT '', + `storyType` char(30) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `path` varchar(255) NOT NULL DEFAULT '', + `grade` tinyint(3) unsigned NOT NULL DEFAULT 0, + `name` varchar(90) NOT NULL DEFAULT '', + `code` varchar(45) NOT NULL DEFAULT '', + `hasProduct` tinyint(1) unsigned NOT NULL DEFAULT 1, + `workflowGroup` int(8) NOT NULL DEFAULT 0, + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `firstEnd` date DEFAULT NULL, + `realBegan` date DEFAULT NULL, + `realEnd` date DEFAULT NULL, + `days` smallint(6) unsigned NOT NULL DEFAULT 0, + `status` varchar(10) NOT NULL DEFAULT '', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `pri` enum('1','2','3','4') NOT NULL DEFAULT '1', + `desc` mediumtext DEFAULT NULL, + `version` smallint(6) NOT NULL DEFAULT 0, + `parentVersion` smallint(6) NOT NULL DEFAULT 0, + `planDuration` int(11) NOT NULL DEFAULT 0, + `realDuration` int(11) NOT NULL DEFAULT 0, + `progress` decimal(5,2) NOT NULL DEFAULT 0.00, + `estimate` float NOT NULL DEFAULT 0, + `left` float NOT NULL DEFAULT 0, + `consumed` float NOT NULL DEFAULT 0, + `teamCount` int(11) NOT NULL DEFAULT 0, + `market` mediumint(8) NOT NULL DEFAULT 0, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `openedVersion` varchar(20) NOT NULL DEFAULT '', + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `closedReason` varchar(20) NOT NULL DEFAULT '', + `canceledBy` varchar(30) NOT NULL DEFAULT '', + `canceledDate` datetime DEFAULT NULL, + `suspendedDate` date DEFAULT NULL, + `PO` varchar(30) NOT NULL DEFAULT '', + `PM` varchar(30) NOT NULL DEFAULT '', + `QD` varchar(30) NOT NULL DEFAULT '', + `RD` varchar(30) NOT NULL DEFAULT '', + `team` varchar(90) NOT NULL DEFAULT '', + `acl` char(30) NOT NULL DEFAULT 'open', + `whitelist` text DEFAULT NULL, + `order` mediumint(8) unsigned NOT NULL DEFAULT 0, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `stageBy` enum('project','product') NOT NULL DEFAULT 'product', + `displayCards` smallint(6) NOT NULL DEFAULT 0, + `fluidBoard` enum('0','1') NOT NULL DEFAULT '0', + `multiple` enum('0','1') NOT NULL DEFAULT '1', + `parallel` mediumint(9) NOT NULL DEFAULT 0, + `enabled` enum('on','off') NOT NULL DEFAULT 'on', + `linkType` varchar(30) NOT NULL DEFAULT 'plan', + `colWidth` smallint(6) NOT NULL DEFAULT 264, + `minColWidth` smallint(6) NOT NULL DEFAULT 200, + `maxColWidth` smallint(6) NOT NULL DEFAULT 384, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `begin` (`begin`), + KEY `end` (`end`), + KEY `status` (`status`), + KEY `acl` (`acl`), + KEY `order` (`order`), + KEY `project` (`project`), + KEY `type_order` (`type`,`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_projectadmin` ( + `group` smallint(6) NOT NULL DEFAULT 0, + `account` char(30) NOT NULL DEFAULT '', + `programs` text DEFAULT NULL, + `projects` text DEFAULT NULL, + `products` text DEFAULT NULL, + `executions` text DEFAULT NULL, + UNIQUE KEY `group_account` (`group`,`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_projectcase` ( + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `case` mediumint(8) unsigned NOT NULL DEFAULT 0, + `count` mediumint(8) unsigned NOT NULL DEFAULT 1, + `version` smallint(6) NOT NULL DEFAULT 1, + `order` smallint(6) unsigned NOT NULL DEFAULT 0, + UNIQUE KEY `project` (`project`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_projectproduct` ( + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` mediumint(8) unsigned NOT NULL DEFAULT 0, + `plan` varchar(255) NOT NULL DEFAULT '', + `roadmap` varchar(255) NOT NULL DEFAULT '', + UNIQUE KEY `project_product` (`project`,`product`,`branch`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_projectspec` ( + `project` mediumint(8) NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `milestone` enum('0','1') NOT NULL DEFAULT '0', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + UNIQUE KEY `project` (`project`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_projectstory` ( + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` mediumint(8) unsigned NOT NULL DEFAULT 0, + `story` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 1, + `order` smallint(6) unsigned NOT NULL DEFAULT 0, + UNIQUE KEY `project` (`project`,`story`), + KEY `story` (`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_queue` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `cron` mediumint(9) NOT NULL, + `type` varchar(255) NOT NULL, + `command` text NOT NULL, + `status` enum('wait','doing','done') NOT NULL DEFAULT 'wait', + `execId` int(11) DEFAULT NULL, + `createdDate` datetime NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `status_createdDate` (`status`,`createdDate`), + KEY `cron_createdDate` (`cron`,`createdDate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_relation` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) NOT NULL DEFAULT 0, + `product` mediumint(8) NOT NULL DEFAULT 0, + `execution` mediumint(8) NOT NULL DEFAULT 0, + `AType` char(30) NOT NULL DEFAULT '', + `AID` mediumint(8) NOT NULL DEFAULT 0, + `AVersion` char(30) NOT NULL DEFAULT '', + `relation` char(30) NOT NULL DEFAULT '', + `BType` char(30) NOT NULL DEFAULT '', + `BID` mediumint(8) NOT NULL DEFAULT 0, + `BVersion` char(30) NOT NULL DEFAULT '', + `extra` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `relation` (`product`,`relation`,`AType`,`BType`,`AID`,`BID`), + KEY `AID` (`AType`,`AID`), + KEY `BID` (`BType`,`BID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_relationoftasks` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `execution` mediumint(8) unsigned NOT NULL, + `pretask` mediumint(8) unsigned NOT NULL, + `condition` enum('begin','end') NOT NULL, + `task` mediumint(8) unsigned NOT NULL, + `action` enum('begin','end') NOT NULL, + PRIMARY KEY (`id`), + KEY `relationoftasks` (`execution`,`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_release` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` varchar(255) NOT NULL DEFAULT '0', + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` varchar(255) NOT NULL DEFAULT '0', + `shadow` mediumint(8) unsigned NOT NULL DEFAULT 0, + `build` varchar(255) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL DEFAULT '', + `system` mediumint(8) unsigned NOT NULL DEFAULT 0, + `releases` varchar(255) NOT NULL DEFAULT '', + `marker` enum('0','1') NOT NULL DEFAULT '0', + `date` date DEFAULT NULL, + `releasedDate` date DEFAULT NULL, + `stories` text DEFAULT NULL, + `bugs` text DEFAULT NULL, + `leftBugs` text DEFAULT NULL, + `desc` mediumtext DEFAULT NULL, + `mailto` text DEFAULT NULL, + `notify` varchar(255) NOT NULL DEFAULT '', + `status` varchar(20) NOT NULL DEFAULT 'normal', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `build` (`build`), + KEY `idx_system` (`system`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_releaserelated` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `release` int(11) unsigned NOT NULL, + `objectID` int(11) unsigned NOT NULL, + `objectType` varchar(10) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`release`,`objectID`,`objectType`), + KEY `objectID` (`objectID`), + KEY `objectType` (`objectType`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_repo` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `product` varchar(255) NOT NULL DEFAULT '', + `projects` varchar(255) NOT NULL DEFAULT '', + `name` varchar(255) NOT NULL DEFAULT '', + `path` varchar(255) NOT NULL DEFAULT '', + `prefix` varchar(100) NOT NULL DEFAULT '', + `encoding` varchar(20) NOT NULL DEFAULT '', + `SCM` varchar(10) NOT NULL DEFAULT '', + `client` varchar(100) NOT NULL DEFAULT '', + `serviceHost` varchar(50) NOT NULL DEFAULT '', + `serviceProject` varchar(100) NOT NULL DEFAULT '', + `commits` mediumint(8) unsigned NOT NULL DEFAULT 0, + `account` varchar(30) NOT NULL DEFAULT '', + `password` varchar(30) NOT NULL DEFAULT '', + `encrypt` varchar(30) NOT NULL DEFAULT 'plain', + `acl` text DEFAULT NULL, + `synced` tinyint(1) NOT NULL DEFAULT 0, + `lastSync` datetime DEFAULT NULL, + `lastCommit` datetime DEFAULT NULL, + `desc` text DEFAULT NULL, + `extra` char(30) NOT NULL DEFAULT '', + `preMerge` enum('0','1') NOT NULL DEFAULT '0', + `job` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fileServerUrl` text DEFAULT NULL, + `fileServerAccount` varchar(40) NOT NULL DEFAULT '', + `fileServerPassword` varchar(100) NOT NULL DEFAULT '', + `deleted` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_repobranch` ( + `repo` mediumint(8) unsigned NOT NULL DEFAULT 0, + `revision` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` varchar(255) NOT NULL DEFAULT '', + UNIQUE KEY `repo_revision_branch` (`repo`,`revision`,`branch`), + KEY `branch` (`branch`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_repofiles` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `repo` mediumint(8) unsigned NOT NULL DEFAULT 0, + `revision` mediumint(8) unsigned NOT NULL DEFAULT 0, + `path` varchar(255) NOT NULL DEFAULT '', + `oldPath` varchar(255) NOT NULL DEFAULT '', + `parent` varchar(255) NOT NULL DEFAULT '', + `type` varchar(20) NOT NULL DEFAULT '', + `action` char(1) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `path` (`path`), + KEY `parent` (`parent`), + KEY `repo` (`repo`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_repohistory` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `repo` mediumint(9) NOT NULL DEFAULT 0, + `revision` varchar(40) NOT NULL DEFAULT '', + `commit` mediumint(8) unsigned NOT NULL DEFAULT 0, + `comment` text DEFAULT NULL, + `committer` varchar(100) NOT NULL DEFAULT '', + `time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `repo` (`repo`), + KEY `revision` (`revision`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_report` ( + `id` mediumint(9) NOT NULL AUTO_INCREMENT, + `code` varchar(100) NOT NULL DEFAULT '', + `name` text DEFAULT NULL, + `dimension` int(8) NOT NULL DEFAULT 0, + `module` varchar(100) NOT NULL DEFAULT '', + `sql` text DEFAULT NULL, + `vars` text DEFAULT NULL, + `langs` text DEFAULT NULL, + `params` text DEFAULT NULL, + `step` tinyint(1) NOT NULL DEFAULT 2, + `desc` text DEFAULT NULL, + `addedBy` char(30) NOT NULL DEFAULT '', + `addedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_researchplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `customer` varchar(255) NOT NULL DEFAULT '', + `stakeholder` varchar(255) NOT NULL DEFAULT '', + `objective` varchar(255) NOT NULL DEFAULT '', + `begin` datetime DEFAULT NULL, + `end` datetime DEFAULT NULL, + `location` varchar(255) NOT NULL DEFAULT '', + `team` varchar(255) NOT NULL DEFAULT '', + `method` enum('','videoConference','interview','questionnaire','telephoneInterview') NOT NULL DEFAULT '', + `outline` mediumtext DEFAULT NULL, + `schedule` mediumtext DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_researchreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `relatedPlan` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `author` varchar(30) NOT NULL DEFAULT '', + `content` mediumtext DEFAULT NULL, + `customer` varchar(255) NOT NULL DEFAULT '', + `researchObjects` varchar(255) NOT NULL DEFAULT '', + `begin` datetime DEFAULT NULL, + `end` datetime DEFAULT NULL, + `location` varchar(255) NOT NULL DEFAULT '', + `method` enum('','videoConference','interview','questionnaire','telephoneInterview') NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_review` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `object` mediumint(8) NOT NULL DEFAULT 0, + `template` mediumint(8) NOT NULL DEFAULT 0, + `doc` varchar(255) NOT NULL DEFAULT '', + `docVersion` varchar(255) NOT NULL DEFAULT '', + `status` char(30) NOT NULL DEFAULT '', + `reviewedBy` varchar(255) NOT NULL DEFAULT '', + `auditedBy` varchar(255) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `begin` date DEFAULT NULL, + `deadline` date DEFAULT NULL, + `lastReviewedBy` varchar(255) NOT NULL DEFAULT '', + `lastReviewedDate` date DEFAULT NULL, + `lastAuditedBy` varchar(255) NOT NULL DEFAULT '', + `lastAuditedDate` date DEFAULT NULL, + `toAuditBy` varchar(30) NOT NULL DEFAULT '', + `toAuditDate` datetime DEFAULT NULL, + `lastEditedBy` varchar(255) NOT NULL DEFAULT '', + `lastEditedDate` date DEFAULT NULL, + `result` char(30) NOT NULL DEFAULT '', + `auditResult` char(30) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_reviewcl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL DEFAULT '', + `object` char(30) NOT NULL DEFAULT '', + `category` char(30) NOT NULL DEFAULT '', + `type` varchar(255) NOT NULL DEFAULT '', + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `order` mediumint(8) DEFAULT 0, + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_reviewissue` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `review` mediumint(8) NOT NULL DEFAULT 0, + `approval` mediumint(8) NOT NULL DEFAULT 0, + `injection` mediumint(8) NOT NULL DEFAULT 0, + `identify` mediumint(8) NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT 'review', + `listID` mediumint(8) NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `opinion` mediumtext DEFAULT NULL, + `opinionDate` date DEFAULT NULL, + `status` char(30) NOT NULL DEFAULT '', + `resolution` char(30) NOT NULL DEFAULT '', + `resolutionBy` char(30) NOT NULL DEFAULT '', + `resolutionDate` date DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_reviewlist` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL DEFAULT '', + `object` char(30) NOT NULL DEFAULT '', + `category` char(30) NOT NULL DEFAULT '', + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_reviewresult` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `review` mediumint(8) NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT 'review', + `result` char(30) NOT NULL DEFAULT '', + `opinion` text DEFAULT NULL, + `reviewer` char(30) NOT NULL DEFAULT '', + `remainIssue` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `consumed` float NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `reviewer` (`review`,`reviewer`,`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_risk` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` varchar(255) NOT NULL DEFAULT '', + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `source` char(30) NOT NULL DEFAULT '', + `category` char(30) NOT NULL DEFAULT '', + `strategy` char(30) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT 'active', + `impact` char(30) NOT NULL DEFAULT '', + `probability` char(30) NOT NULL DEFAULT '', + `rate` char(30) NOT NULL DEFAULT '', + `pri` char(30) NOT NULL DEFAULT '', + `identifiedDate` date DEFAULT NULL, + `prevention` mediumtext DEFAULT NULL, + `remedy` mediumtext DEFAULT NULL, + `plannedClosedDate` date DEFAULT NULL, + `actualClosedDate` date DEFAULT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT 0, + `from` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 1, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `resolution` mediumtext DEFAULT NULL, + `resolvedBy` varchar(30) NOT NULL DEFAULT '', + `activateBy` varchar(30) NOT NULL DEFAULT '', + `activateDate` date DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` date DEFAULT NULL, + `cancelBy` varchar(30) NOT NULL DEFAULT '', + `cancelDate` date DEFAULT NULL, + `cancelReason` char(30) NOT NULL DEFAULT '', + `hangupBy` varchar(30) NOT NULL DEFAULT '', + `hangupDate` date DEFAULT NULL, + `trackedBy` varchar(30) NOT NULL DEFAULT '', + `trackedDate` date DEFAULT NULL, + `assignedDate` date DEFAULT NULL, + `approvedDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_riskissue` ( + `risk` mediumint(8) unsigned NOT NULL DEFAULT 0, + `issue` mediumint(8) unsigned NOT NULL DEFAULT 0, + UNIQUE KEY `risk_issue` (`risk`,`issue`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_roadmap` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `product` mediumint(8) NOT NULL DEFAULT 0, + `branch` mediumint(8) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `status` char(30) NOT NULL DEFAULT '', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `desc` longtext DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `closedBy` char(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `closedReason` enum('done','canceled') DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_roadmapstory` ( + `roadmap` mediumint(8) unsigned NOT NULL DEFAULT 0, + `story` mediumint(8) unsigned NOT NULL DEFAULT 0, + `order` mediumint(8) unsigned NOT NULL, + UNIQUE KEY `roadmap_story` (`roadmap`,`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_scene` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `sort` int(11) unsigned NOT NULL DEFAULT 0, + `openedBy` char(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `parent` int(11) NOT NULL DEFAULT 0, + `grade` tinyint(3) NOT NULL DEFAULT 0, + `path` varchar(1000) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_score` ( + `id` bigint(12) unsigned NOT NULL AUTO_INCREMENT, + `account` varchar(30) NOT NULL DEFAULT '', + `module` varchar(30) NOT NULL DEFAULT '', + `method` varchar(30) NOT NULL DEFAULT '', + `desc` varchar(250) NOT NULL DEFAULT '', + `before` int(11) NOT NULL DEFAULT 0, + `score` int(11) NOT NULL DEFAULT 0, + `after` int(11) NOT NULL DEFAULT 0, + `time` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `module` (`module`), + KEY `method` (`method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_screen` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `dimension` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `acl` enum('open','private') NOT NULL DEFAULT 'open', + `whitelist` text DEFAULT NULL, + `cover` mediumtext DEFAULT NULL, + `scheme` mediumtext DEFAULT NULL, + `status` enum('draft','published') NOT NULL DEFAULT 'draft', + `builtin` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` char(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_searchdict` ( + `key` smallint(6) unsigned NOT NULL DEFAULT 0, + `value` char(3) NOT NULL DEFAULT '', + UNIQUE KEY `key_value` (`key`,`value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_searchindex` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `objectType` char(20) NOT NULL DEFAULT '', + `objectID` mediumint(9) NOT NULL DEFAULT 0, + `title` text DEFAULT NULL, + `content` text DEFAULT NULL, + `addedDate` datetime DEFAULT NULL, + `editedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `object` (`objectType`,`objectID`), + KEY `addedDate` (`addedDate`), + FULLTEXT KEY `title_content` (`title`,`content`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_serverroom` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(128) NOT NULL DEFAULT '', + `city` varchar(128) NOT NULL DEFAULT '', + `line` varchar(20) NOT NULL DEFAULT '', + `bandwidth` varchar(128) NOT NULL DEFAULT '', + `provider` varchar(128) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` char(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_session` ( + `id` varchar(32) NOT NULL, + `data` mediumtext DEFAULT NULL, + `timestamp` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `timestamp` (`timestamp`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_solution` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(50) NOT NULL DEFAULT '', + `appID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `appName` char(50) NOT NULL DEFAULT '', + `appVersion` char(20) NOT NULL DEFAULT '', + `version` char(50) NOT NULL DEFAULT '', + `chart` char(50) NOT NULL DEFAULT '', + `cover` varchar(255) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `introduction` varchar(255) NOT NULL DEFAULT '', + `source` char(20) NOT NULL DEFAULT '', + `channel` char(20) NOT NULL DEFAULT '', + `components` text DEFAULT NULL, + `status` char(20) NOT NULL DEFAULT '', + `deleted` tinyint(1) NOT NULL DEFAULT 0, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdAt` datetime DEFAULT NULL, + `updatedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_solutions` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `contents` text NOT NULL, + `support` text NOT NULL, + `measures` text NOT NULL, + `type` char(30) NOT NULL DEFAULT '', + `addedBy` varchar(30) NOT NULL DEFAULT '', + `addedDate` date DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_space` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(200) NOT NULL, + `k8space` char(64) NOT NULL, + `owner` char(30) NOT NULL, + `default` tinyint(1) NOT NULL DEFAULT 0, + `createdAt` datetime DEFAULT NULL, + `deleted` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_sqlbuilder` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectID` mediumint(8) NOT NULL, + `objectType` varchar(50) NOT NULL, + `sql` text DEFAULT NULL, + `setting` text DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_sqlview` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(90) NOT NULL DEFAULT '', + `code` varchar(45) NOT NULL DEFAULT '', + `sql` text DEFAULT NULL, + `desc` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_stage` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL DEFAULT '', + `percent` varchar(255) NOT NULL DEFAULT '', + `type` varchar(255) NOT NULL DEFAULT '', + `projectType` varchar(255) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_stakeholder` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `objectID` mediumint(8) NOT NULL DEFAULT 0, + `objectType` char(30) NOT NULL DEFAULT '', + `user` char(30) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT '', + `key` enum('0','1') NOT NULL DEFAULT '0', + `from` char(30) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `editedBy` char(30) NOT NULL DEFAULT '', + `editedDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `objectID` (`objectID`), + KEY `objectType` (`objectType`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_story` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `parent` mediumint(9) NOT NULL DEFAULT 0, + `isParent` enum('0','1') NOT NULL DEFAULT '0', + `root` mediumint(9) NOT NULL DEFAULT 0, + `path` text DEFAULT NULL, + `grade` smallint(6) NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` mediumint(8) unsigned NOT NULL DEFAULT 0, + `plan` text DEFAULT NULL, + `source` varchar(20) NOT NULL DEFAULT '', + `sourceNote` varchar(255) NOT NULL DEFAULT '', + `fromBug` mediumint(8) unsigned NOT NULL DEFAULT 0, + `feedback` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `keywords` varchar(255) NOT NULL DEFAULT '', + `type` varchar(30) NOT NULL DEFAULT 'story', + `category` varchar(30) NOT NULL DEFAULT 'feature', + `pri` tinyint(3) unsigned NOT NULL DEFAULT 3, + `estimate` float unsigned NOT NULL DEFAULT 0, + `status` enum('','changing','active','draft','closed','reviewing','launched','developing') NOT NULL DEFAULT '', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL DEFAULT '', + `stage` enum('','wait','inroadmap','incharter','planned','projected','designing','designed','developing','developed','testing','tested','verified','rejected','delivering','delivered','released','closed') NOT NULL DEFAULT 'wait', + `stagedBy` char(30) NOT NULL DEFAULT '', + `mailto` text DEFAULT NULL, + `lib` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fromStory` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fromVersion` smallint(6) NOT NULL DEFAULT 1, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `approvedDate` date DEFAULT NULL, + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `changedBy` varchar(30) NOT NULL DEFAULT '', + `changedDate` datetime DEFAULT NULL, + `reviewedBy` varchar(255) NOT NULL DEFAULT '', + `reviewedDate` datetime DEFAULT NULL, + `releasedDate` datetime DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `closedReason` varchar(30) NOT NULL DEFAULT '', + `activatedDate` datetime DEFAULT NULL, + `toBug` mediumint(8) unsigned NOT NULL DEFAULT 0, + `linkStories` varchar(255) NOT NULL DEFAULT '', + `linkRequirements` varchar(255) NOT NULL DEFAULT '', + `twins` varchar(255) NOT NULL DEFAULT '', + `duplicateStory` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 1, + `parentVersion` smallint(6) NOT NULL DEFAULT 0, + `demandVersion` smallint(6) NOT NULL DEFAULT 0, + `storyChanged` enum('0','1') NOT NULL DEFAULT '0', + `feedbackBy` varchar(100) NOT NULL DEFAULT '', + `notifyEmail` varchar(100) NOT NULL DEFAULT '', + `BSA` char(30) NOT NULL DEFAULT '', + `duration` char(30) NOT NULL DEFAULT '', + `demand` mediumint(8) NOT NULL DEFAULT 0, + `submitedBy` varchar(30) NOT NULL DEFAULT '', + `roadmap` varchar(255) NOT NULL DEFAULT '', + `URChanged` enum('0','1') NOT NULL DEFAULT '0', + `unlinkReason` enum('','omit','other') NOT NULL DEFAULT '', + `retractedReason` enum('','omit','other') NOT NULL DEFAULT '', + `retractedBy` varchar(30) NOT NULL DEFAULT '', + `retractedDate` datetime DEFAULT NULL, + `verifiedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `root` (`root`), + KEY `status` (`status`), + KEY `assignedTo` (`assignedTo`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_storyestimate` ( + `story` mediumint(9) NOT NULL DEFAULT 0, + `round` smallint(6) NOT NULL DEFAULT 0, + `estimate` text DEFAULT NULL, + `average` float NOT NULL DEFAULT 0, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + UNIQUE KEY `story` (`story`,`round`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_storygrade` ( + `type` enum('story','requirement','epic') NOT NULL, + `grade` smallint(6) NOT NULL, + `name` char(30) NOT NULL, + `status` char(30) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_storyreview` ( + `story` mediumint(9) NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 0, + `reviewer` varchar(30) NOT NULL DEFAULT '', + `result` varchar(30) NOT NULL DEFAULT '', + `reviewDate` datetime DEFAULT NULL, + UNIQUE KEY `story` (`story`,`version`,`reviewer`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_storyspec` ( + `story` mediumint(9) NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `spec` mediumtext DEFAULT NULL, + `verify` mediumtext DEFAULT NULL, + `files` text DEFAULT NULL, + UNIQUE KEY `story` (`story`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_storystage` ( + `story` mediumint(8) unsigned NOT NULL DEFAULT 0, + `branch` mediumint(8) unsigned NOT NULL DEFAULT 0, + `stage` varchar(50) NOT NULL DEFAULT '', + `stagedBy` char(30) NOT NULL DEFAULT '', + UNIQUE KEY `story_branch` (`story`,`branch`), + KEY `story` (`story`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_suitecase` ( + `suite` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `case` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` smallint(5) unsigned NOT NULL DEFAULT 0, + UNIQUE KEY `suitecase` (`suite`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_system` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) NOT NULL DEFAULT '', + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `integrated` enum('0','1') NOT NULL DEFAULT '0', + `latestRelease` mediumint(8) unsigned NOT NULL DEFAULT 0, + `latestDate` datetime DEFAULT NULL, + `children` varchar(255) NOT NULL DEFAULT '', + `status` enum('active','inactive') NOT NULL DEFAULT 'active', + `desc` mediumtext DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_product` (`product`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_task` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `parent` mediumint(8) NOT NULL DEFAULT 0, + `isParent` tinyint(1) NOT NULL DEFAULT 0, + `path` text DEFAULT NULL, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` mediumint(8) unsigned NOT NULL DEFAULT 0, + `design` mediumint(8) unsigned NOT NULL DEFAULT 0, + `story` mediumint(8) unsigned NOT NULL DEFAULT 0, + `storyVersion` smallint(6) NOT NULL DEFAULT 1, + `designVersion` smallint(6) unsigned NOT NULL DEFAULT 1, + `fromBug` mediumint(8) unsigned NOT NULL DEFAULT 0, + `feedback` mediumint(8) unsigned NOT NULL DEFAULT 0, + `fromIssue` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(20) NOT NULL DEFAULT '', + `mode` varchar(10) NOT NULL DEFAULT '', + `pri` tinyint(3) unsigned NOT NULL DEFAULT 0, + `estimate` float unsigned NOT NULL DEFAULT 0, + `consumed` float unsigned NOT NULL DEFAULT 0, + `left` float unsigned NOT NULL DEFAULT 0, + `deadline` date DEFAULT NULL, + `status` enum('wait','doing','done','pause','cancel','closed') NOT NULL DEFAULT 'wait', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `color` char(7) NOT NULL DEFAULT '', + `mailto` text DEFAULT NULL, + `keywords` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `version` smallint(6) NOT NULL DEFAULT 0, + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `estStarted` date DEFAULT NULL, + `realStarted` datetime DEFAULT NULL, + `finishedBy` varchar(30) NOT NULL DEFAULT '', + `finishedDate` datetime DEFAULT NULL, + `finishedList` text DEFAULT NULL, + `canceledBy` varchar(30) NOT NULL DEFAULT '', + `canceledDate` datetime DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `planDuration` int(11) NOT NULL DEFAULT 0, + `realDuration` int(11) NOT NULL DEFAULT 0, + `closedReason` varchar(30) NOT NULL DEFAULT '', + `lastEditedBy` varchar(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `activatedDate` datetime DEFAULT NULL, + `order` mediumint(8) unsigned NOT NULL DEFAULT 0, + `repo` mediumint(8) unsigned NOT NULL DEFAULT 0, + `mr` mediumint(8) unsigned NOT NULL DEFAULT 0, + `entry` varchar(255) NOT NULL DEFAULT '', + `lines` varchar(10) NOT NULL DEFAULT '', + `v1` varchar(40) NOT NULL DEFAULT '', + `v2` varchar(40) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + KEY `execution` (`execution`), + KEY `story` (`story`), + KEY `parent` (`parent`), + KEY `assignedTo` (`assignedTo`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_taskestimate` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `task` mediumint(8) unsigned NOT NULL DEFAULT 0, + `date` date DEFAULT NULL, + `left` float unsigned NOT NULL DEFAULT 0, + `consumed` float unsigned NOT NULL DEFAULT 0, + `account` char(30) NOT NULL DEFAULT '', + `work` text DEFAULT NULL, + `order` tinyint(3) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `task` (`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_taskspec` ( + `task` mediumint(8) NOT NULL DEFAULT 0, + `version` smallint(6) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `estStarted` date DEFAULT NULL, + `deadline` date DEFAULT NULL, + UNIQUE KEY `task` (`task`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_taskteam` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `task` mediumint(8) unsigned NOT NULL DEFAULT 0, + `account` char(30) NOT NULL DEFAULT '', + `estimate` decimal(12,2) NOT NULL DEFAULT 0.00, + `consumed` decimal(12,2) NOT NULL DEFAULT 0.00, + `left` decimal(12,2) NOT NULL DEFAULT 0.00, + `transfer` char(30) NOT NULL DEFAULT '', + `status` enum('wait','doing','done','cancel','closed') NOT NULL DEFAULT 'wait', + `storyVersion` smallint(6) NOT NULL DEFAULT 1, + `order` int(8) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `task` (`task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_team` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `root` mediumint(8) unsigned NOT NULL DEFAULT 0, + `type` enum('project','task','execution') NOT NULL DEFAULT 'project', + `account` char(30) NOT NULL DEFAULT '', + `role` char(30) NOT NULL DEFAULT '', + `position` varchar(30) NOT NULL DEFAULT '', + `limited` char(8) NOT NULL DEFAULT 'no', + `join` date DEFAULT NULL, + `days` smallint(5) unsigned NOT NULL DEFAULT 0, + `hours` float(3,1) unsigned NOT NULL DEFAULT 0.0, + `estimate` decimal(12,2) unsigned NOT NULL DEFAULT 0.00, + `consumed` decimal(12,2) unsigned NOT NULL DEFAULT 0.00, + `left` decimal(12,2) unsigned NOT NULL DEFAULT 0.00, + `order` tinyint(3) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `team` (`root`,`type`,`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_testreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `tasks` varchar(255) NOT NULL DEFAULT '', + `builds` varchar(255) NOT NULL DEFAULT '', + `title` varchar(255) NOT NULL DEFAULT '', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `owner` char(30) NOT NULL DEFAULT '', + `members` text DEFAULT NULL, + `stories` text DEFAULT NULL, + `bugs` text DEFAULT NULL, + `cases` text DEFAULT NULL, + `report` text DEFAULT NULL, + `objectType` varchar(20) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_testresult` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `run` mediumint(8) unsigned NOT NULL DEFAULT 0, + `case` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` smallint(5) unsigned NOT NULL DEFAULT 0, + `job` mediumint(8) unsigned NOT NULL DEFAULT 0, + `compile` mediumint(8) unsigned NOT NULL DEFAULT 0, + `caseResult` char(30) NOT NULL DEFAULT '', + `stepResults` text DEFAULT NULL, + `ZTFResult` text DEFAULT NULL, + `node` int(8) unsigned NOT NULL DEFAULT 0, + `lastRunner` varchar(30) NOT NULL DEFAULT '', + `date` datetime DEFAULT NULL, + `duration` float NOT NULL DEFAULT 0, + `xml` text DEFAULT NULL, + `deploy` mediumint(8) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `case` (`case`), + KEY `version` (`version`), + KEY `run` (`run`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_testrun` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `task` mediumint(8) unsigned NOT NULL DEFAULT 0, + `case` mediumint(8) unsigned NOT NULL DEFAULT 0, + `version` tinyint(3) unsigned NOT NULL DEFAULT 0, + `assignedTo` char(30) NOT NULL DEFAULT '', + `lastRunner` varchar(30) NOT NULL DEFAULT '', + `lastRunDate` datetime DEFAULT NULL, + `lastRunResult` char(30) NOT NULL DEFAULT '', + `status` char(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `task` (`task`,`case`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_testsuite` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `type` varchar(20) NOT NULL DEFAULT '', + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + `addedBy` char(30) NOT NULL DEFAULT '', + `addedDate` datetime DEFAULT NULL, + `lastEditedBy` char(30) NOT NULL DEFAULT '', + `lastEditedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `product` (`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_testtask` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` char(90) NOT NULL DEFAULT '', + `execution` mediumint(8) unsigned NOT NULL DEFAULT 0, + `build` char(30) NOT NULL DEFAULT '', + `type` varchar(255) NOT NULL DEFAULT '', + `owner` varchar(30) NOT NULL DEFAULT '', + `pri` tinyint(3) unsigned NOT NULL DEFAULT 0, + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `realBegan` date DEFAULT NULL, + `realFinishedDate` datetime DEFAULT NULL, + `mailto` text DEFAULT NULL, + `desc` mediumtext DEFAULT NULL, + `report` text DEFAULT NULL, + `status` enum('blocked','doing','wait','done') NOT NULL DEFAULT 'wait', + `testreport` mediumint(8) unsigned NOT NULL DEFAULT 0, + `auto` varchar(10) NOT NULL DEFAULT 'no', + `subStatus` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `members` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `product` (`product`), + KEY `build` (`build`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_ticket` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `product` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` mediumint(8) unsigned NOT NULL DEFAULT 0, + `title` varchar(255) NOT NULL DEFAULT '', + `type` varchar(30) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `openedBuild` varchar(255) NOT NULL DEFAULT '', + `feedback` mediumint(8) NOT NULL DEFAULT 0, + `assignedTo` varchar(255) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `realStarted` datetime DEFAULT NULL, + `startedBy` varchar(255) NOT NULL DEFAULT '', + `startedDate` datetime DEFAULT NULL, + `deadline` date DEFAULT NULL, + `pri` tinyint(3) unsigned NOT NULL DEFAULT 0, + `estimate` float unsigned NOT NULL DEFAULT 0, + `left` float unsigned NOT NULL DEFAULT 0, + `status` varchar(30) NOT NULL DEFAULT '', + `openedBy` varchar(30) NOT NULL DEFAULT '', + `openedDate` datetime DEFAULT NULL, + `activatedCount` int(11) NOT NULL DEFAULT 0, + `activatedBy` varchar(30) NOT NULL DEFAULT '', + `activatedDate` datetime DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `closedReason` varchar(30) NOT NULL DEFAULT '', + `finishedBy` varchar(30) NOT NULL DEFAULT '', + `finishedDate` datetime DEFAULT NULL, + `resolvedBy` varchar(30) NOT NULL DEFAULT '', + `resolvedDate` datetime DEFAULT NULL, + `resolution` text DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `keywords` varchar(255) NOT NULL DEFAULT '', + `repeatTicket` mediumint(8) NOT NULL DEFAULT 0, + `mailto` varchar(255) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `subStatus` varchar(30) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `product` (`product`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_ticketrelation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `ticketId` mediumint(8) unsigned NOT NULL DEFAULT 0, + `objectId` mediumint(8) NOT NULL DEFAULT 0, + `objectType` varchar(100) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + KEY `ticketId` (`ticketId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_ticketsource` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `ticketId` mediumint(8) unsigned NOT NULL DEFAULT 0, + `customer` varchar(100) NOT NULL DEFAULT '', + `contact` varchar(100) NOT NULL DEFAULT '', + `notifyEmail` varchar(100) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ticketId` (`ticketId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_todo` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `date` date DEFAULT NULL, + `begin` smallint(4) unsigned zerofill NOT NULL DEFAULT 0000, + `end` smallint(4) unsigned zerofill NOT NULL DEFAULT 0000, + `feedback` mediumint(8) unsigned NOT NULL DEFAULT 0, + `type` char(15) NOT NULL DEFAULT '', + `cycle` tinyint(3) unsigned NOT NULL DEFAULT 0, + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `pri` tinyint(3) unsigned NOT NULL DEFAULT 0, + `name` char(150) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `status` enum('wait','doing','done','closed') NOT NULL DEFAULT 'wait', + `private` tinyint(1) NOT NULL DEFAULT 0, + `config` varchar(1000) NOT NULL DEFAULT '', + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedBy` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `finishedBy` varchar(30) NOT NULL DEFAULT '', + `finishedDate` datetime DEFAULT NULL, + `closedBy` varchar(30) NOT NULL DEFAULT '', + `closedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `assignedTo` (`assignedTo`), + KEY `finishedBy` (`finishedBy`), + KEY `date` (`date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_traincategory` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `name` char(30) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `path` char(255) NOT NULL DEFAULT '', + `grade` tinyint(3) NOT NULL DEFAULT 0, + `order` mediumint(8) NOT NULL DEFAULT 0, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `parent` (`parent`), + KEY `path` (`path`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_traincontents` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `code` varchar(50) NOT NULL DEFAULT '', + `course` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `type` varchar(30) NOT NULL DEFAULT '', + `parent` mediumint(8) unsigned NOT NULL DEFAULT 0, + `path` char(255) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `order` mediumint(8) NOT NULL DEFAULT 0, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_traincourse` ( + `id` mediumint(8) NOT NULL AUTO_INCREMENT, + `code` varchar(255) NOT NULL DEFAULT '', + `category` mediumint(8) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `status` varchar(10) NOT NULL DEFAULT '', + `teacher` varchar(30) NOT NULL DEFAULT '', + `desc` mediumtext DEFAULT NULL, + `importedStatus` enum('','wait','doing','done') NOT NULL DEFAULT '', + `lastUpdatedTime` int(10) unsigned NOT NULL DEFAULT 0, + `createdBy` varchar(255) NOT NULL DEFAULT '', + `createdDate` date DEFAULT NULL, + `editedBy` varchar(255) NOT NULL DEFAULT '', + `editedDate` date DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_trainplan` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `place` varchar(255) NOT NULL DEFAULT '', + `trainee` text DEFAULT NULL, + `lecturer` varchar(20) NOT NULL DEFAULT '', + `type` enum('inside','outside') NOT NULL DEFAULT 'inside', + `status` varchar(20) NOT NULL DEFAULT '', + `summary` mediumtext DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_trainrecords` ( + `user` char(30) NOT NULL DEFAULT '', + `objectId` mediumint(8) unsigned NOT NULL DEFAULT 0, + `objectType` varchar(10) NOT NULL DEFAULT '', + `status` varchar(10) NOT NULL DEFAULT '', + UNIQUE KEY `object` (`user`,`objectId`,`objectType`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_trip` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('trip','egress') NOT NULL DEFAULT 'trip', + `customers` varchar(20) NOT NULL DEFAULT '', + `name` char(30) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `year` char(4) NOT NULL DEFAULT '', + `begin` date DEFAULT NULL, + `end` date DEFAULT NULL, + `start` time DEFAULT NULL, + `finish` time DEFAULT NULL, + `from` char(50) NOT NULL DEFAULT '', + `to` char(50) NOT NULL DEFAULT '', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `year` (`year`), + KEY `createdBy` (`createdBy`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_user` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `company` mediumint(8) unsigned NOT NULL DEFAULT 0, + `type` char(30) NOT NULL DEFAULT 'inside', + `dept` mediumint(8) unsigned NOT NULL DEFAULT 0, + `account` char(30) NOT NULL DEFAULT '', + `password` char(32) NOT NULL DEFAULT '', + `role` char(10) NOT NULL DEFAULT '', + `realname` varchar(100) NOT NULL DEFAULT '', + `superior` char(30) DEFAULT '', + `pinyin` varchar(255) NOT NULL DEFAULT '', + `nickname` char(60) NOT NULL DEFAULT '', + `commiter` varchar(100) NOT NULL DEFAULT '', + `avatar` text DEFAULT NULL, + `birthday` date DEFAULT NULL, + `gender` enum('f','m') NOT NULL DEFAULT 'f', + `email` char(90) NOT NULL DEFAULT '', + `skype` char(90) NOT NULL DEFAULT '', + `qq` char(20) NOT NULL DEFAULT '', + `mobile` char(11) NOT NULL DEFAULT '', + `phone` char(20) NOT NULL DEFAULT '', + `weixin` varchar(90) NOT NULL DEFAULT '', + `dingding` varchar(90) NOT NULL DEFAULT '', + `slack` varchar(90) NOT NULL DEFAULT '', + `whatsapp` varchar(90) NOT NULL DEFAULT '', + `address` char(120) NOT NULL DEFAULT '', + `zipcode` char(10) NOT NULL DEFAULT '', + `nature` text DEFAULT NULL, + `analysis` text DEFAULT NULL, + `strategy` text DEFAULT NULL, + `join` date DEFAULT NULL, + `visits` mediumint(8) unsigned NOT NULL DEFAULT 0, + `visions` varchar(20) NOT NULL DEFAULT 'rnd,lite', + `ip` varchar(255) NOT NULL DEFAULT '', + `last` int(11) unsigned NOT NULL DEFAULT 0, + `fails` tinyint(5) NOT NULL DEFAULT 0, + `locked` datetime DEFAULT NULL, + `feedback` enum('0','1') NOT NULL DEFAULT '0', + `ranzhi` char(30) NOT NULL DEFAULT '', + `ldap` char(30) NOT NULL DEFAULT '', + `score` int(11) NOT NULL DEFAULT 0, + `scoreLevel` int(11) NOT NULL DEFAULT 0, + `resetToken` varchar(50) NOT NULL DEFAULT '', + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `clientStatus` enum('online','away','busy','offline','meeting') NOT NULL DEFAULT 'offline', + `clientLang` varchar(10) NOT NULL DEFAULT 'zh-cn', + PRIMARY KEY (`id`), + UNIQUE KEY `account` (`account`), + KEY `dept` (`dept`), + KEY `email` (`email`), + KEY `commiter` (`commiter`), + KEY `deleted` (`deleted`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_usercontact` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `listName` varchar(60) NOT NULL DEFAULT '', + `userList` text DEFAULT NULL, + `public` tinyint(1) NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_usergroup` ( + `account` char(30) NOT NULL DEFAULT '', + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `project` text DEFAULT NULL, + UNIQUE KEY `account` (`account`,`group`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_userquery` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `module` varchar(30) NOT NULL DEFAULT '', + `title` varchar(90) NOT NULL DEFAULT '', + `form` text DEFAULT NULL, + `sql` text DEFAULT NULL, + `shortcut` enum('0','1') NOT NULL DEFAULT '0', + `common` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `account` (`account`), + KEY `module` (`module`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_usertpl` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `type` char(30) NOT NULL DEFAULT '', + `title` varchar(150) NOT NULL DEFAULT '', + `content` text DEFAULT NULL, + `public` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_userview` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `account` char(30) NOT NULL DEFAULT '', + `programs` mediumtext DEFAULT NULL, + `products` mediumtext DEFAULT NULL, + `projects` mediumtext DEFAULT NULL, + `sprints` mediumtext DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `account` (`account`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_webhook` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(15) NOT NULL DEFAULT 'default', + `name` varchar(50) NOT NULL DEFAULT '', + `url` varchar(255) NOT NULL DEFAULT '', + `domain` varchar(255) NOT NULL DEFAULT '', + `secret` varchar(255) NOT NULL DEFAULT '', + `contentType` varchar(30) NOT NULL DEFAULT 'application/json', + `sendType` enum('sync','async') NOT NULL DEFAULT 'sync', + `products` text DEFAULT NULL, + `executions` text DEFAULT NULL, + `params` varchar(100) NOT NULL DEFAULT '', + `actions` text DEFAULT NULL, + `desc` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_weeklyreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `weekStart` date DEFAULT NULL, + `pv` float(9,2) NOT NULL DEFAULT 0.00, + `ev` float(9,2) NOT NULL DEFAULT 0.00, + `ac` float(9,2) NOT NULL DEFAULT 0.00, + `sv` float(9,2) NOT NULL DEFAULT 0.00, + `cv` float(9,2) NOT NULL DEFAULT 0.00, + `staff` smallint(5) unsigned NOT NULL DEFAULT 0, + `progress` varchar(255) NOT NULL DEFAULT '', + `workload` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `week` (`project`,`weekStart`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workestimation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `project` mediumint(8) unsigned NOT NULL DEFAULT 0, + `scale` decimal(10,2) unsigned NOT NULL DEFAULT 0.00, + `productivity` decimal(10,2) unsigned NOT NULL DEFAULT 0.00, + `duration` decimal(10,2) unsigned NOT NULL DEFAULT 0.00, + `unitLaborCost` decimal(10,2) unsigned NOT NULL DEFAULT 0.00, + `totalLaborCost` decimal(10,2) unsigned NOT NULL DEFAULT 0.00, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `assignedTo` varchar(30) NOT NULL DEFAULT '', + `assignedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `dayHour` decimal(10,2) NOT NULL DEFAULT 0.00, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflow` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `parent` varchar(30) NOT NULL DEFAULT '', + `child` varchar(30) NOT NULL DEFAULT '', + `type` varchar(10) NOT NULL DEFAULT 'flow', + `navigator` varchar(10) NOT NULL DEFAULT '', + `app` varchar(20) NOT NULL DEFAULT '', + `position` varchar(30) NOT NULL DEFAULT '', + `module` varchar(30) NOT NULL DEFAULT '', + `table` varchar(50) NOT NULL DEFAULT '', + `name` varchar(30) NOT NULL DEFAULT '', + `icon` varchar(30) NOT NULL DEFAULT 'flow', + `titleField` varchar(30) NOT NULL DEFAULT '', + `contentField` text DEFAULT NULL, + `flowchart` text DEFAULT NULL, + `js` text DEFAULT NULL, + `css` text DEFAULT NULL, + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + `buildin` tinyint(1) unsigned NOT NULL DEFAULT 0, + `role` varchar(10) NOT NULL DEFAULT 'buildin', + `belong` varchar(50) NOT NULL DEFAULT '', + `administrator` text DEFAULT NULL, + `desc` text DEFAULT NULL, + `version` varchar(10) NOT NULL DEFAULT '1.0', + `status` varchar(10) NOT NULL DEFAULT 'wait', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `approval` enum('enabled','disabled') NOT NULL DEFAULT 'disabled', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`group`,`app`,`module`,`vision`), + KEY `type` (`type`), + KEY `app` (`app`), + KEY `module` (`module`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowaction` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` varchar(30) NOT NULL DEFAULT '', + `action` varchar(50) NOT NULL DEFAULT '', + `method` varchar(50) NOT NULL DEFAULT '', + `name` varchar(50) NOT NULL DEFAULT '', + `type` enum('single','batch') NOT NULL DEFAULT 'single', + `batchMode` enum('same','different') NOT NULL DEFAULT 'different', + `extensionType` varchar(10) NOT NULL DEFAULT 'override', + `open` varchar(20) NOT NULL DEFAULT '', + `position` enum('menu','browseandview','browse','view') NOT NULL DEFAULT 'browseandview', + `layout` char(20) NOT NULL DEFAULT '', + `show` enum('dropdownlist','direct') NOT NULL DEFAULT 'dropdownlist', + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + `buildin` tinyint(1) unsigned NOT NULL DEFAULT 0, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `virtual` tinyint(1) unsigned NOT NULL DEFAULT 0, + `conditions` text DEFAULT NULL, + `verifications` text DEFAULT NULL, + `hooks` text DEFAULT NULL, + `linkages` text DEFAULT NULL, + `js` text DEFAULT NULL, + `css` text DEFAULT NULL, + `toList` char(255) NOT NULL DEFAULT '', + `blocks` text DEFAULT NULL, + `desc` text DEFAULT NULL, + `status` varchar(10) NOT NULL DEFAULT 'enable', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`group`,`module`,`action`,`vision`), + KEY `module` (`module`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowdatasource` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('system','sql','func','option','lang','category') NOT NULL DEFAULT 'option', + `name` varchar(30) NOT NULL DEFAULT '', + `code` varchar(30) NOT NULL DEFAULT '', + `datasource` text DEFAULT NULL, + `view` varchar(20) NOT NULL DEFAULT '', + `keyField` varchar(50) NOT NULL DEFAULT '', + `valueField` varchar(50) NOT NULL DEFAULT '', + `buildin` tinyint(1) unsigned NOT NULL DEFAULT 0, + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` char(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowfield` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` varchar(30) NOT NULL DEFAULT '', + `field` varchar(50) NOT NULL DEFAULT '', + `type` varchar(20) NOT NULL DEFAULT 'varchar', + `length` varchar(10) NOT NULL DEFAULT '', + `name` varchar(50) NOT NULL DEFAULT '', + `control` varchar(20) NOT NULL DEFAULT '', + `expression` text DEFAULT NULL, + `options` text DEFAULT NULL, + `default` varchar(100) NOT NULL DEFAULT '', + `rules` varchar(255) NOT NULL DEFAULT '', + `placeholder` varchar(255) NOT NULL DEFAULT '', + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + `searchOrder` smallint(5) unsigned NOT NULL DEFAULT 0, + `exportOrder` smallint(5) unsigned NOT NULL DEFAULT 0, + `canExport` enum('0','1') NOT NULL DEFAULT '0', + `canSearch` enum('0','1') NOT NULL DEFAULT '0', + `isValue` enum('0','1') NOT NULL DEFAULT '0', + `readonly` enum('0','1') NOT NULL DEFAULT '0', + `buildin` tinyint(1) unsigned NOT NULL DEFAULT 0, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `desc` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`group`,`module`,`field`), + KEY `module` (`module`), + KEY `field` (`field`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowgroup` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` varchar(10) NOT NULL DEFAULT '', + `projectModel` varchar(10) NOT NULL DEFAULT '', + `projectType` varchar(10) NOT NULL DEFAULT '', + `name` varchar(30) NOT NULL DEFAULT '', + `code` varchar(30) NOT NULL DEFAULT '', + `desc` text DEFAULT NULL, + `disabledModules` varchar(255) NOT NULL DEFAULT '', + `status` varchar(10) NOT NULL DEFAULT 'wait', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + `main` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowlabel` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` varchar(30) NOT NULL DEFAULT '', + `action` varchar(30) NOT NULL DEFAULT 'browse', + `code` varchar(30) NOT NULL DEFAULT '', + `label` varchar(255) NOT NULL DEFAULT '', + `params` text DEFAULT NULL, + `orderBy` text DEFAULT NULL, + `order` tinyint(3) NOT NULL DEFAULT 0, + `buildin` tinyint(1) unsigned NOT NULL DEFAULT 0, + `role` varchar(10) NOT NULL DEFAULT 'custom', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` char(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `module` (`module`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowlayout` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` varchar(30) NOT NULL DEFAULT '', + `action` varchar(50) NOT NULL DEFAULT '', + `ui` mediumint(8) NOT NULL DEFAULT 0, + `field` varchar(50) NOT NULL DEFAULT '', + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + `width` varchar(50) NOT NULL DEFAULT '0', + `position` text DEFAULT NULL, + `readonly` enum('0','1') NOT NULL DEFAULT '0', + `mobileShow` enum('0','1') NOT NULL DEFAULT '1', + `summary` varchar(20) NOT NULL DEFAULT '', + `defaultValue` text DEFAULT NULL, + `layoutRules` varchar(255) NOT NULL DEFAULT '', + `vision` varchar(10) NOT NULL DEFAULT 'rnd', + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`group`,`module`,`action`,`ui`,`field`,`vision`), + KEY `module` (`module`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowlinkdata` ( + `objectType` varchar(30) NOT NULL DEFAULT '', + `objectID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `linkedType` varchar(30) NOT NULL DEFAULT '', + `linkedID` mediumint(8) unsigned NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + UNIQUE KEY `unique` (`objectType`,`objectID`,`linkedType`,`linkedID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowrelation` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `prev` varchar(30) NOT NULL DEFAULT '', + `next` varchar(30) NOT NULL DEFAULT '', + `field` varchar(50) NOT NULL DEFAULT '', + `actions` varchar(20) NOT NULL DEFAULT '', + `actionCodes` text DEFAULT NULL, + `buildin` enum('0','1') NOT NULL DEFAULT '0', + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowrelationlayout` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `prev` varchar(30) NOT NULL DEFAULT '', + `next` varchar(30) NOT NULL DEFAULT '', + `action` varchar(50) NOT NULL DEFAULT '', + `ui` mediumint(8) NOT NULL DEFAULT 0, + `field` varchar(50) NOT NULL DEFAULT '', + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + UNIQUE KEY `unique` (`prev`,`next`,`action`,`ui`,`field`), + KEY `prev` (`prev`), + KEY `next` (`next`), + KEY `action` (`action`), + KEY `order` (`order`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowreport` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL, + `name` varchar(100) NOT NULL, + `type` enum('pie','line','bar') NOT NULL DEFAULT 'pie', + `countType` enum('sum','count') NOT NULL DEFAULT 'sum', + `displayType` enum('value','percent') NOT NULL DEFAULT 'value', + `dimension` varchar(130) NOT NULL, + `fields` text NOT NULL, + `order` smallint(5) unsigned NOT NULL DEFAULT 0, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowrule` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `type` enum('system','regex','func') NOT NULL DEFAULT 'regex', + `name` varchar(30) NOT NULL DEFAULT '', + `rule` text DEFAULT NULL, + `createdBy` char(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` char(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `type` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowsql` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL DEFAULT '', + `field` varchar(50) NOT NULL DEFAULT '', + `action` varchar(50) NOT NULL DEFAULT '', + `sql` text DEFAULT NULL, + `vars` text DEFAULT NULL, + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `module` (`module`), + KEY `field` (`field`), + KEY `action` (`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowui` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `group` mediumint(8) unsigned NOT NULL DEFAULT 0, + `module` varchar(30) NOT NULL, + `action` varchar(50) NOT NULL, + `name` varchar(30) NOT NULL, + `conditions` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `module` (`module`), + KEY `action` (`action`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_workflowversion` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `module` varchar(30) NOT NULL DEFAULT '', + `version` varchar(10) NOT NULL DEFAULT '', + `fields` text DEFAULT NULL, + `actions` text DEFAULT NULL, + `layouts` text DEFAULT NULL, + `sqls` text DEFAULT NULL, + `labels` text DEFAULT NULL, + `table` text DEFAULT NULL, + `datas` text DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `moduleversion` (`module`,`version`), + KEY `module` (`module`), + KEY `version` (`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +CREATE TABLE `zt_zoutput` ( + `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `activity` mediumint(8) NOT NULL DEFAULT 0, + `name` varchar(255) NOT NULL DEFAULT '', + `content` mediumtext DEFAULT NULL, + `optional` char(20) NOT NULL DEFAULT '', + `tailorNorm` varchar(255) NOT NULL DEFAULT '', + `status` varchar(30) NOT NULL DEFAULT '', + `createdBy` varchar(30) NOT NULL DEFAULT '', + `createdDate` datetime DEFAULT NULL, + `editedBy` varchar(30) NOT NULL DEFAULT '', + `editedDate` datetime DEFAULT NULL, + `order` mediumint(8) DEFAULT 0, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; diff --git a/db/update21.6.1.sql b/db/update21.6.1.sql index ea92b0ec26..169db5f37a 100644 --- a/db/update21.6.1.sql +++ b/db/update21.6.1.sql @@ -4,4 +4,4 @@ ALTER TABLE `zt_storyspec` ADD COLUMN `docs` text NULL AFTER `files`; ALTER TABLE `zt_storyspec` ADD COLUMN `docVersions` text NULL AFTER `docs`; ALTER TABLE `zt_design` ADD COLUMN `docs` text NULL AFTER `storyVersion`; ALTER TABLE `zt_design` ADD COLUMN `docVersions` text NULL AFTER `docs`; -ALTER TABLE `zt_project` ADD `taskDateLimit` varchar(30) NOT NULL DEFAULT 'auto' AFTER `linkType`; +ALTER TABLE `zt_project` ADD `taskDateLimit` varchar(30) NOT NULL DEFAULT 'auto' AFTER `linkType`; \ No newline at end of file diff --git a/db/update21.7.sql b/db/update21.7.sql new file mode 100644 index 0000000000..35374c8e93 --- /dev/null +++ b/db/update21.7.sql @@ -0,0 +1,53 @@ +DELETE FROM `zt_workflowaction` WHERE `module` = 'story' AND `action` = 'browse'; +DELETE FROM `zt_workflowlayout` WHERE `module` = 'story' AND `action` = 'browse'; + +DELETE FROM `zt_workflowaction` WHERE `module` = 'epic' AND `action` = 'browse'; +DELETE FROM `zt_workflowlayout` WHERE `module` = 'epic' AND `action` = 'browse'; + +DELETE FROM `zt_workflowaction` WHERE `module` = 'requirement' AND `action` = 'browse'; +DELETE FROM `zt_workflowlayout` WHERE `module` = 'requirement' AND `action` = 'browse'; + +UPDATE `zt_workflowaction` SET `module` = 'story', `action` = 'browse' WHERE `module` = 'product' AND `action` = 'browse'; +UPDATE `zt_workflowlayout` SET `module` = 'story', `action` = 'browse' WHERE `module` = 'product' AND `action` = 'browse'; + +UPDATE `zt_workflowaction` SET `module` = 'requirement', `action` = 'browse' WHERE `module` = 'product' AND `action` = 'requirement'; +UPDATE `zt_workflowlayout` SET `module` = 'requirement', `action` = 'browse' WHERE `module` = 'product' AND `action` = 'requirement'; + +UPDATE `zt_workflowaction` SET `module` = 'epic', `action` = 'browse' WHERE `module` = 'product' AND `action` = 'epic'; +UPDATE `zt_workflowlayout` SET `module` = 'epic', `action` = 'browse' WHERE `module` = 'product' AND `action` = 'epic'; + +UPDATE `zt_workflowaction` SET `module` = 'build', `action` = 'browse' WHERE `module` = 'execution' AND `action` = 'build'; +UPDATE `zt_workflowlayout` SET `module` = 'build', `action` = 'browse' WHERE `module` = 'execution' AND `action` = 'build'; + +UPDATE `zt_workflowaction` SET `module` = 'task', `action` = 'browse' WHERE `module` = 'execution' AND `action` = 'task'; +UPDATE `zt_workflowlayout` SET `module` = 'task', `action` = 'browse' WHERE `module` = 'execution' AND `action` = 'task'; + +ALTER TABLE `zt_relationoftasks` ADD COLUMN `project` mediumint(8) unsigned NOT NULL DEFAULT 0 AFTER `id`; +ALTER TABLE `zt_relationoftasks` MODIFY `execution` char(30) NOT NULL DEFAULT '' AFTER `project`; +UPDATE `zt_relationoftasks` SET `project` = (SELECT `project` FROM `zt_task` WHERE `id` = `zt_relationoftasks`.`task`); + +CREATE TABLE IF NOT EXISTS `zt_deliverable` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `module` varchar(30) NULL, + `method` varchar(30) NULL, + `model` text NULL, + `type` enum('doc','file') NULL DEFAULT 'file', + `desc` text NULL, + `files` varchar(255) NULL, + `createdBy` varchar(30) NULL, + `createdDate` date NULL, + `lastEditedBy` varchar(30) NULL, + `lastEditedDate` date NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +ALTER TABLE `zt_workflowgroup` ADD `objectID` mediumint(8) unsigned NOT NULL DEFAULT '0' AFTER `id`; +ALTER TABLE `zt_workflowgroup` ADD COLUMN `deliverable` text NULL AFTER `editedDate`; +ALTER TABLE `zt_project` ADD COLUMN `deliverable` text NULL AFTER `maxColWidth`; + +UPDATE `zt_workflowgroup` SET `name` = '瀑布型产品研发' WHERE `code` = 'waterfallproduct'; +UPDATE `zt_workflowgroup` SET `name` = '瀑布型项目研发' WHERE `code` = 'waterfallproject'; +UPDATE `zt_workflowgroup` SET `name` = '敏捷型产品研发' WHERE `code` = 'scrumproduct'; +UPDATE `zt_workflowgroup` SET `name` = '敏捷型项目研发' WHERE `code` = 'scrumproject'; diff --git a/db/zentao.sql b/db/zentao.sql index 927f52c362..17beef003b 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -578,6 +578,24 @@ CREATE TABLE IF NOT EXISTS `zt_screen` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +-- DROP TABLE IF EXISTS `zt_deliverable`; +CREATE TABLE IF NOT EXISTS `zt_deliverable` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `module` varchar(30) NULL, + `method` varchar(30) NULL, + `model` text NULL, + `type` enum('doc','file') NULL DEFAULT 'file', + `desc` text NULL, + `files` varchar(255) NULL, + `createdBy` varchar(30) NULL, + `createdDate` date NULL, + `lastEditedBy` varchar(30) NULL, + `lastEditedDate` date NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + -- DROP TABLE IF EXISTS `zt_dimension`; CREATE TABLE IF NOT EXISTS `zt_dimension` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, @@ -1596,6 +1614,7 @@ CREATE TABLE IF NOT EXISTS `zt_project` ( `colWidth` smallint(6) NOT NULL DEFAULT '264', `minColWidth` smallint(6) NOT NULL DEFAULT '200', `maxColWidth` smallint(6) NOT NULL DEFAULT '384', + `deliverable` text NULL, `deleted` enum('0','1') NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; @@ -13234,6 +13253,7 @@ CREATE INDEX `order` ON `zt_workflow` (`order`); -- DROP TABLE IF EXISTS `zt_workflowgroup`; CREATE TABLE IF NOT EXISTS `zt_workflowgroup` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, + `objectID` mediumint(8) unsigned NOT NULL DEFAULT '0', `type` varchar(10) NOT NULL DEFAULT '', `projectModel` varchar(10) NOT NULL DEFAULT '', `projectType` varchar(10) NOT NULL DEFAULT '', @@ -13249,6 +13269,7 @@ CREATE TABLE IF NOT EXISTS `zt_workflowgroup` ( `createdDate` datetime NULL, `editedBy` varchar(30) NOT NULL DEFAULT '', `editedDate` datetime NULL, + `deliverable` text NULL, `deleted` enum('0', '1') NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; @@ -13527,11 +13548,11 @@ REPLACE INTO `zt_workflowrule`(`type`, `name`, `rule`, `createdBy`, `createdDate ('system','IP','ip','admin','2020-10-14 14:06:14'); INSERT INTO `zt_workflowgroup` (`type`, `projectModel`, `projectType`, `name`, `code`, `status`, `vision`, `main`) VALUES -('product', '', 'project', '默认流程', 'productproject', 'normal', 'rnd', '1'), -('project', 'scrum', 'product', '产品型敏捷项目流程', 'scrumproduct', 'normal', 'rnd', '1'), -('project', 'scrum', 'project', '项目型敏捷项目流程', 'scrumproject', 'normal', 'rnd', '1'), -('project', 'waterfall', 'product', '产品型瀑布项目流程', 'waterfallproduct','normal', 'rnd', '1'), -('project', 'waterfall', 'project', '项目型瀑布项目流程', 'waterfallproject','normal', 'rnd', '1'); +('product', '', 'project', '默认流程', 'productproject', 'normal', 'rnd', '1'), +('project', 'scrum', 'product', '敏捷型产品研发', 'scrumproduct', 'normal', 'rnd', '1'), +('project', 'scrum', 'project', '敏捷型项目研发', 'scrumproject', 'normal', 'rnd', '1'), +('project', 'waterfall', 'product', '瀑布型产品研发', 'waterfallproduct','normal', 'rnd', '1'), +('project', 'waterfall', 'project', '瀑布型项目研发', 'waterfallproject','normal', 'rnd', '1'); INSERT INTO `zt_workflowdatasource` (`type`, `name`, `code`, `buildin`, `vision`, `createdBy`, `createdDate`, `datasource`, `view`, `keyField`, `valueField`) VALUES ('system', '产品', 'products', '1', 'rnd', 'admin', '1970-01-01 00:00:01', '{\"app\":\"system\",\"module\":\"product\",\"method\":\"getPairs\",\"methodDesc\":\"Get product pairs.\",\"params\":[{\"name\":\"mode\",\"type\":\"string\",\"desc\":\"\",\"value\":\"all\"}]}', '', '', ''), diff --git a/doc/CHANGELOG b/doc/CHANGELOG index a593d9d88d..80c89a3c02 100644 --- a/doc/CHANGELOG +++ b/doc/CHANGELOG @@ -1,3 +1,138 @@ +2025-05-30 21.7.1 +完成的需求 +开源版: +74489 在文档编辑器顶部工具栏中打印上传附件按钮 +74488 在文档编辑器顶部工具栏中打印插入图片按钮 +74487 在文档编辑器顶部工具栏中打印超链接按钮 +74486 在文档编辑器顶部工具栏中打印待办事项列表按钮 +74485 在文档编辑器顶部工具栏中打印序号列表项相关的按钮 +74483 批量创建Bug页面增加所属计划字段 +73303 点击文档顶部工具栏中更多按钮,在下拉菜单中打印相关数据 +73293 调整文档中目录、章节和文档的图标和颜色 +73292 调整编辑和浏览文档时的可视区域宽度 +73247 在文档编辑器顶部工具栏中打印文字样式的相关按钮 +73013 在文档编辑器顶部工具栏中打印文字基础格式的相关按钮 +73011 文档顶部固定工具栏中打印插入更多数据的按钮 +73010 实现文档Blocksuite编辑器顶部工具栏常驻显示的组件 +60167 创建Bug页面增加所属计划字段 +14272 导出Bug时增加所属计划字段 +企业版: +74602 项目中支持单独维护单个项目的项目流程 +74439 工作流的流程模板列表不展示项目自定义的流程 +74429 项目中支持配置项目流程 +73561 构建列表动作展示在构建工作流中 +73560 任务列表动作展示在任务工作流中 +73559 业务需求列表动作展示在业务需求工作流中 +73558 用户需求列表动作展示在用户需求工作流中 +73557 研发需求列表动作展示在研发需求工作流中 +63771 工单工作流增加审批设置 +旗舰版: +74722 项目交付物维护页面隐藏创建时的交付物 +74712 隐藏创建项目页面中的交付物组件 +74710 调整交付物配置页面的帮助说明 +74709 交付物配置页面隐藏创建时的交付物列 +74708 后台编辑交付物页面置灰动作字段 +74707 后台添加交付物页面置灰动作字段 +74181 前台提交交付物的相关页面中增加提交文件限制 +74126 编辑已提交付物的独立执行和顶级执行不允许关联父执行 +74125 流程模板中交付物配置改变时不会影响已创建的项目 +74091 后台系统功能配置的通用功能中增加交付物功能开关 +74088 实现项目交付物历史记录功能 +74078 编辑项目页面增加项目流程字段 +74077 编辑已提交交付物的项目时禁用项目模型、项目类型或项目流程字段 +73952 项目流程模板详情的历史记录中记录交付物配置的动态 +73827 实现维护执行交付物的权限配置 +73826 实现维护项目交付物的权限配置 +73824 实现流程模板交付物配置的权限配置 +73822 实现后台交付物配置的权限配置 +73716 实现创建项目页面中的交付物组件 +73671 实现项目交付物维护页面 +73621 实现独立执行和顶级执行交付物维护弹窗 +73616 项目列表支持查看交付物的提交比例 +73607 独立执行和顶级执行列表支持查看交付物的提交比例 +73587 项目菜单打印交付物 +73585 关闭最后一个未关闭的子执行后引导用户关闭顶级执行 +73583 批量关闭执行时提示无法关闭进行中的执行 +73552 实现交付物列表的搜索功能 +73551 实现按标签筛选列表中的交付物 +73549 实现添加交付物页面模板字段的互斥逻辑 +73548 实现交付物页面适用范围下拉菜单与后台阶段类型同步 +73488 调整独立执行和顶级执行的类型导致交付物发生改变时保留已提交的交付物 +73475 关闭进行中的独立执行和顶级执行时支持提交交付物 +73457 关闭进行中的项目时支持提交交付物 +73453 创建项目时支持提交交付物 +73447 交付物配置页打印保存和返回按钮 +73446 交付物配置页始终显示帮助说明 +73445 交付物配置页标题可以依据不同流程模板命名 +73443 交付物配置页支持按对象动作关联交付物 +73442 项目流程模板列表操作列打印交付物配置按钮 +73439 实现删除交付物功能 +73438 实现编辑交付物功能 +73436 实现交付物详情页面 +73429 实现交付物列表页面 +73347 添加交付物页面支持定义交付物的基本信息 +73346 交付物列表页打印添加交付物的按钮 +73329 项目模型配置的通用菜单中打印交付物 +73327 后台模型配置名称调整为项目模型配置 +IPD版: +73927 批量维护阶段页面增加提示语 +修复的Bug +开源版: +62317 创建bug页面完整版表单下控件位置建议优化 +62339 影子产品创建Bug页面简洁版显示了所属计划字段 +62662 需求批量转任务页面工时和优先级同上应该置灰取需求的工时和优先级 +62746 标题内容输入数字时工具栏会一直刷新 +62778 windows一键安装包退出登录报错 +62779 瀑布项目阶段列表页点击编辑按钮,页面报错 +62787 测试单关联用例页面,搜索表单没显示 +62794 全局创建文档页面顶部没有工具栏 +62797 批量修改需求所属计划没有空选项 +62812 任务看板中的卡片不能正常显示 +62813 普通用户无法进行项目的关闭设置 +62817 BUG列表批量编辑修改影响版本会导致BUG关联对象被清空 (Feedback#9383) +62819 批量编辑任务会与最新版本的需求解绑 +62821 设置父子任务时间不符合时,页面显示了提示但是保存成功了 +62823 复制Bug后所属计划不会复制上 +62881 文档中切换禅道数据列表分页数有报错 +企业版: +62725 执行列表中预计消耗剩余展示为空 (Feedback#9327) +62741 父任务的起止日期修改为空,子任务的起止日期字段显示原有日期且置灰 +62766 升级后执行工作流中语言项错误 +62767 执行工作流下执行列表对应的动作显示所有 +62780 编辑项目管理方式,项目流程没有更新 +62788 编辑导出的多人任务后再导入只能导入一条数据 +62795 产品下导入需求报错 +62805 项目开启项目级流程后,编辑项目页面流程还显示原来的 +62811 工作流下自定义流程启用时选择单独启用后流程模板下的该流程也启用了 +62824 编辑项目页面没有根据项目管理方式判断是否显示项目流程字段 +62840 添加透视表使用手动输入SQL查询输入语句点查询报错502 +62842 配置office collabora时填写错误的地址保存有报错 +62855 编辑项目管理方式项目流程错误 +62856 创建 office文档弹窗中权限控制没有修改 +62860 编辑项目时项目流程下拉选项显示了其它项目的项目级流程 +62861 设计透视表报错 +旗舰版: +62733 瀑布项目阶段列表页提交交付物后,保存报错 +62744 关闭进行中的执行页面没有显示交付物组件 +62755 复制瀑布项目完善阶段信息页保存时报错 +62796 安装oceanbase数据库,最后一步有报错 +62802 项目下交付物不能预览和下载 +62804 升级后项目下启用项目流程无法启用 +62806 进入项目下项目流程页面后二级导航的自定义流程不显示了 +62807 windows包项目下选择文档交付物,保存报错 +62810 关闭子阶段,提示去关闭父阶段,实际没跳转到父阶段关闭页面 +62815 创建项目报错 +62818 执行下维护交付物页面保存时报错 +62825 升级后进入项目概况页不显示流程名称 +62827 工作流流程下新建并发布流程后项目流程下未显示该流程 +62829 复制项目时默认带入的项目流程不正确 +62843 交付物数量在列表没显示 +62858 升级后工作流下产品/项目模板列表有报错 +62867 看板项目概况页显示了流程名称 +IPD版: +62731 OR界面调研项目设置阶段报错 +62789 IPD项目下编辑阶段页面阶段类型可编辑 + 2025-05-16 21.7 完成的需求 开源版: diff --git a/framework/base/router.class.php b/framework/base/router.class.php index 0af23871f7..a0323c6a15 100644 --- a/framework/base/router.class.php +++ b/framework/base/router.class.php @@ -3403,7 +3403,11 @@ class baseRouter $fh = fopen($sqlLog, 'a'); fwrite($fh, date('Ymd H:i:s') . ": " . $this->getURI() . "\n"); - foreach(dao::$querys as $query) fwrite($fh, " $query\n"); + foreach(dbh::$queries as $key => $query) + { + fwrite($fh, " $query\n"); + fwrite($fh, ' └' . dbh::$traces[$key] . "\n"); + } fwrite($fh, "\n"); fclose($fh); } diff --git a/framework/control.class.php b/framework/control.class.php index 9d9c7da6ac..8bf985df95 100644 --- a/framework/control.class.php +++ b/framework/control.class.php @@ -527,6 +527,8 @@ class control extends baseControl $flow = $this->loadModel('workflow')->getByModule($moduleName, false, $groupID); if(!$flow) return $fields; + if($groupID && $moduleName == 'project' && $methodName == 'create') $groupID = 0; // 项目创建页面用通用的工作流配置 + $action = $this->loadModel('workflowaction')->getByModuleAndAction($flow->module, $methodName, $groupID); if(!$action || $action->extensionType != 'extend') return $fields; diff --git a/lib/base/dao/dao.class.php b/lib/base/dao/dao.class.php index 759a0bb9da..74b58c4e31 100644 --- a/lib/base/dao/dao.class.php +++ b/lib/base/dao/dao.class.php @@ -1477,15 +1477,7 @@ class baseDAO **/ else { - /* - * 使用$arg0, $arg1... 生成调用的参数。 - * Create the max counts of sql class methods, and then create $arg0, $arg1... - **/ - for($i = 0; $i < SQL::MAX_ARGS; $i ++) - { - ${"arg$i"} = isset($funcArgs[$i]) ? $funcArgs[$i] : null; - } - $this->sqlobj->$funcName($arg0, $arg1, $arg2); + $this->sqlobj->$funcName(...$funcArgs); return $this; } } @@ -1876,11 +1868,13 @@ class baseDAO } if(empty($profiles)) $profiles = $this->query('SHOW PROFILES')->fetchAll(); - foreach($profiles as $profile) + $basePath = $this->app->getBasePath(); + foreach($profiles as $key => $profile) { $profile->Duration = round((float)$profile->Duration, 4); $profile->Explain = []; $profile->Error = ''; + $profile->Code = str_replace($basePath, '', dbh::$traces[$key]); $sql = trim($profile->Query); if(stripos($sql, 'select') !== 0 @@ -1921,6 +1915,21 @@ class baseDAO return $profiles; } + + /** + * 创建临时表。 + * Create temporary table. + * + * @param int $ids 用于创建临时表的 id 列表,字符串或数组。 + * @param bool $filterDuplicate 是否过滤重复的表名,默认值为 true。 + * @param int $limit 用于创建临时表的 id 列表的数量限制,数量小于这个值时不创建临时表,0 表示不限制数量。 + * @access public + * @return false|string + */ + public function createTemporaryTable($idList, $filterDuplicate = true, $limit = 100) + { + return $this->sqlobj->createTemporaryTable($idList, $filterDuplicate, $limit); + } } /** @@ -1947,6 +1956,15 @@ class baseSQL */ public $sql = ''; + /** + * 全局对象$app + * The global app object. + * + * @var object + * @access public + */ + public $app; + /** * 全局变量$dbh。 * The global $dbh. @@ -2073,6 +2091,15 @@ class baseSQL */ public $currentTable; + /** + * 已创建的临时表。 + * The temporary tables. + * + * @var array + * @access public + */ + public $tempTables = []; + /** * 构造方法。 * The construct function. @@ -2082,7 +2109,8 @@ class baseSQL */ public function __construct($table = '') { - global $dbh; + global $app, $dbh; + $this->app = $app; $this->dbh = $dbh; $this->data = new stdclass(); $this->skipFields = ''; @@ -2594,17 +2622,105 @@ class baseSQL * 创建IN部分。 * Create in part. * - * @param string|array $ids ','分割的字符串或者数组 list string by ',' or an array + * @param string|array $ids ','分割的字符串或者数组。List string by ',' or an array. + * @param bool $useTemporaryTable 是否使用临时表。 Use temporary table or not. + * @param bool $filterDuplicate 是否过滤重复的表名,默认值为 true。Filter duplicate table name or not. * @access public * @return static|sql the sql object. */ - public function in($ids) + public function in($ids, $useTemporaryTable = false, $filterDuplicate = true) { if($this->inCondition and !$this->conditionIsTrue) return $this; - $this->sql .= is_null($ids) ? ' IS NULL' : helper::dbIN($ids); + + if(is_null($ids)) + { + $this->sql .= ' IS NULL'; + return $this; + } + + if($useTemporaryTable) + { + $tableName = $this->createTemporaryTable($ids, $filterDuplicate); + if($tableName) + { + $this->sql .= " IN (SELECT id FROM $tableName)"; + return $this; + } + } + + $this->sql .= helper::dbIN($ids); return $this; } + /** + * 创建临时表。 + * Create temporary table. + * + * @param int $ids 用于创建临时表的 id 列表,字符串或数组。 + * @param bool $filterDuplicate 是否过滤重复的表名,默认值为 true。 + * @param int $limit 用于创建临时表的 id 列表的数量限制,数量小于这个值时不创建临时表,0 表示不限制数量。 + * @access public + * @return false|string + */ + public function createTemporaryTable($ids, $filterDuplicate = true, $limit = 100) + { + if(!is_string($ids) && !is_array($ids)) + { + $this->app->triggerError('The idList must be a string or an array.', __FILE__, __LINE__); + return false; + } + + if(is_string($ids)) $ids = explode(',', $ids); + + $idList = []; + foreach($ids as $id) + { + if(empty($id)) continue; + + $intID = (int)$id; + if($intID != $id) continue; + + $idList[$intID] = $intID; + } + + if($limit && count($idList) < $limit) + { + $this->app->triggerError("The idList count must be greater than $limit", __FILE__, __LINE__); + return false; + } + + $tableName = ''; + if($filterDuplicate) + { + /* 如果开启了唯一表名,那么将表名设置为 md5(idList). */ + asort($idList); + $rows = '(' . implode('),(', $idList) . ')'; + $tableName = "temp_" . md5($rows); + + if(isset($this->tempTables[$tableName])) return $tableName; + } + else + { + $tableName = 'temp_' . uniqid(); + $rows = '(' . implode('),(', $idList) . ')'; + } + + try + { + $this->dbh->exec("CREATE TEMPORARY TABLE IF NOT EXISTS {$tableName} (id int PRIMARY KEY)"); + $this->dbh->exec("INSERT INTO {$tableName} VALUES {$rows}"); + } + catch(PDOException $e) + { + $message = $e->getMessage() . ' ' . helper::checkDB2Repair($e); + $this->app->triggerError($message, __FILE__, __LINE__); + } + + if($filterDuplicate) $this->tempTables[$tableName] = $tableName; + + return $tableName; + } + /** * 创建'NOT IN'部分。 * Create not in part. diff --git a/lib/cache/cache.class.php b/lib/cache/cache.class.php index 009970570d..bd49164103 100644 --- a/lib/cache/cache.class.php +++ b/lib/cache/cache.class.php @@ -161,6 +161,7 @@ class cache { $this->app = $app; $this->dao = $app->dao; + $this->dbh = $app->dbh; $this->config = $app->config; if(empty($this->config->cache->enable)) return $this->log('The cache is not enabled', __FILE__, __LINE__); @@ -369,12 +370,13 @@ class cache $objectIdList = $this->cache->get($setCacheKey); if(!is_array($objectIdList)) return; - $objectID = $this->dao->lastInsertID(); + $objectID = $this->dbh->lastInsertID(); if(!$objectID) return $this->log('Failed to fetch last insert id.', __FILE__, __LINE__); /* 获取新增的数据。Get the new data. */ - $object = $this->dao->select('*')->from($this->table)->where('id')->eq($objectID)->fetch(); - if(!$object) return $this->log('Failed to fetch new object. The sql is: ' . $this->dao->get(), __FILE__, __LINE__); + $sql = $this->dao->select('*')->from($this->table)->where('id')->eq($objectID)->get(); + $object = $this->query($sql, 'fetch'); + if(!$object) return $this->log('Failed to fetch new object. The sql is: ' . $sql, __FILE__, __LINE__); /* 把新增的数据保存到缓存中。Save the new data to cache. */ $field = $this->getTableField(); @@ -408,8 +410,9 @@ class cache $objectIdList = array_map(function($object) use ($field) { return $object->$field; }, $this->objects); /* 获取更新后的数据。Get the updated data. */ - $objects = $this->dao->select('*')->from($this->table)->where($field)->in($objectIdList)->fetchAll($field, false); - if(!$objects) return $this->log('Failed to fetch updated objects. The sql is: ' . $this->dao->get(), __FILE__, __LINE__); + $sql = $this->dao->select('*')->from($this->table)->where($field)->in($objectIdList)->get(); + $objects = $this->query($sql, 'fetchAll', $field); + if(!$objects) return $this->log('Failed to fetch updated objects. The sql is: ' . $sql, __FILE__, __LINE__); /* 把更新后的数据保存到缓存中。Save the updated data to cache. */ $values = []; @@ -506,6 +509,28 @@ class cache $this->cache->deleteMultiple($keys); } + /** + * 执行数据库查询操作。 + * Execute database query operation. + * + * @param string $sql SQL语句。 + * @param string $function 查询函数。 + * @param string $field 字段名。 + * @access private + * @return array|object + */ + private function query($sql, $function = 'fetchAll', $field = ''): array|object + { + $rows = $this->dao->query($sql)->$function(); + if($function == 'fetchAll' && !empty($field)) + { + $objects = []; + foreach($rows as $row) $objects[$row->$field] = $row; + return $objects; + } + return $rows; + } + /** * 检查表是否有缓存设置。 * Check if the table has cache settings. @@ -583,7 +608,8 @@ class cache private function initTableCache(): array { $field = $this->getTableField(); - $objects = $this->dao->select('*')->from($this->table)->fetchAll($field, false); + $sql = $this->dao->select('*')->from($this->table)->get(); + $objects = $this->query($sql, 'fetchAll', $field); if(!$objects) return []; $values = []; @@ -693,7 +719,8 @@ class cache { $lostObjects = []; $diffIdList = array_keys(array_diff($keys, array_keys($objects))); - $diffObjects = $this->dao->select('*')->from($table)->where('id')->in($diffIdList)->fetchAll('', false); + $sql = $this->dao->select('*')->from($table)->where('id')->in($diffIdList)->get(); + $diffObjects = $this->query($sql, 'fetchAll'); foreach($diffObjects as $object) { $rawCacheKey = $this->getRawCacheKey($code, $object->id); @@ -757,18 +784,29 @@ class cache $field = $this->getTableField(); $dao = $this->dao->select($field)->from($table)->where('1=1'); foreach($conditions as $condition) $dao->andWhere($condition['field'])->eq($condition['value']); - $idList = array_values($dao->fetchPairs()); + $sql = $dao->get(); + $objects = $this->query($sql, 'fetchAll'); + foreach($objects as $object) $idList[] = $object->$field; $this->saveByKey($cacheKey, $idList); /* 把缓存键写入数据库以便执行 dao::exec() 时自动更新。Write the cache key to the database for automatic update when executing dao::exec(). */ $fields = implode(',', array_column($conditions, 'field')); - $autoCache = $this->dao->select('1')->from(TABLE_AUTOCACHE)->where('code')->eq($code)->andWhere('fields')->eq($fields)->fetch(); + $sql = $this->dao->select('1')->from(TABLE_AUTOCACHE)->where('code')->eq($code)->andWhere('fields')->eq($fields)->get(); + $autoCache = $this->query($sql, 'fetch'); if(!$autoCache) { $autoCache = new \stdClass(); $autoCache->code = $code; $autoCache->fields = $fields; - $this->dao->insert(TABLE_AUTOCACHE)->data($autoCache)->exec(); + $sql = $this->dao->insert(TABLE_AUTOCACHE)->data($autoCache)->get(); + try + { + $this->dbh->exec($sql); + } + catch(PDOException $e) + { + $this->dao->sqlError($e); + } } } if(!$idList) return []; @@ -980,7 +1018,8 @@ class cache /* 执行操作后数据已经被修改,所以需要提前获取被影响的数据。*/ $field = $this->getTableField(); - $objects = $this->dao->select('*')->from($table)->beginIF($where)->where($where)->fi()->fetchAll($field, false); + $sql = $this->dao->select('*')->from($table)->beginIF($where)->where($where)->fi()->get(); + $objects = $this->query($sql, 'fetchAll', $field); $this->setWhere($where); $this->setObjects($objects); @@ -1046,4 +1085,4 @@ class cache { return $this->cache->memory($type); } -} +} \ No newline at end of file diff --git a/lib/dbh/dbh.class.php b/lib/dbh/dbh.class.php index 5eb89cb63f..93088ffc67 100644 --- a/lib/dbh/dbh.class.php +++ b/lib/dbh/dbh.class.php @@ -59,6 +59,24 @@ class dbh */ private $sql; + /** + * 这是用来记录SQL执行的文件和行号。 + * This is used to record the file and line number where the SQL was executed. + * + * @var array + * @access public + */ + public static $traces = []; + + /** + * 执行的请求,所有的查询都保存在该数组。 + * The queries executed. Every query will be saved in this array. + * + * @var array + * @access public + */ + public static $queries = []; + /** * Constructor * @@ -81,15 +99,25 @@ class dbh $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + $queries = []; /* Mysql driver include mysql and oceanbase. */ if($driver == 'mysql') { - $pdo->exec("SET NAMES {$config->encoding}"); - if(isset($config->strictMode) and $config->strictMode == false) $pdo->exec("SET @@sql_mode= ''"); + $queries[] = "SET NAMES {$config->encoding}"; + if(isset($config->strictMode) && empty($config->strictMode)) $queries[] = "SET @@sql_mode= ''"; } else if($setSchema) { - $pdo->exec("SET SCHEMA {$config->name}"); + $queries[] = "SET SCHEMA {$config->name}"; + } + if(!empty($queries)) + { + foreach($queries as $query) + { + $pdo->exec($query); + dbh::$traces[] = 'vim +' . (__LINE__ - 1) . ' ' . __FILE__; + dbh::$queries[] = "[$flag] " . $query; + } } $this->pdo = $pdo; @@ -120,6 +148,8 @@ class dbh */ public function exec($sql) { + $this->trace(); + $sql = $this->formatSQL($sql); if(!$sql) return true; @@ -127,7 +157,7 @@ class dbh try { - if(class_exists('dao')) dao::$querys[] = "[$this->flag] " . dao::processKeywords($sql); + dbh::$queries[] = "[$this->flag] " . dao::processKeywords($sql); return $this->pdo->exec($sql); } catch(PDOException $e) @@ -146,10 +176,12 @@ class dbh */ public function query($sql) { + $this->trace(); + $sql = $this->formatSQL($sql); try { - if(class_exists('dao')) dao::$querys[] = "[$this->flag] " . dao::processKeywords($sql); + dbh::$queries[] = "[$this->flag] " . dao::processKeywords($sql); return $this->pdo->query($sql); } catch(PDOException $e) @@ -191,6 +223,8 @@ class dbh */ public function execute($sql, $params) { + $this->trace(); + $this->statement = $this->prepare($sql); try @@ -214,9 +248,11 @@ class dbh */ public function rawQuery($sql) { + $this->trace(); + try { - if(class_exists('dao')) dao::$querys[] = "[$this->flag] " . dao::processKeywords($sql); + dbh::$queries[] = "[$this->flag] " . dao::processKeywords($sql); return $this->pdo->query($sql); } catch(PDOException $e) @@ -225,6 +261,63 @@ class dbh } } + /** + * 记录当前执行的 SQL 的文件和行号。 + * Record the file and line number of the currently executed SQL. + * + * @access private + * @return bool + */ + private function trace() + { + global $app, $config; + if(empty($config->debug) || $config->debug < 3) return false; + if(!is_null($app)) + { + if(!empty($app->installing) || !empty($app->upgrading)) return false; + if(!isset($config->installed) || !$config->installed) return false; + } + + $trace = $this->getTrace(); + if(empty($trace)) return false; + + $file = $trace['file']; + $line = $trace['line']; + + dbh::$traces[] = "vim +$line $file"; + + return true; + } + + /** + * 获取当前执行的 SQL 的调用栈信息。 + * Get the call stack information of the currently executed SQL. + * + * @access private + * @return array + */ + private function getTrace() + { + $traces = array_reverse(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); + foreach($traces as $key => $trace) + { + $class = $trace['class'] ?? ''; + $function = $trace['function'] ?? ''; + if($class == 'settingModel' && strpos(',getItem,getItems,setItem,setItems,updateItem,deleteItems,', ",$function,") !== false) return $trace; + if($class == 'baseDAO' && strpos(',exec,fetch,fetchPairs,fetchGroup,explain,showTables,getTableEngines,descTable,', ",$function,") !== false) return $trace; + if($class == 'baseDAO' && $function == 'getProfiles') return $traces[$key + 1]; + if($class == 'baseDAO' && $function == 'fetchAll') + { + if($traces[$key + 1]['class'] == 'baseDAO' && $traces[$key + 1]['function'] == 'extractSQLFields') return $traces[$key + 2]; + return $trace; + } + if($class == 'baseDAO' && stripos($function, 'findBy') === 0) return $trace; + if($class == 'baseRouter' && $function == 'dbQuery') return $trace; + if($class == 'dbh' && strpos('exec,query,rawQuery', $function) !== false) return $trace; + } + return []; + } + /** * Set attribute. * diff --git a/lib/trace/trace.class.php b/lib/trace/trace.class.php index 974b988987..4fdbedad30 100644 --- a/lib/trace/trace.class.php +++ b/lib/trace/trace.class.php @@ -43,7 +43,7 @@ class trace 'method' => $this->app->server->request_method, 'timeUsed' => round(getTime() - $this->app->startTime, 4) * 1000, 'memory' => round(memory_get_peak_usage() / 1024, 1), - 'querys' => count(dao::$querys), + 'querys' => count(dbh::$queries), 'caches' => 0, 'files' => count(get_included_files()), 'session' => session_id(), @@ -70,7 +70,7 @@ class trace */ public function getRequestSqls() { - $this->trace['sqlQuery'] = dao::$querys; + $this->trace['sqlQuery'] = dbh::$queries; } /** diff --git a/lib/zin/func.php b/lib/zin/func.php index 469d0979a9..e651f5237a 100644 --- a/lib/zin/func.php +++ b/lib/zin/func.php @@ -249,6 +249,7 @@ function iconPicker(): iconPicker {return createWg('iconPicker', func_get_args() function relatedObjectList(): relatedObjectList {return createWg('relatedObjectList', func_get_args());} function taskAssignedTo(): taskAssignedTo {return createWg('taskAssignedTo', func_get_args());} function docList(): docList {return createWg('docList', func_get_args());} +function deliverable(): deliverable {return createWg('deliverable', func_get_args());} if(is_dir(__DIR__ . DS . 'wg' . DS . 'schedule')) { @@ -258,4 +259,4 @@ if(is_dir(__DIR__ . DS . 'wg' . DS . 'schedule')) if(is_dir(__DIR__ . DS . 'wg' . DS . 'boardeditor')) { function boardEditor(): boardEditor {return createWg('boardeditor', func_get_args());} -} +} \ No newline at end of file diff --git a/lib/zin/wg/backbtn/v1.php b/lib/zin/wg/backbtn/v1.php index 5b20fca7ac..0f67b0e291 100644 --- a/lib/zin/wg/backbtn/v1.php +++ b/lib/zin/wg/backbtn/v1.php @@ -96,7 +96,9 @@ class backBtn extends btn 'approvalflow' => 'approvalflow-browse', 'host' => 'host-browse,my-index', 'deploy' => 'deploy-browse', - 'program' => 'program-browse,program-productview' + 'program' => 'program-browse,program-productview', + 'workflowgroup' => 'workflowgroup-project,workflowgroup-deliverable', + 'deliverable' => 'deliverable-browse' ); $props = parent::getProps(); diff --git a/lib/zin/wg/deliverable/css/v1.css b/lib/zin/wg/deliverable/css/v1.css new file mode 100644 index 0000000000..43d93b3dd3 --- /dev/null +++ b/lib/zin/wg/deliverable/css/v1.css @@ -0,0 +1 @@ +.deliverable-item {padding-left: 3.5rem !important} diff --git a/lib/zin/wg/deliverable/js/v1.js b/lib/zin/wg/deliverable/js/v1.js new file mode 100644 index 0000000000..8649ce15b1 --- /dev/null +++ b/lib/zin/wg/deliverable/js/v1.js @@ -0,0 +1,44 @@ +/** + * 获取附件的操作按钮。 + * Get file actions. + */ +window.getDeliverableFileActions = function(file, deliverable) +{ + let actions = []; + if(canDownload && typeof file.id != 'undefined') actions[0] = {icon: 'download', key: 'download', url: $.createLink('file', 'download', 'id=' + file.id), target: '_blank'}; + actions[1] = {icon: 'edit', key: 'rename'}; + actions[2] = {icon: 'trash', key: 'delete'}; + + /* 可以预览的文件。 */ + if(['txt', 'jpg', 'jpeg', 'gif', 'png', 'bmp', 'mp4'].includes(file.extension) && canDownload && typeof file.id != 'undefined') + { + actions[3] = {icon: 'eye', key: 'view', url: $.createLink('file', 'download', `fileID=${file.id}&mouse=left`), 'data-toggle' : 'modal', 'data-size' : 'lg'}; + } + + return actions; +} + +/** + * 获取文档的操作按钮。 + * Get file actions. + */ +window.getDocActions = function(doc, deliverable) +{ + let actions = []; + actions[0] = {icon: 'eye', key: 'view', url: $.createLink('doc', 'view', 'docID=' + doc.id)}; + actions[1] = {icon: 'edit', key: 'rename'}; + actions[2] = {icon: 'trash', key: 'delete'}; + return actions; +} + +/** + * 获取交付物的操作按钮。 + * Get deliverable actions. + */ +window.getDeliverableActions = function(deliverable) +{ + let actions = []; + actions[0] = {text: addFile, icon: 'file', key: 'selectFile'}; + if(deliverable.template > 0 && canDownload) actions[1] = {text: downloadTemplate, icon: 'download', key: 'downloadTemplate', url: $.createLink('file', 'download', 'templateID=' + deliverable.template), target: '_blank'}; + return actions; +} diff --git a/lib/zin/wg/deliverable/v1.php b/lib/zin/wg/deliverable/v1.php new file mode 100644 index 0000000000..4cb45d5557 --- /dev/null +++ b/lib/zin/wg/deliverable/v1.php @@ -0,0 +1,91 @@ +loadLang('doc'); + $app->loadLang('file'); + jsVar('addFile', $lang->doc->addFile); + jsVar('downloadTemplate', $lang->doc->downloadTemplate); + jsVar('deleteItem', $lang->delete); + jsVar('canDownload', hasPriv('file', 'download')); + + return file_get_contents(__DIR__ . DS . 'js' . DS . 'v1.js'); + } + + /** + * 获取CSS。 + * Get page CSS. + * + * @static + * @access public + * @return string + */ + public static function getPageCSS(): ?string + { + return file_get_contents(__DIR__ . DS . 'css' . DS . 'v1.css'); + } + + /** + * 构建组件。 + * Build. + * + * @access protected + * @return zui + */ + protected function build(): zui + { + global $lang, $app; + $app->loadLang('doc'); + $app->loadLang('file'); + + $formName = $this->prop('formName') ? $this->prop('formName') : 'deliverable'; + + if(!$this->hasProp('maxFileSize')) + { + $maxFileSize = ini_get('upload_max_filesize'); + $lastChar = substr($maxFileSize, -1); + $fileSizeUnit = array('K', 'M', 'G', 'T'); + if(in_array($lastChar, $fileSizeUnit)) $maxFileSize .= 'B'; + $this->setProp('maxFileSize', $maxFileSize); + } + + return zui::deliverableList + ( + set::formName($formName), + set::items($this->prop('items')), + set::docPicker(array('placeholder' => $lang->doc->selectDoc, 'items' => helper::createLink('doc', 'ajaxGetMineDocs', 'keyword={search}'))), + set::getFileActions(jsRaw('window.getDeliverableFileActions')), + set::getDocActions(jsRaw('window.getDocActions')), + set::getEmptyActions(jsRaw('window.getDeliverableActions')), + set::maxFileSize($this->prop('maxFileSize')), + set::extraCategory($lang->other) + ); + } +} diff --git a/lib/zin/wg/docapp/js/v1.js b/lib/zin/wg/docapp/js/v1.js index 4d9bd859e2..390ce93628 100644 --- a/lib/zin/wg/docapp/js/v1.js +++ b/lib/zin/wg/docapp/js/v1.js @@ -1135,10 +1135,11 @@ const actionsMap = const doc = info.doc; const file = info.data; const docApp = getDocApp(); + const isReadonly = docApp.mode === 'view'; const privs = docApp.props.privs; const lang = getLang(); - const canEdit = privs.edit && (!doc.privs || doc.privs.edit !== false) && privs.editFile; - const canDelete = privs.edit && (!doc.privs || doc.privs.edit !== false) && privs.deleteFile; + const canEdit = !isReadonly && privs.edit && (!doc.privs || doc.privs.edit !== false) && privs.editFile; + const canDelete = !isReadonly && privs.edit && (!doc.privs || doc.privs.edit !== false) && privs.deleteFile; const hasExtension = file.title.lastIndexOf('.' + file.extension) == (file.title.length - file.extension.length - 1); const canPreview = hasExtension && 'mp4,txt,jpg,jpeg,gif,png,bmp'.split(',').includes(file.extension); return [ @@ -2091,6 +2092,34 @@ function getSpaceFetcher(spaceType, spaceID = 0) } } +function initOfficePreview(options) +{ + const officeTypes = new Set(['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf']); + zui.Editor.setGlobalConfig( + { + canPreviewFile: (file) => { + const extension = file.name.split('.').pop(); + return officeTypes.has(extension); + }, + onPreviewFile: (file) => { + const doc = getDocApp().doc || {data: {id: 0}}; + $.getJSON(zui.formatString(options.fileInfoUrl, { + gid: btoa(`g-${file.key}`), + objectType: 'doc', + objectID: doc.data.id, + title: '', + extra: '', + })).then(res => { + if(res.result === 'success' && res.data) + { + const editable = doc.data.editable !== false; + window.open($.createLink('file', 'download', `fileID=${res.data.id}&mouse=left&edit=${editable ? '0' : 'never'}`), '_blank'); + } + }); + } + }); +} + /** * 设置文档应用组件选项。 * Set the doc app options. @@ -2102,6 +2131,8 @@ window.setDocAppOptions = function(_, options) userPrivs = options.privs; docLangData = options.langData; + if(options.canPreviewOffice && options.fileInfoUrl) initOfficePreview(options); + return $.extend( { defaultState : {listType: '', libReleaseMap: {}}, diff --git a/lib/zin/wg/docapp/v1.php b/lib/zin/wg/docapp/v1.php index 22fca67279..e5f9e1b3a5 100644 --- a/lib/zin/wg/docapp/v1.php +++ b/lib/zin/wg/docapp/v1.php @@ -144,6 +144,7 @@ class docApp extends wg $libSummariesFetcher = createLink('doc', 'ajaxGetLibSummaries', 'spaceType={spaceType}&spaceList={spaceList}'); $uploadUrl = createLink('file', 'ajaxUpload', 'uid={uid}&objectType={objectType}&objectID={objectID}&extra={extra}&field={field}&api={api}&gid={gid}'); $downloadUrl = createLink('file', 'ajaxQuery', 'fileID={gid}&objectType={objectType}&objectID={objectID}&title={title}&extra={extra}'); + $fileInfoUrl = createLink('file', 'ajaxQuery', 'fileID={gid}&objectType={objectType}&objectID={objectID}&title={title}&extra={extra}', 'json'); /** * 定义文档界面上的文件下载链接。 @@ -269,6 +270,7 @@ class docApp extends wg } $historyPanelProps = array('fileListProps' => $fileListProps); + $canPreviewOffice = $canDownload && isset($config->file->libreOfficeTurnon) and $config->file->libreOfficeTurnon == 1; return zui::docApp ( @@ -312,6 +314,9 @@ class docApp extends wg set::viewModeUrl($viewModeUrl), set::langData($langData), set::historyPanel($historyPanelProps), + set::showToolbar(true), + set::canPreviewOffice($canPreviewOffice), + set::fileInfoUrl($fileInfoUrl), jsCall('setZentaoSlashMenu', $this->getZentaoListMenu(), $lang->doc->zentaoData, $config->vision, $config->doc->zentaoListMenuPosition) ); } diff --git a/lib/zin/wg/doclist/v1.php b/lib/zin/wg/doclist/v1.php index 74cc0e96d8..76a77a579c 100644 --- a/lib/zin/wg/doclist/v1.php +++ b/lib/zin/wg/doclist/v1.php @@ -51,7 +51,7 @@ class docList extends wg setClass('docItem flex items-center py-1'), span(setClass('mr-4 p-1 docTitle'), icon(setClass('mr-2'), 'file-text'), $link), div(setClass('w-24'), $mode == 'edit' ? picker(set::required(true), set::name("docVersions[$docID]"), set::items($oldDocVersions[$docID]), set::value($data->docVersions[$docID])) : "#{$data->docVersions[$docID]}"), - $mode == 'edit' && $oldDocs[$docID]->version != $data->docVersions[$docID] ? label(setClass('ml-2 warning'), $lang->task->docSyncTips) : null, + $mode == 'edit' && $oldDocs[$docID]->version != $data->docVersions[$docID] ? label(setClass('ml-2 warning w-80'), $lang->task->docSyncTips) : null, $mode == 'edit' ? input(setClass('hidden'), set::name("oldDocs[$docID]"), set::value($docID)) : null, $mode == 'edit' ? btn(setClass('ghost ml-2'), icon('trash'), setData(array('on' => 'click', 'call' => 'window.removeDocs', 'params' => 'event'))) : null ); @@ -70,7 +70,7 @@ class docList extends wg set::multiple(true), set::maxItemsCount(50), set::menu(array('checkbox' => true)), - !empty($items) ? set::toolbar(true) : null + !empty($docs) ? set::toolbar(true) : null ) : null, div(setClass('mt-2'), $docBox) ); diff --git a/lib/zin/wg/dropmenu/css/v1.css b/lib/zin/wg/dropmenu/css/v1.css index a1308d5d1a..9904ddbb1d 100644 --- a/lib/zin/wg/dropmenu/css/v1.css +++ b/lib/zin/wg/dropmenu/css/v1.css @@ -1,4 +1,4 @@ -#pick-pop-admin-menu {width: 139px!important;} +#pick-pop-admin-menu {width: 145px!important;} #pick-pop-admin-menu .dropmenu-list {padding: 8px;} #pick-pop-admin-menu .dropmenu-item + .dropmenu-item {margin-top: 4px} #pick-pop-admin-menu .dropmenu-item.active {background-color: unset;} diff --git a/lib/zin/wg/monaco/css/v1.css b/lib/zin/wg/monaco/css/v1.css index 0d9b84fee0..8533efe6c4 100644 --- a/lib/zin/wg/monaco/css/v1.css +++ b/lib/zin/wg/monaco/css/v1.css @@ -3,5 +3,3 @@ /* 半透明黄色 */ .monaco-editor .yellow-decoration {background-color: rgba(255, 255, 0, 0.2);} - -.monaco-editor .margin .line-numbers {padding-left: 16px;} diff --git a/lib/zin/wg/monaco/js/v1.js b/lib/zin/wg/monaco/js/v1.js index 24851083a8..ee7e32cb32 100644 --- a/lib/zin/wg/monaco/js/v1.js +++ b/lib/zin/wg/monaco/js/v1.js @@ -154,7 +154,7 @@ function resize(id) mainMenuHeight = mainMenuHeight ? mainMenuHeight : 0; mainNavbar = mainNavbar ? mainNavbar : 0; - var codeHeight = windowHeight - headerHeight - appsBarHeight - tabsHeight - appTabsHeight - mainMenuHeight - mainNavbar; + var codeHeight = windowHeight - headerHeight - appsBarHeight - tabsHeight - appTabsHeight - mainMenuHeight - mainNavbar; if(codeHeight > 0) $.cookie.set(id + 'Height', codeHeight); diff --git a/lib/zin/wg/stepseditor/js/v1.js b/lib/zin/wg/stepseditor/js/v1.js index 0cf87e343c..80ab9b466f 100644 --- a/lib/zin/wg/stepseditor/js/v1.js +++ b/lib/zin/wg/stepseditor/js/v1.js @@ -291,7 +291,8 @@ class StepsEditor extends zui.Component { const options = this.options; let $row = $rows.filter(`[data-id="${item.id}"]`); - if(!$row.length) $row = this._createRow(item, options); + let isNew = !$row.length; + if(isNew) $row = this._createRow(item, options); if($preRow) $row.insertAfter($preRow); else $list.prepend($row); @@ -303,20 +304,22 @@ class StepsEditor extends zui.Component .toggleClass('has-children', hasSub) .toggleClass('no-child', !hasSub) .removeClass('is-expired'); - $row.css('--name-indent', `${(item.level - 1) * 14}px`).find('.steps-editor-step-name').css('width', item.name.length * 12).text(item.name).css('paddingLeft', (item.level - 1) * 14); - $row.find('.steps-editor-step-text').attr('name', `${options.name}[${item.name}]`); - $row.find('.steps-editor-step-type').attr('name', `stepType[${item.name}]`).val(hasSub ? 'group' : (!!item.parent && item.parent != '0' ? 'item' : 'step')); - if(options.postDataID) $row.find('.steps-editor-post-data-id').attr('name', `id[${item.name}]`); - const $expect = $row.find('.steps-editor-step-expect').attr( - { - name: `${options.expectsName}[${item.name}]`, - disabled: hasSub && options.expectDisabled ? 'disabled' : null - }).toggleClass('disabled', hasSub && options.expectDisabled); - $expect.parent().toggleClass('disabled', hasSub && options.expectDisabled); - $row.find('.steps-editor-col-delete .btn').toggleClass('disabled', hasSub || this._items.length == 1); - $row.find('.steps-editor-col-delete .btn.disabled').attr('title', options.deleteStepTip); - $row.find('.steps-editor-col-add .btn-action[data-action="sub"]').toggleClass('disabled', item.level >= 3); - $row.find('textarea').autoHeight(); + requestAnimationFrame(() => { + $row.css('--name-indent', `${(item.level - 1) * 14}px`).find('.steps-editor-step-name').css('width', item.name.length * 12).text(item.name).css('paddingLeft', (item.level - 1) * 14); + $row.find('.steps-editor-step-text').attr('name', `${options.name}[${item.name}]`); + $row.find('.steps-editor-step-type').attr('name', `stepType[${item.name}]`).val(hasSub ? 'group' : (!!item.parent && item.parent != '0' ? 'item' : 'step')); + if(options.postDataID) $row.find('.steps-editor-post-data-id').attr('name', `id[${item.name}]`); + const $expect = $row.find('.steps-editor-step-expect').attr( + { + name: `${options.expectsName}[${item.name}]`, + disabled: hasSub && options.expectDisabled ? 'disabled' : null + }).toggleClass('disabled', hasSub && options.expectDisabled); + $expect.parent().toggleClass('disabled', hasSub && options.expectDisabled); + $row.find('.steps-editor-col-delete .btn').toggleClass('disabled', hasSub || this._items.length == 1); + $row.find('.steps-editor-col-delete .btn.disabled').attr('title', options.deleteStepTip); + $row.find('.steps-editor-col-add .btn-action[data-action="sub"]').toggleClass('disabled', item.level >= 3); + if(isNew) $row.find('textarea').autoHeight({fast: true}); + }); return $row; } diff --git a/module/action/config.php b/module/action/config.php index 9899981166..1c26be3a42 100755 --- a/module/action/config.php +++ b/module/action/config.php @@ -71,6 +71,7 @@ $config->action->objectNameFields['prompt'] = 'name'; $config->action->objectNameFields['miniprogram'] = 'name'; $config->action->objectNameFields['holiday'] = 'name'; $config->action->objectNameFields['system'] = 'name'; +$config->action->objectNameFields['deliverable'] = 'name'; $config->action->commonImgSize = 870; diff --git a/module/action/lang/de.php b/module/action/lang/de.php index 17418cb670..40f0be5363 100644 --- a/module/action/lang/de.php +++ b/module/action/lang/de.php @@ -191,6 +191,7 @@ $lang->action->objectTypes['board'] = 'Board'; $lang->action->objectTypes['boardspace'] = 'Board Space'; $lang->action->objectTypes['productline'] = 'Product Line'; $lang->action->objectTypes['system'] = $lang->product->system; +$lang->action->objectTypes['deliverable'] = 'Deliverable'; /* Used to describe operation history. */ $lang->action->desc = new stdclass(); @@ -937,6 +938,7 @@ $lang->action->label->instance = 'Application|instance|view|id=%s'; $lang->action->label->prompt = 'Prompt|ai|promptview|id=%s'; $lang->action->label->miniprogram = 'Mini Program|aiapp|browseminiprogram|id=%s'; $lang->action->label->holiday = 'Holiday|holiday|browse|'; +$lang->action->label->deliverable = 'Deliverable|deliverable|view|id=%s'; /* Object type. */ $lang->action->search = new stdclass(); diff --git a/module/action/lang/en.php b/module/action/lang/en.php index bc5d4af4ea..5860a6b5fd 100755 --- a/module/action/lang/en.php +++ b/module/action/lang/en.php @@ -191,6 +191,7 @@ $lang->action->objectTypes['board'] = 'Board'; $lang->action->objectTypes['boardspace'] = 'Board Space'; $lang->action->objectTypes['productline'] = 'Product Line'; $lang->action->objectTypes['system'] = $lang->product->system; +$lang->action->objectTypes['deliverable'] = 'Deliverable'; /* Used to describe operation history. */ $lang->action->desc = new stdclass(); @@ -937,6 +938,7 @@ $lang->action->label->instance = 'Application|instance|view|id=%s'; $lang->action->label->prompt = 'Prompt|ai|promptview|id=%s'; $lang->action->label->miniprogram = 'Mini Program|aiapp|browseminiprogram|id=%s'; $lang->action->label->holiday = 'Holiday|holiday|browse|'; +$lang->action->label->deliverable = 'Deliverable|deliverable|view|id=%s'; /* Object type. */ $lang->action->search = new stdclass(); diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php index 5fce10c0f7..61ee3a5353 100644 --- a/module/action/lang/fr.php +++ b/module/action/lang/fr.php @@ -191,6 +191,7 @@ $lang->action->objectTypes['board'] = 'Board'; $lang->action->objectTypes['boardspace'] = 'Board Space'; $lang->action->objectTypes['productline'] = 'Product Line'; $lang->action->objectTypes['system'] = $lang->product->system; +$lang->action->objectTypes['deliverable'] = 'Deliverable'; /* Used to describe operation history. */ $lang->action->desc = new stdclass(); @@ -937,6 +938,7 @@ $lang->action->label->instance = 'Application|instance|view|id=%s'; $lang->action->label->prompt = 'Prompt|ai|promptview|id=%s'; $lang->action->label->miniprogram = 'Mini Program|aiapp|browseminiprogram|id=%s'; $lang->action->label->holiday = 'Holiday|holiday|browse|'; +$lang->action->label->deliverable = 'Deliverable|deliverable|view|id=%s'; /* Object type. */ $lang->action->search = new stdclass(); diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php index 6d33955720..2a0de805e2 100755 --- a/module/action/lang/zh-cn.php +++ b/module/action/lang/zh-cn.php @@ -191,6 +191,7 @@ $lang->action->objectTypes['board'] = '白板'; $lang->action->objectTypes['boardspace'] = '白板空间'; $lang->action->objectTypes['productline'] = '产品线'; $lang->action->objectTypes['system'] = $lang->product->system; +$lang->action->objectTypes['deliverable'] = '交付物'; /* 用来描述操作历史记录。*/ $lang->action->desc = new stdclass(); @@ -937,6 +938,7 @@ $lang->action->label->instance = '服务|instance|view|id=%s'; $lang->action->label->prompt = '提词|ai|promptview|id=%s'; $lang->action->label->miniprogram = '小程序|aiapp|browseminiprogram|id=%s'; $lang->action->label->holiday = '节假日|holiday|browse|'; +$lang->action->label->deliverable = '交付物|deliverable|view|id=%s'; /* Object type. */ $lang->action->search = new stdclass(); diff --git a/module/action/model.php b/module/action/model.php index 4c0b54675b..75e4b8cf66 100755 --- a/module/action/model.php +++ b/module/action/model.php @@ -197,7 +197,6 @@ class actionModel extends model $this->loadModel('workflow'); foreach($actions as $actionID => $action) { - $extra = $action->extra; $actionName = strtolower($action->action); if($this->config->edition != 'open' && !isset($flowList[$action->objectType])) $flowList[$action->objectType] = $this->workflow->getByModule($action->objectType); @@ -940,6 +939,12 @@ class actionModel extends model foreach($actions as $action) { $item = new stdClass(); + if(strlen(trim(($action->comment))) !== 0) + { + $item->comment = $this->formatActionComment($action->comment); + $currentUserCanEdit = $action->id == $endAction->id && $action->actor == $account && $action->action == 'commented'; + $item->commentEditable = $commentEditable && common::hasPriv('action', 'editComment') && $currentUserCanEdit; + } if($action->action === 'assigned' || $action->action === 'toaudit') { @@ -951,7 +956,7 @@ class actionModel extends model $action->actor = zget($users, $action->actor); if(str_contains($action->actor, ':')) $action->actor = substr($action->actor, strpos($action->actor, ':') + 1); - if(!empty($action->history)) $item->historyChanges = $this->renderChanges($action->objectType, $action->history); + if(!empty($action->history)) $item->historyChanges = $this->renderChanges($action->objectType, $action->objectID, $action->history); $item->id = $action->id; $item->action = $action->action; @@ -1166,7 +1171,7 @@ class actionModel extends model /* If idList include ',*,' Format ',*,' to '*'. */ $projectIdList = array(); - foreach($projectGroups as $key => $idList) + foreach($projectGroups as $idList) { $idList = explode(',', (string)$idList); foreach($idList as $id) $projectIdList[] = $id; @@ -1452,12 +1457,13 @@ class actionModel extends model * Render histories of every action. * * @param string $objectType + * @param int $objectID * @param array $histories * @param bool $canChangeTag * @access public * @return string */ - public function renderChanges(string $objectType, array $histories, bool $canChangeTag = true): string + public function renderChanges(string $objectType, int $objectID, array $histories, bool $canChangeTag = true): string { if(empty($histories)) return ''; @@ -1507,7 +1513,14 @@ class actionModel extends model } else { - $content .= sprintf($this->lang->action->desc->diff1, $history->fieldLabel, $history->old, $history->new); + if($history->field == 'deliverable' && ($objectType == 'project' || $objectType == 'execution')) + { + $content .= $this->processDeliverableJson($objectType, $objectID, $history); + } + else + { + $content .= sprintf($this->lang->action->desc->diff1, $history->fieldLabel, $history->old, $history->new); + } } } return $content; @@ -1518,14 +1531,15 @@ class actionModel extends model * Print histories of every action. * * @param string $objectType + * @param int $objectID * @param array $histories * @param bool $canChangeTag * @access public * @return void */ - public function printChanges(string $objectType, array $histories, bool $canChangeTag = true): void + public function printChanges(string $objectType, int $objectID, array $histories, bool $canChangeTag = true): void { - $content = $this->renderChanges($objectType, $histories, $canChangeTag); + $content = $this->renderChanges($objectType, $objectID, $histories, $canChangeTag); if(is_string($content)) echo $content; } diff --git a/module/admin/config.php b/module/admin/config.php index 48b6d8c167..f205582b85 100755 --- a/module/admin/config.php +++ b/module/admin/config.php @@ -8,7 +8,7 @@ if(!isset($config->safe->weak)) $config->safe->weak = '123456,password,12345,123 $config->admin->menuGroup['system'] = array('custom|mode', 'backup', 'cron', 'action|trash', 'admin|xuanxuan', 'setting|xuanxuan', 'admin|license', 'admin|checkweak', 'admin|resetpwdsetting', 'admin|safe', 'cache|setting', 'custom|timezone', 'search|buildindex', 'admin|tableengine', 'ldap', 'custom|libreoffice', 'conference', 'watermark', 'client', 'system|browsebackup', 'system|restorebackup'); $config->admin->menuGroup['company'] = array('dept', 'company', 'user', 'group', 'tutorial'); $config->admin->menuGroup['switch'] = array('admin|setmodule'); -$config->admin->menuGroup['model'] = array('auditcl', 'stage', 'design', 'cmcl', 'reviewcl', 'custom|required', 'custom|set', 'custom|flow', 'custom|code', 'custom|percent','custom|estimate', 'custom|hours', 'subject', 'process', 'activity', 'zoutput', 'classify', 'holiday', 'reviewsetting', 'custom|project'); +$config->admin->menuGroup['model'] = array('auditcl', 'stage', 'deliverable', 'design', 'cmcl', 'reviewcl', 'custom|required', 'custom|set', 'custom|flow', 'custom|code', 'custom|percent','custom|estimate', 'custom|hours', 'subject', 'process', 'activity', 'zoutput', 'classify', 'holiday', 'reviewsetting', 'custom|project'); $config->admin->menuGroup['feature'] = array('custom|set', 'custom|product', 'custom|execution', 'custom|required', 'custom|kanban', 'measurement', 'meetingroom', 'custom|browsestoryconcept', 'custom|kanban', 'sqlbuilder', 'report', 'custom|limittaskdate', 'measurement'); $config->admin->menuGroup['template'] = array('custom|set', 'baseline'); $config->admin->menuGroup['message'] = array('mail', 'webhook', 'sms', 'message'); diff --git a/module/admin/lang/de.php b/module/admin/lang/de.php index f46edad4ef..11bc8a98f8 100755 --- a/module/admin/lang/de.php +++ b/module/admin/lang/de.php @@ -118,6 +118,7 @@ $lang->admin->setModule->opportunitylib = 'Opportunity Lib'; $lang->admin->setModule->practicelib = 'Practice Lib'; $lang->admin->setModule->componentlib = 'Component Lib'; $lang->admin->setModule->devops = 'DevOps'; +$lang->admin->setModule->deliverable = 'Deliverable'; $lang->admin->setModule->kanban = 'Kanban'; $lang->admin->setModule->OA = 'OA'; $lang->admin->setModule->deploy = 'Deploy'; diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php index ca0b92b227..aec0983c5b 100755 --- a/module/admin/lang/en.php +++ b/module/admin/lang/en.php @@ -118,6 +118,7 @@ $lang->admin->setModule->opportunitylib = 'Opportunity Lib'; $lang->admin->setModule->practicelib = 'Practice Lib'; $lang->admin->setModule->componentlib = 'Component Lib'; $lang->admin->setModule->devops = 'DevOps'; +$lang->admin->setModule->deliverable = 'Deliverable'; $lang->admin->setModule->kanban = 'Kanban'; $lang->admin->setModule->OA = 'OA'; $lang->admin->setModule->deploy = 'Deploy'; diff --git a/module/admin/lang/fr.php b/module/admin/lang/fr.php index 1d5b91d323..38b0490e3a 100755 --- a/module/admin/lang/fr.php +++ b/module/admin/lang/fr.php @@ -118,6 +118,7 @@ $lang->admin->setModule->opportunitylib = 'Opportunity Lib'; $lang->admin->setModule->practicelib = 'Practice Lib'; $lang->admin->setModule->componentlib = 'Component Lib'; $lang->admin->setModule->devops = 'DevOps'; +$lang->admin->setModule->deliverable = 'Deliverable'; $lang->admin->setModule->kanban = 'Kanban'; $lang->admin->setModule->OA = 'OA'; $lang->admin->setModule->deploy = 'Deploy'; diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php index cef8ec25a5..8acf9d1353 100644 --- a/module/admin/lang/menu.php +++ b/module/admin/lang/menu.php @@ -74,7 +74,7 @@ $lang->admin->menuList->company['menuOrder']['5'] = 'dept'; $lang->admin->menuList->company['menuOrder']['10'] = 'browseUser'; $lang->admin->menuList->company['menuOrder']['15'] = 'group'; -$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday,stage', 'exclude' => 'stage-browse,stage-plusbrowse,stage-create,stage-edit,stage-batchcreate'); +$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday,stage,deliverable', 'exclude' => 'stage-browse,stage-plusbrowse,stage-create,stage-edit,stage-batchcreate'); $lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|", 'subModule' => 'auditcl'); $lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "{$lang->waterfallModel}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-settype,stage-plusbrowse'); $lang->admin->menuList->model['subMenu']['agileplus'] = array('link' => "{$lang->agilePlusModel}|auditcl|agileplusbrowse|", 'subModule' => 'auditcl'); @@ -86,13 +86,14 @@ $lang->admin->menuList->model['menuOrder']['15'] = 'waterfall'; $lang->admin->menuList->model['menuOrder']['20'] = 'agileplus'; $lang->admin->menuList->model['menuOrder']['25'] = 'waterfallplus'; -$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set,project', 'exclude' => 'custom-required', 'links' => array('custom|set|module=project&field=unitList')); -if(helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus')) $lang->admin->menuList->model['tabMenu']['common']['stage'] = array('link' => "{$lang->stage->type}|stage|settype|", 'subModule' => 'stage'); -$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom'); -$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true); +$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set,project', 'exclude' => 'custom-required', 'links' => array('custom|set|module=project&field=unitList')); +if(helper::hasFeature('waterfall') || helper::hasFeature('waterfallplus')) $lang->admin->menuList->model['tabMenu']['common']['stage'] = array('link' => "{$lang->stage->type}|stage|settype|", 'subModule' => 'stage'); +if(helper::hasFeature('deliverable') && ($config->edition == 'max' || $config->edition == 'ipd')) $lang->admin->menuList->model['tabMenu']['common']['deliverable'] = array('link' => "{$lang->deliverable->common}|deliverable|browse|", 'subModule' => 'deliverable'); +$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom'); +$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true); -$lang->admin->menuList->model['tabMenu']['common']['percent'] = array('link' => "{$lang->stage->percent}|custom|percent|"); -$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|', 'custom|hours|')); +$lang->admin->menuList->model['tabMenu']['common']['percent'] = array('link' => "{$lang->stage->percent}|custom|percent|"); +$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|', 'custom|hours|')); if(helper::hasFeature('waterfall')) $lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->list}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-plusbrowse'); if(helper::hasFeature('waterfallplus')) $lang->admin->menuList->model['tabMenu']['waterfallplus']['stage'] = array('link' => "{$lang->stage->list}|stage|plusbrowse|", 'subModule' => 'stage', 'exclude' => 'stage-browse'); $lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project'; @@ -103,6 +104,10 @@ $lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'p $lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours'; if(helper::hasFeature('waterfall')) $lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage'; if(helper::hasFeature('waterfallplus')) $lang->admin->menuList->model['tabMenu']['menuOrder']['waterfallplus']['5'] = 'stage'; +if($config->edition == 'max' or $config->edition == 'ipd') +{ + $lang->admin->menuList->model['tabMenu']['menuOrder']['common']['15'] = 'deliverable'; +} $lang->admin->menuList->feature['subMenu']['my'] = array('link' => "{$lang->my->common}|custom|set|module=todo&field=priList", 'exclude' => 'set,required'); $lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product", 'exclude' => 'set,required', 'alias' => 'browsestoryconcept,product'); diff --git a/module/admin/lang/zh-cn.php b/module/admin/lang/zh-cn.php index 2be5c58512..18dbf40abe 100755 --- a/module/admin/lang/zh-cn.php +++ b/module/admin/lang/zh-cn.php @@ -118,6 +118,7 @@ $lang->admin->setModule->opportunitylib = '机会库'; $lang->admin->setModule->practicelib = '最佳实践库'; $lang->admin->setModule->componentlib = '组件库'; $lang->admin->setModule->devops = 'DevOps'; +$lang->admin->setModule->deliverable = '交付物'; $lang->admin->setModule->kanban = '通用看板'; $lang->admin->setModule->OA = '办公'; $lang->admin->setModule->deploy = '运维'; @@ -170,7 +171,7 @@ $lang->admin->menuSetting['user']['name'] = '人员管理'; $lang->admin->menuSetting['user']['desc'] = '维护部门、添加人员、分组配置权限。'; $lang->admin->menuSetting['switch']['name'] = '功能开关'; $lang->admin->menuSetting['switch']['desc'] = '打开、关闭系统部分功能。'; -$lang->admin->menuSetting['model']['name'] = '模型配置'; +$lang->admin->menuSetting['model']['name'] = '项目模型配置'; $lang->admin->menuSetting['model']['desc'] = '不同项目管理模型和项目通用要素配置。'; $lang->admin->menuSetting['feature']['name'] = '功能配置'; $lang->admin->menuSetting['feature']['desc'] = '按照功能菜单进行系统的要素配置。'; diff --git a/module/bug/config.php b/module/bug/config.php index f8caed6827..034f396f3b 100755 --- a/module/bug/config.php +++ b/module/bug/config.php @@ -34,14 +34,14 @@ $config->bug->list->allFields = 'id, module, execution, story, task, $config->bug->list->defaultFields = 'id,title,severity,pri,openedBy,assignedTo,resolvedBy,resolution'; $config->bug->list->customCreateFields = 'execution,noticefeedbackBy,story,task,pri,severity,os,browser,deadline,mailto,keywords'; $config->bug->list->customBatchEditFields = 'type,severity,pri,productplan,assignedTo,deadline,resolvedBy,resolution,os,browser,keywords'; -$config->bug->list->customBatchCreateFields = 'project,execution,steps,type,pri,deadline,severity,os,browser,keywords'; +$config->bug->list->customBatchCreateFields = 'project,execution,plan,steps,type,pri,deadline,severity,os,browser,keywords'; $config->bug->custom = new stdclass(); $config->bug->custom->createFields = $config->bug->list->customCreateFields; $config->bug->custom->batchCreateFields = 'project,execution,deadline,steps,type,pri,severity,os,browser,%s'; $config->bug->custom->batchEditFields = 'type,severity,pri,assignedTo,deadline,status,resolvedBy,resolution'; -$config->bug->exportFields = 'id, product, branch, module, project, execution, story, task, +$config->bug->exportFields = 'id, product, branch, module, project, execution, plan, story, task, title, keywords, severity, pri, type, os, browser, steps, status, deadline, activatedCount, confirmed, mailto, openedBy, openedDate, openedBuild, diff --git a/module/bug/config/form.php b/module/bug/config/form.php index 9736e3f52d..12057be640 100644 --- a/module/bug/config/form.php +++ b/module/bug/config/form.php @@ -10,6 +10,7 @@ $config->bug->form->create['openedBuild'] = array('required' => true, 'type' => $config->bug->form->create['product'] = array('required' => false, 'type' => 'int', 'default' => 0); $config->bug->form->create['branch'] = array('required' => false, 'type' => 'int', 'default' => 0); $config->bug->form->create['module'] = array('required' => false, 'type' => 'int', 'default' => 0); +$config->bug->form->create['plan'] = array('required' => false, 'type' => 'int', 'default' => 0); $config->bug->form->create['project'] = array('required' => false, 'type' => 'int', 'default' => 0); $config->bug->form->create['execution'] = array('required' => false, 'type' => 'int', 'default' => 0); $config->bug->form->create['assignedTo'] = array('required' => false, 'type' => 'string', 'default' => ''); @@ -159,6 +160,7 @@ $config->bug->form->batchCreate['story'] = array('required' => false, 'typ $config->bug->form->batchCreate['branch'] = array('required' => false, 'type' => 'int', 'default' => 0); $config->bug->form->batchCreate['laneID'] = array('required' => false, 'type' => 'int', 'default' => 0); $config->bug->form->batchCreate['openedBuild'] = array('required' => true, 'type' => 'array', 'default' => '', 'filter' => 'join'); +$config->bug->form->batchCreate['plan'] = array('required' => false, 'type' => 'int', 'default' => 0); $config->bug->form->batchCreate['title'] = array('required' => true, 'type' => 'string', 'default' => '', 'base' => true); $config->bug->form->batchCreate['deadline'] = array('required' => false, 'type' => 'date', 'default' => null); $config->bug->form->batchCreate['steps'] = array('required' => false, 'type' => 'string', 'default' => '', 'control' => 'editor'); diff --git a/module/bug/config/table.php b/module/bug/config/table.php index c6116e204b..856b198bd4 100644 --- a/module/bug/config/table.php +++ b/module/bug/config/table.php @@ -70,11 +70,12 @@ $config->bug->dtable->fieldList['execution']['group'] = 3; $config->bug->dtable->fieldList['execution']['dataSource'] = array('module' => 'execution', 'method' =>'getPairs', 'params' => ['projectID' => 0]); $config->bug->dtable->fieldList['execution']['sortType'] = true; -$config->bug->dtable->fieldList['plan']['title'] = $lang->bug->plan; -$config->bug->dtable->fieldList['plan']['width'] = 120; -$config->bug->dtable->fieldList['plan']['group'] = 3; -$config->bug->dtable->fieldList['plan']['sortType'] = true; -$config->bug->dtable->fieldList['plan']['hint'] = true; +$config->bug->dtable->fieldList['plan']['title'] = $lang->bug->plan; +$config->bug->dtable->fieldList['plan']['width'] = 120; +$config->bug->dtable->fieldList['plan']['group'] = 3; +$config->bug->dtable->fieldList['plan']['sortType'] = true; +$config->bug->dtable->fieldList['plan']['hint'] = true; +$config->bug->dtable->fieldList['plan']['dataSource'] = array('module' => 'productplan', 'method' =>'getPairs', 'params' => ['productIdList' => '$productIdList', 'branch' => '$branch']); $config->bug->dtable->fieldList['openedBuild']['title'] = $lang->bug->openedBuild; $config->bug->dtable->fieldList['openedBuild']['type'] = 'text'; diff --git a/module/bug/control.php b/module/bug/control.php index b883f78ab4..b1b4fb23bf 100755 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -646,7 +646,17 @@ class bug extends control { /* 设置bug导出的参数。 */ /* Set bug export params. */ - $this->session->set('bugTransferParams', array('productID' => $productID, 'executionID' => $executionID, 'branch' => 'all')); + if($executionID) + { + $productIdList = $this->loadModel('product')->getProductPairsByProject($executionID); + $productIdList = array_keys($productIdList); + } + else + { + $productIdList = array($productID); + } + + $this->session->set('bugTransferParams', array('productID' => $productID, 'executionID' => $executionID, 'branch' => 'all', 'productIdList' => $productIdList)); /* 设置导出数据源。 */ /* Set export data source. */ diff --git a/module/bug/js/edit.ui.js b/module/bug/js/edit.ui.js index b043cb7cca..48b36c7ba8 100644 --- a/module/bug/js/edit.ui.js +++ b/module/bug/js/edit.ui.js @@ -40,3 +40,9 @@ function linkBug() openUrl(link, {load: 'modal', size: 'lg'}); } + +function setDuplicateBug() +{ + const productID = $('[name=product]').val(); + loadProductBugs(productID, bug.id); +} diff --git a/module/bug/model.php b/module/bug/model.php index b2fef73673..c0d51afa2d 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -41,7 +41,7 @@ class bugModel extends model if(!empty($bug->assignedTo)) $this->action->create('bug', $bugID, 'Assigned', '', $bug->assignedTo); /* Add score for create. */ - $files = $this->loadModel('file')->saveUpload('bug', $bugID); + $this->loadModel('file')->saveUpload('bug', $bugID); if(!empty($bug->case)) { $this->loadModel('score')->create('bug', 'createFormCase', $bug->case); @@ -344,7 +344,7 @@ class bugModel extends model if($changes) $this->action->logHistory($actionID, $changes); } - if($this->config->edition != 'open') + if($this->config->edition != 'open' && $this->app->rawMethod != 'batchedit') { if($oldBug->story > 0 || $oldBug->task > 0 || $oldBug->case > 0) { @@ -771,7 +771,7 @@ class bugModel extends model $this->config->bug->search['queryID'] = $queryID; $this->config->bug->search['params']['project']['values'] = $projectParams; $this->config->bug->search['params']['product']['values'] = $productParams; - $this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getPairs($productID); + $this->config->bug->search['params']['plan']['values'] = $this->loadModel('productplan')->getPairs($productID, '', '', true); $this->config->bug->search['params']['module']['values'] = $modules; $this->config->bug->search['params']['execution']['values'] = $this->loadModel('product')->getExecutionPairsByProduct($productID, '0', (int)$projectID); $this->config->bug->search['params']['severity']['values'] = array(0 => '') + $this->lang->bug->severityList; //Fix bug #939. diff --git a/module/bug/ui/batchcreate.html.php b/module/bug/ui/batchcreate.html.php index 1906819900..b8de0005af 100644 --- a/module/bug/ui/batchcreate.html.php +++ b/module/bug/ui/batchcreate.html.php @@ -12,6 +12,7 @@ namespace zin; $defaultBug = array('module' => $moduleID, 'project' => $projectID, 'execution' => $executionID, 'openedBuild' => 'trunk', 'pri' => 3, 'severity' => 3); if($product->type != 'normal') $defaultBug['branch'] = $branch; +if($product->shadow) unset($customFields['plan']); if(isset($executionType) && $executionType == 'kanban') { $defaultBug['region'] = $regionID; @@ -64,6 +65,9 @@ $items[] = array /* Field of openedBuild. */ $items[] = array('name' => 'openedBuild', 'label' => $lang->bug->openedBuild, 'control' => 'picker', 'items' => $builds, 'value' => 'trunk', 'multiple' => true, 'width' => '200px', 'required' => true, 'ditto' => true); +/* Field of plan. */ +if(!$product->shadow) $items[] = array('name' => 'plan', 'label' => $lang->bug->plan, 'control' => 'picker', 'items' => $plans, 'value' => '', 'width' => '200px', 'required' => isset($requiredFields['plan']), 'ditto' => true); + /* Field of title. */ $items[] = array( 'name' => 'title', 'label' => $lang->bug->title, 'width' => '240px', 'required' => true, 'control' => 'colorInput'); diff --git a/module/bug/ui/common.field.php b/module/bug/ui/common.field.php index 548b4facec..d9ef075481 100644 --- a/module/bug/ui/common.field.php +++ b/module/bug/ui/common.field.php @@ -58,6 +58,7 @@ if(data('executionType') && data('executionType') == 'kanban') } $fields->field('title') + ->className('full:w-full') ->control('colorInput', array('colorValue' => data('bug.color'))); $fields->field('type') diff --git a/module/bug/ui/create.field.php b/module/bug/ui/create.field.php index 4e2cc0f7e1..fffdc4d53f 100644 --- a/module/bug/ui/create.field.php +++ b/module/bug/ui/create.field.php @@ -27,6 +27,13 @@ $fields->field('execution') ->className($isShadowProduct && $isOriginalProduct ? 'full:w-1/2' : 'full:w-1/4') ->foldable(!$isShadowProduct); +$fields->field('plan') + ->label($lang->bug->plan) + ->className('w-1/2 full:w-1/2') + ->hidden($noMultipleProject) + ->items(data('plans')) + ->foldable(); + if(common::hasPriv('build', 'create')) { $fields->field('openedBuild') diff --git a/module/bug/ui/create.html.php b/module/bug/ui/create.html.php index 68150fa7a0..15d6311d04 100644 --- a/module/bug/ui/create.html.php +++ b/module/bug/ui/create.html.php @@ -24,7 +24,8 @@ $fields->autoLoad('branch', 'module,execution,project,story,task,assignedTo') ->autoLoad('allUsers', 'assignedTo') ->autoLoad('region', 'lane'); -if(!$product->shadow) $fields->fullModeOrders('module,project,execution'); +if(!$product->shadow) $fields->fullModeOrders('module,project,execution,plan', 'pri,title'); +$fields->sort('execution,plan'); jsVar('bug', $bug); jsVar('moduleID', $bug->moduleID); diff --git a/module/bug/ui/edit.html.php b/module/bug/ui/edit.html.php index 142a0180de..bdcd368e28 100644 --- a/module/bug/ui/edit.html.php +++ b/module/bug/ui/edit.html.php @@ -517,7 +517,8 @@ detailBody set::name($lang->bug->duplicateBug), picker ( - set::items($productBugs), + on::click('setDuplicateBug'), + set::items(array()), set::name('duplicateBug'), set::value($bug->duplicateBug) ) diff --git a/module/bug/zen.php b/module/bug/zen.php index e388eaa3a0..e8b3eca51c 100644 --- a/module/bug/zen.php +++ b/module/bug/zen.php @@ -379,6 +379,7 @@ class bugZen extends bug protected function getExportFields(int $executionID, object|bool $product): string { $exportFields = str_replace(' ', '', $this->config->bug->exportFields); + $isShadow = false; if(isset($product->type) and $product->type == 'normal') $exportFields = str_replace(',branch,', ',', ",{$exportFields},");; if(!$product) { @@ -387,9 +388,16 @@ class bugZen extends bug foreach($products as $product) { if($product->type != 'normal') $hasBranch = true; + if(!empty($product->shadow)) $isShadow = true; } if(!$hasBranch) $exportFields = str_replace(',branch,', ',', ",{$exportFields},"); } + else + { + $isShadow = $product->shadow; + } + + if($isShadow) $exportFields = str_replace(',plan,', ',', ",{$exportFields},"); if($this->app->tab == 'project' or $this->app->tab == 'execution') { $execution = $this->loadModel('execution')->getByID($executionID); @@ -1104,6 +1112,7 @@ class bugZen extends bug $this->view->branchID = $bug->branch != 'all' ? $bug->branch : '0'; $this->view->cases = $this->loadModel('testcase')->getPairsByProduct($this->session->product, array(0, $this->view->branchID)); $this->view->copyBugID = isset($bugID) ? $bugID : 0; + $this->view->plans = $this->loadModel('productplan')->getPairs($bug->productID, $bug->branch, 'noclosed', true); } /** @@ -1133,8 +1142,6 @@ class bugZen extends bug /* Get bugs of current product. */ $branch = ''; if($product->type == 'branch') $branch = $bug->branch > 0 ? "{$bug->branch},0" : '0'; - $productBugs = $this->bug->getProductBugPairs($bug->product, $branch); - unset($productBugs[$bug->id]); /* Get execution pairs. */ $unAllowedStage = array('request', 'design', 'review'); @@ -1156,7 +1163,7 @@ class bugZen extends bug if($product->type != 'normal') $branchTagOption = $this->getBranchOptions($product->id); if($this->config->edition == 'max') $this->view->injectionList = $this->view->identifyList = $this->loadModel('review')->getPairs($bug->project, $bug->product, true); - $this->assignVarsForEdit($bug); + $this->assignVarsForEdit($bug, $product); $this->view->title = $this->lang->bug->edit . "BUG #$bug->id $bug->title - " . $this->products[$bug->product]; $this->view->bug = $bug; @@ -1165,7 +1172,6 @@ class bugZen extends bug $this->view->projectID = $bug->project; $this->view->projects = $projects; $this->view->executions = $executions; - $this->view->productBugs = $productBugs; $this->view->branchTagOption = $branchTagOption; $this->view->projectExecutionPairs = $this->loadModel('project')->getProjectExecutionPairs(); } @@ -1175,10 +1181,11 @@ class bugZen extends bug * Assign variables for editing bug. * * @param object $bug + * @param object $product * @access protected * @return void */ - protected function assignVarsForEdit(object $bug): void + protected function assignVarsForEdit(object $bug, object $product): void { /* Add product related to the bug when it is not in the products. */ if(!isset($this->products[$bug->product])) @@ -1401,6 +1408,7 @@ class bugZen extends bug $this->view->branch = $branch; $this->view->branches = $branches; $this->view->moduleOptionMenu = $this->tree->getOptionMenu($product->id, 'bug', 0, $branch === 'all' ? 'all' : (string)$branch); + $this->view->plans = $this->loadModel('productplan')->getPairs($product->id, $branch, 'noclosed', true); } /** @@ -2450,7 +2458,9 @@ class bugZen extends bug $fields = array('projectID' => $bugInfo->project, 'moduleID' => $bugInfo->module, 'executionID' => $bugInfo->execution, 'taskID' => $bugInfo->task, 'storyID' => $isSameProduct ? $bugInfo->story : 0, 'buildID' => $bugInfo->openedBuild, 'caseID' => $bugInfo->case, 'title' => $bugInfo->title, 'steps' => $bugInfo->steps, 'severity' => $bugInfo->severity, 'type' => $bugInfo->type, 'assignedTo' => $bugInfo->assignedTo, 'deadline' => (helper::isZeroDate($bugInfo->deadline) ? '' : $bugInfo->deadline), 'os' => $bugInfo->os, 'browser' => $bugInfo->browser, 'mailto' => $bugInfo->mailto, 'keywords' => $bugInfo->keywords, 'color' => $bugInfo->color, 'testtask' => $bugInfo->testtask, 'feedbackBy' => $bugInfo->feedbackBy, 'notifyEmail' => $bugInfo->notifyEmail, - 'pri' => ($bugInfo->pri == 0 ? 3 : $bugInfo->pri)); + 'pri' => ($bugInfo->pri == 0 ? 3 : $bugInfo->pri), + 'plan' => $bugInfo->plan + ); $bug = $this->updateBug($bug, $fields); diff --git a/module/build/lang/de.php b/module/build/lang/de.php index 2a28219b1b..da915fb5f5 100644 --- a/module/build/lang/de.php +++ b/module/build/lang/de.php @@ -10,6 +10,7 @@ * @link https://www.zentao.net */ $lang->build->common = "Build"; +$lang->build->browse = "Build List"; $lang->build->create = "Build erstellen"; $lang->build->edit = "Bearbeiten"; $lang->build->linkStory = "{$lang->SRCommon} verknüpfen"; diff --git a/module/build/lang/en.php b/module/build/lang/en.php index 87cdd16721..7029c0d180 100644 --- a/module/build/lang/en.php +++ b/module/build/lang/en.php @@ -10,6 +10,7 @@ * @link https://www.zentao.net */ $lang->build->common = "Build"; +$lang->build->browse = "Build List"; $lang->build->create = "Create Build"; $lang->build->edit = "Edit Build"; $lang->build->linkStory = "Link {$lang->SRCommon}"; diff --git a/module/build/lang/fr.php b/module/build/lang/fr.php index 85d2daf8d1..da7ea5afec 100644 --- a/module/build/lang/fr.php +++ b/module/build/lang/fr.php @@ -10,6 +10,7 @@ * @link https://www.zentao.net */ $lang->build->common = "Build"; +$lang->build->browse = "Liste Build"; $lang->build->create = "Créer Build"; $lang->build->edit = "Editer Build"; $lang->build->linkStory = "Intégrer {$lang->SRCommon}"; diff --git a/module/build/lang/zh-cn.php b/module/build/lang/zh-cn.php index 3130868d54..5c980b8b51 100644 --- a/module/build/lang/zh-cn.php +++ b/module/build/lang/zh-cn.php @@ -10,6 +10,7 @@ * @link https://www.zentao.net */ $lang->build->common = "构建"; +$lang->build->browse = "构建列表"; $lang->build->create = "创建构建"; $lang->build->edit = "编辑构建"; $lang->build->linkStory = "关联{$lang->SRCommon}"; diff --git a/module/caselib/zen.php b/module/caselib/zen.php index 277c9951f2..28a7156c4c 100644 --- a/module/caselib/zen.php +++ b/module/caselib/zen.php @@ -245,8 +245,8 @@ class caselibZen extends caselib if(empty($rows)) { - $row->typeValue = join("\n", $this->lang->testcase->typeList); - $row->stageValue = join("\n", $this->lang->testcase->stageList); + $row->typeValue = implode("\n", $this->lang->testcase->typeList); + $row->stageValue = implode("\n", $this->lang->testcase->stageList); } $rows[] = $row; @@ -444,7 +444,7 @@ class caselibZen extends caselib $case->stage = array(); foreach($stages as $stage) $case->stage[] = array_search($stage, $this->lang->testcase->stageList); - $case->stage = join(',', $case->stage); + $case->stage = implode(',', $case->stage); } else { @@ -558,7 +558,6 @@ class caselibZen extends caselib { $users = $this->loadModel('user')->getPairs('noletter'); $relatedModules = $this->loadModel('tree')->getModulePairs($libID, 'caselib'); - $relatedCases = $this->loadModel('testcase')->getRelatedCases($cases); $relatedSteps = $this->testcase->getRelatedSteps(array_keys($cases)); $relatedFiles = $this->testcase->getRelatedFiles(array_keys($cases)); @@ -655,7 +654,7 @@ class caselibZen extends caselib { $case->stage = explode(',', $case->stage); foreach($case->stage as $key => $stage) $case->stage[$key] = isset($this->lang->testcase->stageList[$stage]) ? $this->lang->testcase->stageList[$stage] : $stage; - $case->stage = join("\n", $case->stage); + $case->stage = implode("\n", $case->stage); } /** @@ -697,6 +696,6 @@ class caselibZen extends caselib $linkCaseID = trim($linkCaseID); $tmpLinkCases[] = isset($relatedCases[$linkCaseID]) ? $relatedCases[$linkCaseID] . "(#$linkCaseID)" : $linkCaseID; } - $case->linkCase = join("; \n", $tmpLinkCases); + $case->linkCase = implode("; \n", $tmpLinkCases); } } diff --git a/module/cne/model.php b/module/cne/model.php index 503b2ab8ac..b3290746ac 100644 --- a/module/cne/model.php +++ b/module/cne/model.php @@ -250,8 +250,28 @@ class cneModel extends model $result = $this->apiGet('/api/cne/statistics/cluster', array('cluster' => ''), $this->config->CNE->api->headers); if($result->code != 200) return $statistics; + $nodes = $this->apiGet('/api/cne/cluster/nodes', array('cluster' => ''), $this->config->CNE->api->headers); + if($nodes->code != 200) return $statistics; + + $readyNode = 0; + $nodeError = ''; + foreach($nodes->data as $node) + { + if($node->ready) + { + $readyNode++; + } + else + { + if(empty($node->issues)) continue; + $nodeError .= sprintf($this->lang->system->nodeNotice, $node->name, implode(',', array_unique($node->issues))) . "\n"; + } + } $statistics = $result->data; + $statistics->node_count = count($nodes->data); + $statistics->ready_count = $readyNode; + $statistics->nodeError = $nodeError; $statistics->metrics->cpu->usage = max(round($statistics->metrics->cpu->usage, 4), 0); $statistics->metrics->cpu->capacity = max(round($statistics->metrics->cpu->capacity, 4), $statistics->metrics->cpu->usage); $statistics->metrics->cpu->allocatable = round($statistics->metrics->cpu->allocatable, 4); diff --git a/module/cne/test/model/cnemetrics.php b/module/cne/test/model/cnemetrics.php index 4d3e55c4e7..1c47a520ba 100755 --- a/module/cne/test/model/cnemetrics.php +++ b/module/cne/test/model/cnemetrics.php @@ -7,8 +7,11 @@ title=测试 cneModel->cneMetrics(); timeout=0 cid=1 -- 获取CNE平台的集群度量属性status @normal - +- 获取CNE平台的集群度量状态属性status @unknown +- 获取CNE平台的集群cpu数据属性usage @0 +- 获取CNE平台的集群cpu数据属性capacity @0 +- 获取CNE平台的集群内存属性usage @0 +- 获取CNE平台的集群内存属性capacity @0 */ include dirname(__FILE__, 5) . '/test/lib/init.php'; @@ -20,4 +23,8 @@ $config->CNE->app->domain = 'g79n.corp.cc'; $cneModel = $tester->loadModel('cne'); -r($cneModel->cneMetrics()) && p('status') && e('normal'); // 获取CNE平台的集群度量 +r($cneModel->cneMetrics()) && p('status') && e('unknown'); // 获取CNE平台的集群度量状态 +r($cneModel->cneMetrics()->metrics->cpu) && p('usage') && e('0'); // 获取CNE平台的集群cpu数据 +r($cneModel->cneMetrics()->metrics->cpu) && p('capacity') && e('0'); // 获取CNE平台的集群cpu数据 +r($cneModel->cneMetrics()->metrics->memory) && p('usage') && e('0'); // 获取CNE平台的集群内存 +r($cneModel->cneMetrics()->metrics->memory) && p('capacity') && e('0'); // 获取CNE平台的集群内存 diff --git a/module/common/lang/common.php b/module/common/lang/common.php index 01677fd34a..1c242060ad 100644 --- a/module/common/lang/common.php +++ b/module/common/lang/common.php @@ -105,8 +105,12 @@ $lang->ops = new stdclass(); $lang->domain = new stdclass(); $lang->service = new stdclass(); $lang->deployment = new stdclass(); +$lang->deliverable = new stdclass(); $lang->metric = new stdclass(); +$lang->projectDeliverable = new stdclass(); +$lang->executionDeliverable = new stdclass(); + $lang->ai = new stdclass(); $lang->aiapp = new stdclass(); diff --git a/module/common/lang/de.php b/module/common/lang/de.php index 46ff6aea75..c46dcca65c 100644 --- a/module/common/lang/de.php +++ b/module/common/lang/de.php @@ -289,37 +289,40 @@ $lang->aiapp->common = 'AI'; $lang->product->system = 'Application'; $lang->configure->common = 'Configure'; -$lang->programstakeholder->common = 'Stakeholder'; -$lang->featureswitch->common = 'Features On/Off'; -$lang->importdata->common = 'Import data'; -$lang->systemsetting->common = 'System setting'; -$lang->staffmanage->common = 'User management'; -$lang->modelconfig->common = 'Pattern setting'; -$lang->featureconfig->common = 'Features config'; -$lang->doctemplate->common = 'Doc template'; -$lang->notifysetting->common = 'Notification'; -$lang->bidesign->common = 'BI design'; -$lang->personalsettings->common = 'Personal setting '; -$lang->projectsettings->common = 'Setting'; -$lang->dataaccess->common = 'Data permission'; -$lang->executiongantt->common = 'Gantt chart'; -$lang->executionkanban->common = 'Kanban'; -$lang->executionburn->common = 'Burndown chart'; -$lang->executioncfd->common = 'Cumulative Flow Diagram'; -$lang->executionstory->common = 'Story'; -$lang->executionqa->common = 'QA'; -$lang->executionsettings->common = 'Setting'; -$lang->generalcomment->common = 'Comment'; -$lang->generalping->common = 'Timeout prevention'; -$lang->generaltemplate->common = 'Template'; -$lang->generaleffort->common = 'General log'; -$lang->productsettings->common = 'Product setting'; -$lang->projectreview->common = 'Review'; -$lang->projecttrack->common = 'Matrix'; -$lang->projectqa->common = 'QA'; -$lang->holidayseason->common = 'Holiday'; -$lang->codereview->common = 'Review'; -$lang->repocode->common = 'Code'; +$lang->programstakeholder->common = 'Stakeholder'; +$lang->featureswitch->common = 'Features On/Off'; +$lang->importdata->common = 'Import data'; +$lang->systemsetting->common = 'System setting'; +$lang->staffmanage->common = 'User management'; +$lang->modelconfig->common = 'Pattern setting'; +$lang->featureconfig->common = 'Features config'; +$lang->doctemplate->common = 'Doc template'; +$lang->notifysetting->common = 'Notification'; +$lang->bidesign->common = 'BI design'; +$lang->personalsettings->common = 'Personal setting '; +$lang->projectsettings->common = 'Setting'; +$lang->dataaccess->common = 'Data permission'; +$lang->executiongantt->common = 'Gantt chart'; +$lang->executionkanban->common = 'Kanban'; +$lang->executionburn->common = 'Burndown chart'; +$lang->executioncfd->common = 'Cumulative Flow Diagram'; +$lang->executionstory->common = 'Story'; +$lang->executionqa->common = 'QA'; +$lang->executionsettings->common = 'Setting'; +$lang->generalcomment->common = 'Comment'; +$lang->generalping->common = 'Timeout prevention'; +$lang->generaltemplate->common = 'Template'; +$lang->generaleffort->common = 'General log'; +$lang->productsettings->common = 'Product setting'; +$lang->projectreview->common = 'Review'; +$lang->projecttrack->common = 'Matrix'; +$lang->projectqa->common = 'QA'; +$lang->holidayseason->common = 'Holiday'; +$lang->codereview->common = 'Review'; +$lang->repocode->common = 'Code'; +$lang->deliverable->common = 'Deliverable'; +$lang->projectDeliverable->common = 'Project Deliverable'; +$lang->executionDeliverable->common = 'Execution Deliverable'; $lang->personnel->common = 'Member'; $lang->personnel->invest = 'Investment'; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index d15451b81a..2008ab8507 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -289,37 +289,40 @@ $lang->aiapp->common = 'AI'; $lang->product->system = 'Application'; $lang->configure->common = 'Configure'; -$lang->programstakeholder->common = 'Stakeholder'; -$lang->featureswitch->common = 'Features On/Off'; -$lang->importdata->common = 'Import data'; -$lang->systemsetting->common = 'System setting'; -$lang->staffmanage->common = 'User management'; -$lang->modelconfig->common = 'Pattern setting'; -$lang->featureconfig->common = 'Features config'; -$lang->doctemplate->common = 'Doc template'; -$lang->notifysetting->common = 'Notification'; -$lang->bidesign->common = 'BI design'; -$lang->personalsettings->common = 'Personal setting '; -$lang->projectsettings->common = 'Setting'; -$lang->dataaccess->common = 'Data permission'; -$lang->executiongantt->common = 'Gantt chart'; -$lang->executionkanban->common = 'Kanban'; -$lang->executionburn->common = 'Burndown chart'; -$lang->executioncfd->common = 'Cumulative Flow Diagram'; -$lang->executionstory->common = 'Story'; -$lang->executionqa->common = 'QA'; -$lang->executionsettings->common = 'Setting'; -$lang->generalcomment->common = 'Comment'; -$lang->generalping->common = 'Timeout prevention'; -$lang->generaltemplate->common = 'Template'; -$lang->generaleffort->common = 'General log'; -$lang->productsettings->common = 'Product setting'; -$lang->projectreview->common = 'Review'; -$lang->projecttrack->common = 'Matrix'; -$lang->projectqa->common = 'QA'; -$lang->holidayseason->common = 'Holiday'; -$lang->codereview->common = 'Review'; -$lang->repocode->common = 'Code'; +$lang->programstakeholder->common = 'Stakeholder'; +$lang->featureswitch->common = 'Features On/Off'; +$lang->importdata->common = 'Import data'; +$lang->systemsetting->common = 'System setting'; +$lang->staffmanage->common = 'User management'; +$lang->modelconfig->common = 'Pattern setting'; +$lang->featureconfig->common = 'Features config'; +$lang->doctemplate->common = 'Doc template'; +$lang->notifysetting->common = 'Notification'; +$lang->bidesign->common = 'BI design'; +$lang->personalsettings->common = 'Personal setting '; +$lang->projectsettings->common = 'Setting'; +$lang->dataaccess->common = 'Data permission'; +$lang->executiongantt->common = 'Gantt chart'; +$lang->executionkanban->common = 'Kanban'; +$lang->executionburn->common = 'Burndown chart'; +$lang->executioncfd->common = 'Cumulative Flow Diagram'; +$lang->executionstory->common = 'Story'; +$lang->executionqa->common = 'QA'; +$lang->executionsettings->common = 'Setting'; +$lang->generalcomment->common = 'Comment'; +$lang->generalping->common = 'Timeout prevention'; +$lang->generaltemplate->common = 'Template'; +$lang->generaleffort->common = 'General log'; +$lang->productsettings->common = 'Product setting'; +$lang->projectreview->common = 'Review'; +$lang->projecttrack->common = 'Matrix'; +$lang->projectqa->common = 'QA'; +$lang->holidayseason->common = 'Holiday'; +$lang->codereview->common = 'Review'; +$lang->repocode->common = 'Code'; +$lang->deliverable->common = 'Deliverable'; +$lang->projectDeliverable->common = 'Project Deliverable'; +$lang->executionDeliverable->common = 'Execution Deliverable'; $lang->personnel->common = 'Member'; $lang->personnel->invest = 'Investment'; diff --git a/module/common/lang/fr.php b/module/common/lang/fr.php index 1a85fd6b83..fe0936db33 100644 --- a/module/common/lang/fr.php +++ b/module/common/lang/fr.php @@ -289,37 +289,40 @@ $lang->aiapp->common = 'AI'; $lang->product->system = 'Application'; $lang->configure->common = 'Configure'; -$lang->programstakeholder->common = 'Stakeholder'; -$lang->featureswitch->common = 'Features On/Off'; -$lang->importdata->common = 'Import data'; -$lang->systemsetting->common = 'System setting'; -$lang->staffmanage->common = 'User management'; -$lang->modelconfig->common = 'Pattern setting'; -$lang->featureconfig->common = 'Features config'; -$lang->doctemplate->common = 'Doc template'; -$lang->notifysetting->common = 'Notification'; -$lang->bidesign->common = 'BI design'; -$lang->personalsettings->common = 'Personal setting '; -$lang->projectsettings->common = 'Setting'; -$lang->dataaccess->common = 'Data permission'; -$lang->executiongantt->common = 'Gantt chart'; -$lang->executionkanban->common = 'Kanban'; -$lang->executionburn->common = 'Burndown chart'; -$lang->executioncfd->common = 'Cumulative Flow Diagram'; -$lang->executionstory->common = 'Story'; -$lang->executionqa->common = 'QA'; -$lang->executionsettings->common = 'Setting'; -$lang->generalcomment->common = 'Comment'; -$lang->generalping->common = 'Timeout prevention'; -$lang->generaltemplate->common = 'Template'; -$lang->generaleffort->common = 'General log'; -$lang->productsettings->common = 'Product setting'; -$lang->projectreview->common = 'Review'; -$lang->projecttrack->common = 'Matrix'; -$lang->projectqa->common = 'QA'; -$lang->holidayseason->common = 'Holiday'; -$lang->codereview->common = 'Review'; -$lang->repocode->common = 'Code'; +$lang->programstakeholder->common = 'Stakeholder'; +$lang->featureswitch->common = 'Features On/Off'; +$lang->importdata->common = 'Import data'; +$lang->systemsetting->common = 'System setting'; +$lang->staffmanage->common = 'User management'; +$lang->modelconfig->common = 'Pattern setting'; +$lang->featureconfig->common = 'Features config'; +$lang->doctemplate->common = 'Doc template'; +$lang->notifysetting->common = 'Notification'; +$lang->bidesign->common = 'BI design'; +$lang->personalsettings->common = 'Personal setting '; +$lang->projectsettings->common = 'Setting'; +$lang->dataaccess->common = 'Data permission'; +$lang->executiongantt->common = 'Gantt chart'; +$lang->executionkanban->common = 'Kanban'; +$lang->executionburn->common = 'Burndown chart'; +$lang->executioncfd->common = 'Cumulative Flow Diagram'; +$lang->executionstory->common = 'Story'; +$lang->executionqa->common = 'QA'; +$lang->executionsettings->common = 'Setting'; +$lang->generalcomment->common = 'Comment'; +$lang->generalping->common = 'Timeout prevention'; +$lang->generaltemplate->common = 'Template'; +$lang->generaleffort->common = 'General log'; +$lang->productsettings->common = 'Product setting'; +$lang->projectreview->common = 'Review'; +$lang->projecttrack->common = 'Matrix'; +$lang->projectqa->common = 'QA'; +$lang->holidayseason->common = 'Holiday'; +$lang->codereview->common = 'Review'; +$lang->repocode->common = 'Code'; +$lang->deliverable->common = 'Deliverable'; +$lang->projectDeliverable->common = 'Project Deliverable'; +$lang->executionDeliverable->common = 'Execution Deliverable'; $lang->personnel->common = 'Member'; $lang->personnel->invest = 'Investment'; diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index 8d2217cec7..fd3161b489 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -240,7 +240,7 @@ if(helper::hasFeature('devops')) $lang->scrum->menu->devops = array('link' $lang->scrum->menu->build = array('link' => "{$lang->build->common}|projectbuild|browse|project=%s", 'subModule' => 'projectbuild'); $lang->scrum->menu->release = array('link' => "{$lang->release->common}|projectrelease|browse|project=%s", 'subModule' => 'projectrelease,system'); $lang->scrum->menu->dynamic = array('link' => "$lang->dynamic|project|dynamic|project=%s"); -$lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'tree,stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team', 'exclude' => 'tree-browsetask'); +$lang->scrum->menu->settings = array('link' => "$lang->settings|project|view|project=%s", 'subModule' => 'tree,stakeholder', 'alias' => 'edit,manageproducts,group,managemembers,manageview,managepriv,whitelist,addwhitelist,team,workflowgroup', 'exclude' => 'tree-browsetask'); $lang->scrum->dividerMenu = ',execution,programplan,doc,settings,'; @@ -783,6 +783,7 @@ $lang->navGroup->extension = 'admin'; $lang->navGroup->action = 'admin'; $lang->navGroup->convert = 'admin'; $lang->navGroup->stage = 'admin'; +$lang->navGroup->deliverable = 'admin'; $lang->navGroup->featureswitch = 'admin'; $lang->navGroup->importdata = 'admin'; $lang->navGroup->systemsetting = 'admin'; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 22bd919f27..c6b088a140 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -289,37 +289,40 @@ $lang->aiapp->common = 'AI'; $lang->product->system = '应用'; $lang->configure->common = '配置'; -$lang->programstakeholder->common = '干系人'; -$lang->featureswitch->common = '功能开关'; -$lang->importdata->common = '数据导入'; -$lang->systemsetting->common = '系统设置'; -$lang->staffmanage->common = '人员管理'; -$lang->modelconfig->common = '模型配置'; -$lang->featureconfig->common = '功能配置'; -$lang->doctemplate->common = '文档模板'; -$lang->notifysetting->common = '通知设置'; -$lang->bidesign->common = 'BI设计'; -$lang->personalsettings->common = '个人设置'; -$lang->projectsettings->common = '设置'; -$lang->dataaccess->common = '数据权限'; -$lang->executiongantt->common = '甘特图'; -$lang->executionkanban->common = '看板'; -$lang->executionburn->common = '燃尽图'; -$lang->executioncfd->common = '累积流图'; -$lang->executionstory->common = '研发需求'; -$lang->executionqa->common = '测试'; -$lang->executionsettings->common = '设置'; -$lang->generalcomment->common = '备注'; -$lang->generalping->common = '防超时'; -$lang->generaltemplate->common = '模板'; -$lang->generaleffort->common = '通用日志'; -$lang->productsettings->common = '产品设置'; -$lang->projectreview->common = '评审'; -$lang->projecttrack->common = '矩阵'; -$lang->projectqa->common = '测试'; -$lang->holidayseason->common = '节假日'; -$lang->codereview->common = '问题'; -$lang->repocode->common = '代码'; +$lang->programstakeholder->common = '干系人'; +$lang->featureswitch->common = '功能开关'; +$lang->importdata->common = '数据导入'; +$lang->systemsetting->common = '系统设置'; +$lang->staffmanage->common = '人员管理'; +$lang->modelconfig->common = '项目模型配置'; +$lang->featureconfig->common = '功能配置'; +$lang->doctemplate->common = '文档模板'; +$lang->notifysetting->common = '通知设置'; +$lang->bidesign->common = 'BI设计'; +$lang->personalsettings->common = '个人设置'; +$lang->projectsettings->common = '设置'; +$lang->dataaccess->common = '数据权限'; +$lang->executiongantt->common = '甘特图'; +$lang->executionkanban->common = '看板'; +$lang->executionburn->common = '燃尽图'; +$lang->executioncfd->common = '累积流图'; +$lang->executionstory->common = '研发需求'; +$lang->executionqa->common = '测试'; +$lang->executionsettings->common = '设置'; +$lang->generalcomment->common = '备注'; +$lang->generalping->common = '防超时'; +$lang->generaltemplate->common = '模板'; +$lang->generaleffort->common = '通用日志'; +$lang->productsettings->common = '产品设置'; +$lang->projectreview->common = '评审'; +$lang->projecttrack->common = '矩阵'; +$lang->projectqa->common = '测试'; +$lang->holidayseason->common = '节假日'; +$lang->codereview->common = '问题'; +$lang->repocode->common = '代码'; +$lang->deliverable->common = '交付物'; +$lang->projectDeliverable->common = '项目交付物'; +$lang->executionDeliverable->common = '执行交付物'; $lang->personnel->common = '人员'; $lang->personnel->invest = '投入人员'; diff --git a/module/common/model.php b/module/common/model.php index 34f83cf79f..a4faa6f1eb 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -516,7 +516,7 @@ class commonModel extends model { $info['timeUsed'] = round(getTime() - $startTime, 4) * 1000; $info['memory'] = round(memory_get_peak_usage() / 1024, 1); - $info['querys'] = count(dao::$querys); + $info['querys'] = count(dbh::$queries); vprintf($this->lang->runInfo, $info); return $info; } diff --git a/module/common/view/action.html.php b/module/common/view/action.html.php index d1dadede7f..46c53b7416 100755 --- a/module/common/view/action.html.php +++ b/module/common/view/action.html.php @@ -61,7 +61,7 @@ history)):?>
- action->printChanges($action->objectType, $action->history);?> + action->printChanges($action->objectType, $action->objectID, $action->history);?>
comment))) != 0):?> diff --git a/module/common/view/mail.footer.html.php b/module/common/view/mail.footer.html.php index 3d8d365619..3f632ce7b5 100644 --- a/module/common/view/mail.footer.html.php +++ b/module/common/view/mail.footer.html.php @@ -28,7 +28,7 @@ if(file_exists($extViewFile)) history)):?> -
action->printChanges($action->objectType, $action->history, false);?>
+
action->printChanges($action->objectType, $action->objectID, $action->history, false);?>
diff --git a/module/custom/control.php b/module/custom/control.php index 1d4cc17991..b9ee63b120 100644 --- a/module/custom/control.php +++ b/module/custom/control.php @@ -595,7 +595,7 @@ class custom extends control $menus = json_decode($items); $menuNames = array(); - foreach($menus as $key => $item) $menuNames[] = $item->name; + foreach($menus as $item) $menuNames[] = $item->name; foreach($oldMenus as $key => $item) { diff --git a/module/custom/lang/de.php b/module/custom/lang/de.php index fceb862f67..25d5846cf8 100644 --- a/module/custom/lang/de.php +++ b/module/custom/lang/de.php @@ -55,6 +55,7 @@ $lang->custom->role = 'Role'; $lang->custom->dept = 'Dept'; $lang->custom->code = $lang->code; $lang->custom->setCode = 'Enable or Disable Code'; +$lang->custom->projectCommon = $lang->projectCommon . ' Setting'; $lang->custom->executionCommon = 'Execution'; $lang->custom->selectDefaultProgram = 'Please select default program'; $lang->custom->defaultProgram = 'Default program'; diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php index 04a80eb86a..abaaaf6ed1 100644 --- a/module/custom/lang/en.php +++ b/module/custom/lang/en.php @@ -55,6 +55,7 @@ $lang->custom->role = 'Role'; $lang->custom->dept = 'Dept'; $lang->custom->code = $lang->code; $lang->custom->setCode = 'Enable or Disable Code'; +$lang->custom->projectCommon = $lang->projectCommon . ' Setting'; $lang->custom->executionCommon = 'Execution'; $lang->custom->selectDefaultProgram = 'Please select default program'; $lang->custom->defaultProgram = 'Default program'; diff --git a/module/custom/lang/fr.php b/module/custom/lang/fr.php index 537d988bb6..76b2ad005b 100644 --- a/module/custom/lang/fr.php +++ b/module/custom/lang/fr.php @@ -55,6 +55,7 @@ $lang->custom->role = 'Role'; $lang->custom->dept = 'Dept'; $lang->custom->code = $lang->code; $lang->custom->setCode = 'Activer ou Désactiver le Code'; +$lang->custom->projectCommon = $lang->projectCommon . ' Setting'; $lang->custom->executionCommon = 'Execution'; $lang->custom->selectDefaultProgram = 'Please select default program'; $lang->custom->defaultProgram = 'Default program'; diff --git a/module/custom/lang/zh-cn.php b/module/custom/lang/zh-cn.php index 23d4a0e6cf..51c63b7a3d 100644 --- a/module/custom/lang/zh-cn.php +++ b/module/custom/lang/zh-cn.php @@ -55,6 +55,7 @@ $lang->custom->role = '职位'; $lang->custom->dept = '部门'; $lang->custom->code = $lang->code; $lang->custom->setCode = '是否启用代号'; +$lang->custom->projectCommon = $lang->projectCommon . '设置'; $lang->custom->executionCommon = '执行'; $lang->custom->selectDefaultProgram = '请选择一个默认项目集'; $lang->custom->defaultProgram = '默认项目集'; diff --git a/module/datatable/model.php b/module/datatable/model.php index 47aad7a5e9..5d0632f9cb 100644 --- a/module/datatable/model.php +++ b/module/datatable/model.php @@ -446,25 +446,23 @@ class datatableModel extends model */ public function appendWorkflowFields(string $module, string $method): array { - if(in_array($module, array('epic', 'story', 'requirement'))) + if($module == 'build' && $method == 'build') { - $method = $module == 'story' ? 'browse' : $module; // 需求加载product-browse的layout配置。 - $module = 'product'; + $module = 'build'; + $method = 'browse'; // 版本加载build-browse的layout配置。 } - elseif($module == 'build') + elseif($module == 'task' && $method == 'task') { - $module = 'execution'; - $method = 'build'; // 版本加载execution-build的layout配置。 - } - elseif($module == 'task') - { - $module = 'execution'; - $method = 'task'; // 任务加载execution-task的layout配置。 + $method = 'browse'; // 任务加载task-browse的layout配置。 } elseif($module == 'bug' && $method == 'bug') { $method = 'browse'; // 执行bug列表加载bug-browse的layout配置。 } + elseif($module == 'story' && $method == 'story') + { + $method = 'browse'; // 执行需求列表加载story-browse的layout配置。 + } elseif($module == 'testcase' && $method == 'testcase') { $method = 'browse'; // 执行用例列表加载testcase-browse的layout配置。 @@ -520,4 +518,4 @@ class datatableModel extends model return $this->loadModel('flow')->buildDtableCols($fields, [], [], isset($flow->buildin) && !$flow->buildin); } -} +} \ No newline at end of file diff --git a/module/doc/control.php b/module/doc/control.php index c11e94f027..90fd2fec3a 100755 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -164,6 +164,8 @@ class doc extends control return $this->sendError($this->lang->notFound); } + $this->app->loadClass('pager', true); + $this->view->title = sprintf($this->lang->doc->insertTitle, $this->lang->doc->zentaoList[$type]); $this->view->type = $type; $this->view->settings = $blockData->settings; @@ -172,6 +174,7 @@ class doc extends control $this->view->data = $blockData->content->data; $this->view->users = $this->loadModel('user')->getPairs('noletter|pofirst|nodeleted'); $this->view->blockID = $blockID; + $this->view->pager = new pager(count($this->view->data), 10); if(strpos(',productStory,ER,UR,planStory,projectStory', $type) !== false) $this->docZen->assignStoryGradeData($type); diff --git a/module/doc/lang/de.php b/module/doc/lang/de.php index efa160a474..e8b1f5eed7 100644 --- a/module/doc/lang/de.php +++ b/module/doc/lang/de.php @@ -253,6 +253,8 @@ $lang->doc->uploadFormat = 'Upload Format'; $lang->doc->editedList = 'File editor'; $lang->doc->moveTo = 'Move to'; $lang->doc->notSupportExport = 'This document does not support export'; +$lang->doc->downloadTemplate = 'Download Template'; +$lang->doc->addFile = 'Add File'; $lang->doc->preview = 'Preview'; $lang->doc->insertTitle = 'Insert %s list'; @@ -439,6 +441,7 @@ $lang->doc->noCollectedDoc = 'Sie haben kein Dokument gesammelt.'; $lang->doc->errorEmptyLib = 'No data in document library.'; $lang->doc->confirmUpdateContent = 'You have a document that is not saved from last time. Do you want to continue editing it?'; $lang->doc->selectLibType = 'Please select a type of doc library.'; +$lang->doc->selectDoc = 'Please select a doc'; $lang->doc->noLibreOffice = 'You does not have access to office conversion settings!'; $lang->doc->errorParentChapter = 'The parent chapter cannot be its own chapter or sub chapter!'; $lang->doc->errorOthersCreated = 'There are documents created by others in this library. You cannot move it.'; diff --git a/module/doc/lang/en.php b/module/doc/lang/en.php index d8ee47e89f..a51c5e3105 100644 --- a/module/doc/lang/en.php +++ b/module/doc/lang/en.php @@ -253,6 +253,8 @@ $lang->doc->uploadFormat = 'Upload Format'; $lang->doc->editedList = 'File editor'; $lang->doc->moveTo = 'Move to'; $lang->doc->notSupportExport = 'This document does not support export'; +$lang->doc->downloadTemplate = 'Download Template'; +$lang->doc->addFile = 'Add File'; $lang->doc->preview = 'Preview'; $lang->doc->insertTitle = 'Insert %s list'; @@ -439,6 +441,7 @@ $lang->doc->noCollectedDoc = 'You have not favorited any documents. $lang->doc->errorEmptyLib = 'No data in document library.'; $lang->doc->confirmUpdateContent = 'You have a document that is not saved from last time. Do you want to continue editing it?'; $lang->doc->selectLibType = 'Please select a type of doc library.'; +$lang->doc->selectDoc = 'Please select a doc'; $lang->doc->noLibreOffice = 'You does not have access to office conversion settings!'; $lang->doc->errorParentChapter = 'The parent chapter cannot be its own chapter or sub chapter!'; $lang->doc->errorOthersCreated = 'There are documents created by others in this library. You cannot move it.'; diff --git a/module/doc/lang/fr.php b/module/doc/lang/fr.php index dd6f2b11ff..9668928712 100644 --- a/module/doc/lang/fr.php +++ b/module/doc/lang/fr.php @@ -253,6 +253,8 @@ $lang->doc->uploadFormat = 'Upload Format'; $lang->doc->editedList = 'File editor'; $lang->doc->moveTo = 'Move to'; $lang->doc->notSupportExport = 'This document does not support export'; +$lang->doc->downloadTemplate = 'Download Template'; +$lang->doc->addFile = 'Add File'; $lang->doc->preview = 'Preview'; $lang->doc->insertTitle = 'Insert %s list'; @@ -439,6 +441,7 @@ $lang->doc->noCollectedDoc = "Vous avez aucun document dans vos fav $lang->doc->errorEmptyLib = 'No data in document library.'; $lang->doc->confirmUpdateContent = 'You have a document that is not saved from last time. Do you want to continue editing it?'; $lang->doc->selectLibType = 'Please select a type of doc library.'; +$lang->doc->selectDoc = 'Please select a doc'; $lang->doc->noLibreOffice = 'You does not have access to office conversion settings!'; $lang->doc->errorParentChapter = 'The parent chapter cannot be its own chapter or sub chapter!'; $lang->doc->errorOthersCreated = 'There are documents created by others in this library. You cannot move it.'; diff --git a/module/doc/lang/zh-cn.php b/module/doc/lang/zh-cn.php index 1adcfed06d..99ab4dbb73 100644 --- a/module/doc/lang/zh-cn.php +++ b/module/doc/lang/zh-cn.php @@ -253,6 +253,8 @@ $lang->doc->uploadFormat = '上传格式'; $lang->doc->editedList = '文档编辑者'; $lang->doc->moveTo = '移动至'; $lang->doc->notSupportExport = '(此文档暂不支持导出)'; +$lang->doc->downloadTemplate = '下载模板'; +$lang->doc->addFile = '提交文件'; $lang->doc->preview = '预览'; $lang->doc->insertTitle = '插入%s列表'; @@ -439,6 +441,7 @@ $lang->doc->noCollectedDoc = '您还没有收藏任何文档。'; $lang->doc->errorEmptyLib = '文档库暂无数据。'; $lang->doc->confirmUpdateContent = '检查到您有未保存的文档内容,是否继续编辑?'; $lang->doc->selectLibType = '请选择文档库类型'; +$lang->doc->selectDoc = '请选择文档'; $lang->doc->noLibreOffice = '您还没有office转换设置访问权限!'; $lang->doc->errorParentChapter = '父章节不能是自身章节及子章节!'; $lang->doc->errorOthersCreated = '该库下其他人创建的文档暂不支持移动,是否确认移动?'; diff --git a/module/doc/model.php b/module/doc/model.php index 37f0671d0a..28f7146cf2 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -1571,12 +1571,12 @@ class docModel extends model } $files = $this->loadModel('file')->getUpload(); - if($doc->type == 'attachment' && (empty($files) || isset($files['name']))) return dao::$errors['files'] = sprintf($this->lang->error->notempty, $this->lang->doc->uploadFile); + if($doc->type == 'attachment' && empty($doc->copy) && (empty($files) || isset($files['name']))) return dao::$errors['files'] = sprintf($this->lang->error->notempty, $this->lang->doc->uploadFile); $doc->draft = $isDraft ? $docContent->content : ''; $doc->vision = $this->config->vision; $doc->version = $isDraft ? 0 : 1; - $this->dao->insert(TABLE_DOC)->data($doc, 'content')->autoCheck()->batchCheck($requiredFields, 'notempty')->exec(); + $this->dao->insert(TABLE_DOC)->data($doc, 'content,copy')->autoCheck()->batchCheck($requiredFields, 'notempty')->exec(); if(dao::isError()) return false; $docID = $this->dao->lastInsertID(); diff --git a/module/doc/ui/zentaolist.html.php b/module/doc/ui/zentaolist.html.php index c05545a5f1..61507468d5 100644 --- a/module/doc/ui/zentaolist.html.php +++ b/module/doc/ui/zentaolist.html.php @@ -21,6 +21,9 @@ $actions = array(); $actions[] = array('icon' => 'menu-backend', 'text' => $lang->doc->zentaoAction['set'], 'data-toggle' => 'modal', 'url' => str_replace('{blockID}', "$blockID", $settings), 'data-size' => 'lg'); $actions[] = array('icon' => 'trash', 'text' => $lang->doc->zentaoAction['delete'], 'zui-on-click' => "deleteZentaoList($blockID)"); +$pagerSetting = usePager(); +unset($pagerSetting['linkCreator']); + div ( set('data-id', $blockID), @@ -58,6 +61,9 @@ div set::colResize(true), set::customCols(false), set::onRenderCell(jsRaw('window.renderCell')), + set::localPager(), + set::footPager($pagerSetting), + set::footer(array('flex', 'pager')), $type == 'productRelease' ? set::plugins(array('cellspan')) : null, $type == 'productRelease' ? set::getCellSpan(jsRaw('window.getCellSpan')) : null ) diff --git a/module/doc/zen.php b/module/doc/zen.php index 116e33def3..6e272308fb 100644 --- a/module/doc/zen.php +++ b/module/doc/zen.php @@ -614,7 +614,16 @@ class docZen extends doc { $execution = $this->loadModel('execution')->getByID($objectID); $objects = $this->execution->getPairs($execution->project, 'all', "multiple,leaf,noprefix"); - $objects = $this->execution->resetExecutionSorts($objects, array(), $execution->project); + + $parentExecutions = $childExecutions = array(); + $executions = $this->execution->fetchExecutionList($execution->project, 'all', 0, 0, 'order_asc'); + foreach($executions as $execution) + { + if($execution->grade == 1) $parentExecutions[$execution->id] = $execution; + if($execution->grade > 1 && $execution->parent) $childExecutions[$execution->parent][$execution->id] = $execution; + } + + $objects = $this->execution->resetExecutionSorts($objects, $parentExecutions, $childExecutions); } elseif($objectType == 'product') { diff --git a/module/execution/config/dtable.php b/module/execution/config/dtable.php index 0fe823bf71..790d50be86 100644 --- a/module/execution/config/dtable.php +++ b/module/execution/config/dtable.php @@ -49,6 +49,17 @@ $config->execution->dtable->fieldList['status']['width'] = '80'; $config->execution->dtable->fieldList['status']['group'] = '1'; $config->execution->dtable->fieldList['status']['show'] = true; +if(in_array($config->edition, array('max', 'ipd')) && helper::hasFeature('deliverable')) +{ + $config->execution->dtable->fieldList['deliverable']['title'] = $lang->execution->deliverableAbbr; + $config->execution->dtable->fieldList['deliverable']['name'] = 'deliverable'; + $config->execution->dtable->fieldList['deliverable']['type'] = 'html'; + $config->execution->dtable->fieldList['deliverable']['width'] = '100px'; + $config->execution->dtable->fieldList['deliverable']['group'] = '1'; + $config->execution->dtable->fieldList['deliverable']['show'] = true; + $config->execution->dtable->fieldList['deliverable']['sortType'] = false; +} + $config->execution->dtable->fieldList['PM']['title'] = $lang->execution->execPM; $config->execution->dtable->fieldList['PM']['name'] = 'PM'; $config->execution->dtable->fieldList['PM']['type'] = 'avatarBtn'; diff --git a/module/execution/control.php b/module/execution/control.php index 2f13d2ae81..566acc0a44 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -1362,7 +1362,7 @@ class execution extends control } $executionIDList = $this->post->executionIDList; - $executions = $this->dao->select('*')->from(TABLE_EXECUTION)->where('id')->in($executionIDList)->fetchAll('id'); + $executions = $this->dao->select('*')->from(TABLE_EXECUTION)->where('id')->in($executionIDList)->fetchAll('id', false); $relatedProjects = $this->dao->select('id,project')->from(TABLE_PROJECT)->where('id')->in($executionIDList)->fetchPairs(); /* 获取执行所属的项目列表。*/ $projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->in($relatedProjects)->fetchAll('id'); /* 获取执行所属的项目列表中每个项目的项目信息。*/ @@ -1415,8 +1415,8 @@ class execution extends control $executionIdList = $this->post->executionIDList; if(is_string($executionIdList)) $executionIdList = explode(',', $executionIdList); - $filteredStages = $this->execution->batchChangeStatus($executionIdList, $status); - if(!$filteredStages) return $this->sendSuccess(array('load' => true)); + $message = $this->execution->batchChangeStatus($executionIdList, $status); + if(empty($message['byChild']) && empty($message['byDeliverable'])) return $this->sendSuccess(array('load' => true)); $alertMsg = ''; if($status == 'wait') @@ -1426,18 +1426,28 @@ class execution extends control if(empty($project) or (!empty($project) and strpos($project->model, 'waterfall') !== false)) { $executionLang = (empty($project) or (!empty($project) and $project->model == 'waterfallplus')) ? $this->lang->execution->common : $this->lang->stage->common; - $alertMsg = sprintf($this->lang->execution->hasStartedTaskOrSubStage, $executionLang, $filteredStages); + $alertMsg = sprintf($this->lang->execution->hasStartedTaskOrSubStage, $executionLang, $message['byChild']); } if(!empty($project) and strpos('agileplus,scrum', $project->model) !== false) { $executionLang = $project->model == 'scrum' ? $this->lang->executionCommon : $this->lang->execution->common; - $alertMsg = sprintf($this->lang->execution->hasStartedTask, $executionLang, $filteredStages); + $alertMsg = sprintf($this->lang->execution->hasStartedTask, $executionLang, $message['byChild']); + } + } + if($status == 'suspended') $alertMsg = sprintf($this->lang->execution->hasSuspendedOrClosedChildren, $message['byChild']); + if($status == 'closed') + { + if(!empty($message['byChild'])) + { + $alertMsg .= sprintf($this->lang->execution->hasNotClosedChildren, $message['byChild']); + } + elseif(!empty($message['byDeliverable'])) + { + $alertMsg .= sprintf($this->lang->execution->cannotCloseByDeliverable, $message['byDeliverable']); } } - if($status == 'suspended') $alertMsg = sprintf($this->lang->execution->hasSuspendedOrClosedChildren, $filteredStages); - if($status == 'closed') $alertMsg = sprintf($this->lang->execution->hasNotClosedChildren, $filteredStages); - return $this->sendSuccess(array('message' => $alertMsg, 'load' => true)); + return $this->send(array('load' => array('alert' => $alertMsg), 'result' => 'success')); } /** @@ -1666,7 +1676,11 @@ class execution extends control if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); $project = $this->loadModel('project')->getById($execution->project); - if(in_array($project->model, array('waterfall', 'waterfallplus', 'ipd'))) $this->loadModel('programplan')->computeProgress($executionID, 'close'); + if(in_array($project->model, array('waterfall', 'waterfallplus', 'ipd'))) + { + $result = $this->loadModel('programplan')->computeProgress($executionID, 'close'); + if(is_array($result)) return $this->send($result); + } $this->executeHooks($executionID); @@ -2739,11 +2753,11 @@ class execution extends control foreach($executions as $execution) { if($execution->grade == 1) $topExecutions[$execution->id] = $execution->id; - if($execution->grade > 1 && $execution->parent) $parentExecutions[$execution->parent] = $execution->parent; + if($execution->grade > 1 && $execution->parent) $parentExecutions[$execution->parent][$execution->id] = $execution; } /* 获取排序后的执行列表,并给每个执行设置团队信息。*/ - $executions = $this->execution->resetExecutionSorts($executions, $topExecutions); + $executions = $this->execution->resetExecutionSorts($executions, $topExecutions, $parentExecutions); foreach($executions as $execution) { $execution->teams = zget($teams, $execution->id, array()); @@ -2893,6 +2907,7 @@ class execution extends control $this->app->loadLang('stage'); $this->app->loadLang('programplan'); $this->loadModel('product'); + $this->loadModel('project'); $this->loadModel('datatable'); $from = $this->app->tab; @@ -3480,7 +3495,7 @@ class execution extends control $this->loadModel('task'); $result = array(); - foreach($array as $key => $object) + foreach($array as $object) { $result[$object->id] = $object; $tasks = zget($object, 'tasks', array()); diff --git a/module/execution/js/batchedit.ui.js b/module/execution/js/batchedit.ui.js index 9360903740..18c91de382 100644 --- a/module/execution/js/batchedit.ui.js +++ b/module/execution/js/batchedit.ui.js @@ -25,7 +25,16 @@ window.renderRowData = function($row, index, row) options.disabled = row.grade > 1 && parentType != 'mix'; if(projectModel == 'ipd') options.disabled = true; } + $row.attr('data-parent', row.parent); + + $row.find('[data-name="lifetime"]').find('.picker-box').on('inited', function(e, info) + { + let $attribute = info[0]; + $attribute.render({items: stageItems, required: true, name: 'attribute[' + row.id + ']', disabled: row.grade > 1 && parentType != 'mix'}); + if(typeof row != 'undefined' && typeof row.hasDeliverable != 'undefined') $attribute.render({disabled: true}); + $(e.target).attr('data-parent', row.parent); + }); } $row.find('[data-name="lifetime"]').find('.picker-box').on('inited', function(e, info) { info[0].render(options); }); diff --git a/module/execution/js/taskkanban.ui.js b/module/execution/js/taskkanban.ui.js index 8a61d83b6c..15bd92bf57 100644 --- a/module/execution/js/taskkanban.ui.js +++ b/module/execution/js/taskkanban.ui.js @@ -222,6 +222,8 @@ window.getItem = function(info) let assignedTo = ''; let avatar = ""; + info.item.originalTitle = info.item.title; + if(begin < '1970-01-01' && end > '1970-01-01') { beginAndEnd = end + ' ' + cardLang.deadlineAB; @@ -315,7 +317,7 @@ window.getItem = function(info) info.item.titleUrl = $.createLink(info.laneInfo.type, 'view', `id=${info.item.id}&from=execution`); } - info.item.titleAttrs = {'data-toggle': 'modal', 'data-size': 'lg', 'title': info.item.title, 'class': 'card-title clip'}; + info.item.titleAttrs = {'data-toggle': 'modal', 'data-size': 'lg', 'title': info.item.originalTitle, 'class': 'card-title clip'}; info.item.content = {html: content}; if(info.item.color && info.item.color != '#fff') info.item.className = 'color-' + info.item.color.replace('#', ''); diff --git a/module/execution/model.php b/module/execution/model.php index b4c383f131..cb7270bf5c 100755 --- a/module/execution/model.php +++ b/module/execution/model.php @@ -539,17 +539,24 @@ class executionModel extends model * @param array $executionIdList * @param string $status * @access public - * @return string 返回不符合条件被过滤了的执行,来提示执行下任务或子阶段已经开始,无法修改,已过滤。参见 story#41875。 + * @return array 返回不符合条件被过滤了的执行,来提示执行下任务或子阶段已经开始,无法修改,已过滤。参见 story#41875。 */ - public function batchChangeStatus(array $executionIdList, string $status): string + public function batchChangeStatus(array $executionIdList, string $status): array { /* Sort the IDs, the child stage comes first, and the parent stage follows. */ - $executionIdList = $this->dao->select('id')->from(TABLE_EXECUTION)->where('id')->in($executionIdList)->orderBy('grade_desc')->fetchPairs(); + $executionList = $this->dao->select('id,name,status,grade,deliverable')->from(TABLE_EXECUTION)->where('id')->in($executionIdList)->orderBy('grade_desc')->fetchAll('id'); $this->loadModel('programplan'); - $filteredStages = ''; - foreach($executionIdList as $executionID) + $message = array('byChild' => '', 'byDeliverable' => ''); + foreach($executionList as $executionID => $execution) { + $needCheckDeliverable = $status == 'closed' && $execution->status == 'doing' && $execution->grade == 1; + if(in_array($this->config->edition, array('max', 'ipd')) && $needCheckDeliverable && !$this->canCloseByDeliverable($execution)) + { + $message['byDeliverable'] .= '#' . $execution->id . ' ' . $execution->name . "\n"; + continue; + } + /* The state of the parent stage or the sibling stage may be affected by the child stage before the change, so it cannot be checked in advance. */ $selfAndChildrenList = $this->programplan->getSelfAndChildrenList($executionID); $selfAndChildren = $selfAndChildrenList[$executionID]; @@ -557,7 +564,7 @@ class executionModel extends model if($status == 'wait' and $execution->status != 'wait') { - $filteredStages .= $this->changeStatus2Wait($executionID, $selfAndChildren); + $message['byChild'] .= $this->changeStatus2Wait($executionID, $selfAndChildren); } if($status == 'doing' and $execution->status != 'doing') @@ -567,11 +574,12 @@ class executionModel extends model if(($status == 'suspended' and $execution->status != 'suspended') or ($status == 'closed' and $execution->status != 'closed')) { - $filteredStages .= $this->changeStatus2Inactive($executionID, $status, $selfAndChildren); + $message['byChild'] .= $this->changeStatus2Inactive($executionID, $status, $selfAndChildren); } } - return trim($filteredStages, ','); + $message['byChild'] = trim($message['byChild'], ','); + return $message; } /** @@ -906,9 +914,9 @@ class executionModel extends model * @param int $executionID * @param object $postData * @access public - * @return array|false + * @return int|false */ - public function close(int $executionID, object $postData): array|false + public function close(int $executionID, object $postData): int|false { $oldExecution = $this->fetchById($executionID); /* Save previous execution to variable for later compare. */ @@ -937,7 +945,7 @@ class executionModel extends model } $this->loadModel('score')->create('execution', 'close', $oldExecution); - return $changes; + return $actionID; } /** @@ -1452,7 +1460,7 @@ class executionModel extends model ->fi() ->orderBy($orderBy) ->page($pager, 't1.id') - ->fetchAll('id'); + ->fetchAll('id', false); } /** @@ -1481,6 +1489,7 @@ class executionModel extends model $today = helper::today(); $burns = $this->getBurnData($executions); $parentExecutions = $this->dao->select('parent,parent')->from(TABLE_EXECUTION)->where('parent')->ne(0)->andWhere('deleted')->eq(0)->fetchPairs(); + $statusGroup = $this->dao->select('parent,status')->from(TABLE_EXECUTION)->where('parent')->in(array_keys($executions))->andWhere('deleted')->eq(0)->fetchGroup('parent', 'status'); /* Get workingDays. */ $earliestEnd = $today; @@ -1492,10 +1501,13 @@ class executionModel extends model foreach($executions as $execution) { - $execution->productName = isset($productList[$execution->id]) ? trim($productList[$execution->id]->productName, ',') : ''; - $execution->product = $productID; - $execution->productID = $productID; - $execution->delay = 0; + $execution->productName = isset($productList[$execution->id]) ? trim($productList[$execution->id]->productName, ',') : ''; + $execution->product = $productID; + $execution->productID = $productID; + $execution->delay = 0; + $execution->totalEstimate = $execution->estimate; + $execution->totalConsumed = $execution->consumed; + $execution->totalLeft = $execution->left; if($execution->end) $execution->end = date(DT_DATE1, strtotime($execution->end)); if(!isset($execution->projectName)) $execution->projectName = $project->name; if(!isset($execution->projectModel)) $execution->projectModel = $project->model; @@ -1503,6 +1515,13 @@ class executionModel extends model if(isset($parentExecutions[$execution->id])) $executions[$execution->id]->isParent = 1; if(empty($productID) && !empty($productList[$execution->id])) $execution->product = trim($productList[$execution->id]->product, ','); + /** 如果子执行都关闭了,则父执行可以手动关闭。 */ + if(isset($statusGroup[$execution->id])) + { + $childStatus = array_keys($statusGroup[$execution->id]); + if(count($childStatus) == 1 && $childStatus[0] == 'closed') $execution->parentCanClose = true; + } + /* Judge whether the execution is delayed. */ if($execution->status != 'done' && $execution->status != 'closed' && $execution->status != 'suspended' && !empty($workingDays)) { @@ -1806,11 +1825,14 @@ class executionModel extends model public function getChildExecutions(int $executionID, string $orderBy = 'id_desc', string $type = 'child'): array { $executionID = (int)$executionID; - $path = ''; - if($type != 'child') $path = $this->dao->select('path')->from(TABLE_EXECUTION)->where('id')->eq($executionID)->fetch('path'); - if(empty($executionID)) return array(); - if($type != 'child' && empty($path)) return array(); + + $path = ''; + if($type != 'child') + { + $path = $this->dao->select('path')->from(TABLE_EXECUTION)->where('id')->eq($executionID)->fetch('path'); + if(empty($path)) return array(); + } return $this->dao->select('*')->from(TABLE_EXECUTION) ->where('deleted')->eq(0) @@ -3827,7 +3849,7 @@ class executionModel extends model $action = strtolower($action); if($action == 'start') return $execution->status == 'wait'; - if($action == 'close') return $execution->status != 'closed' && (!isset($execution->isParent) || (isset($execution->isParent) && !$execution->isParent)); + if($action == 'close') return $execution->status != 'closed' && (empty($execution->isParent) || !empty($execution->parentCanClose)); if($action == 'suspend') return $execution->status == 'wait' || $execution->status == 'doing'; if($action == 'putoff') return $execution->status == 'wait' || $execution->status == 'doing'; if($action == 'activate') return $execution->status == 'suspended' || $execution->status == 'closed'; @@ -4797,6 +4819,7 @@ class executionModel extends model $execution->id = 'pid' . (string)$execution->id; $execution->projectID = $execution->project; $execution->project = $execution->projectName; + $execution->rawParent = $execution->parent; $execution->parent = (isset($executionList[$execution->parent]) && $execution->parent && $execution->grade > 1) ? 'pid' . (string)$execution->parent : ''; $execution->hasChild = !empty($execution->isParent); $execution->isParent = !empty($execution->isParent) or !empty($execution->tasks); @@ -4841,6 +4864,8 @@ class executionModel extends model $execution->PMAvatar = zget($avatarList, $execution->PMAccount, ''); } + if(in_array($this->config->edition, array('max', 'ipd'))) $execution->deliverable = $this->project->countDeliverable($execution, 'execution'); + $rows[$execution->id] = $execution; /* Append tasks and child stages. */ @@ -5143,33 +5168,28 @@ class executionModel extends model * * @param array $executions * @param array $parentExecutions - * @param int $projectID + * @param array $childExecutions * @access public * @return array */ - public function resetExecutionSorts(array $executions, array $parentExecutions = array(), int $projectID = 0): array + public function resetExecutionSorts(array $executions, array $parentExecutions = array(), array $childExecutions = array()): array { if(empty($executions)) return array(); - if(empty($parentExecutions)) + + if(empty($parentExecutions) && empty($childExecutions)) { - $execution = current($executions); - $projectID = isset($execution->project) ? $execution->project : $projectID; - $parentExecutions = $this->dao->select('*')->from(TABLE_EXECUTION) - ->where('deleted')->eq(0) - ->andWhere('type')->in('kanban,sprint,stage') - ->andWhere('grade')->eq(1) - ->andWhere('project')->eq($projectID) - ->orderBy('order_asc') - ->fetchAll('id'); + foreach($executions as $execution) + { + if($execution->grade == 1) $parentExecutions[$execution->id] = $execution; + if($execution->grade > 1 && $execution->parent) $childExecutions[$execution->parent][$execution->id] = $execution; + } } $sortedExecutions = array(); foreach($parentExecutions as $executionID => $execution) { if(!isset($sortedExecutions[$executionID]) and isset($executions[$executionID])) $sortedExecutions[$executionID] = $executions[$executionID]; - - $children = $this->getChildExecutions($executionID, 'order_asc'); - if(!empty($children)) $sortedExecutions += $this->resetExecutionSorts($executions, $children); + if(!empty($childExecutions[$executionID])) $sortedExecutions += $this->resetExecutionSorts($executions, $childExecutions[$executionID], $childExecutions); } return $sortedExecutions; } @@ -5292,4 +5312,33 @@ class executionModel extends model return array($toList, $ccList); } + + /** + * 检查迭代是否可以关闭。 + * Check if the execution can be closed. + * + * @param object $execution + * @access public + * @return bool + */ + public function canCloseByDeliverable(object $execution): bool + { + if(empty($execution->deliverable)) return true; + + $deliverables = json_decode($execution->deliverable, true); + + foreach($deliverables as $methods) + { + foreach($methods as $itemList) + { + foreach($itemList as $item) + { + if(!empty($item['required']) && empty($item['file']) && empty($item['doc'])) return false; + } + } + } + + return true; + } + } diff --git a/module/execution/tao.php b/module/execution/tao.php index 984290a0fd..071f91c29d 100644 --- a/module/execution/tao.php +++ b/module/execution/tao.php @@ -142,8 +142,8 @@ class executionTao extends executionModel $executions[$executionID]->lastEditedBy = $this->app->user->account; $executions[$executionID]->lastEditedDate = helper::now(); - if(isset($postData->code)) $executions[$executionID]->code = $executionCode; - if(isset($postData->project)) $executions[$executionID]->project = zget($postData->project, $executionID, 0); + if(isset($postData->code)) $executions[$executionID]->code = $executionCode; + if(isset($postData->project)) $executions[$executionID]->project = zget($postData->project, $executionID, 0); if(isset($postData->attribute[$executionID])) $executions[$executionID]->attribute = zget($postData->attribute, $executionID, ''); if(isset($postData->lifetime[$executionID])) $executions[$executionID]->lifetime = $postData->lifetime[$executionID]; diff --git a/module/execution/test/lib/execution.unittest.class.php b/module/execution/test/lib/execution.unittest.class.php index a3d9c7dd4c..99ecd4c58f 100644 --- a/module/execution/test/lib/execution.unittest.class.php +++ b/module/execution/test/lib/execution.unittest.class.php @@ -2633,30 +2633,18 @@ class executionTest * @access public * @return string */ - public function resetExecutionSortsTest(int $projectID, string $type = ''): string + public function resetExecutionSortsTest(int $projectID): string { $executions = array(); $executionIDList = ''; - $firstGradeExecutions = array(); - if($projectID) - { - $executions = $this->executionModel->dao->select('*')->from(TABLE_EXECUTION) - ->where('deleted')->eq(0) - ->andWhere('project')->eq($projectID) - ->andWhere('type')->in('sprint,stage,kanban') - ->orderBy('order_asc') - ->fetchAll('id'); + $executions = $this->executionModel->dao->select('*')->from(TABLE_EXECUTION) + ->where('deleted')->eq(0) + ->andWhere('project')->eq($projectID) + ->andWhere('type')->in('sprint,stage,kanban') + ->orderBy('order_asc') + ->fetchAll('id'); - if($type == 'hasParent') - { - foreach($executions as $execution) - { - if($execution->grade == 1) $firstGradeExecutions[$execution->id] = $execution->id; - } - } - } - - $executions = $this->executionModel->resetExecutionSorts($executions, $firstGradeExecutions); + $executions = $this->executionModel->resetExecutionSorts($executions); if(!empty($executions)) { $executionIDList = array_keys($executions); diff --git a/module/execution/test/model/canclosebydeliverable.php b/module/execution/test/model/canclosebydeliverable.php new file mode 100755 index 0000000000..3ceb37e3e8 --- /dev/null +++ b/module/execution/test/model/canclosebydeliverable.php @@ -0,0 +1,46 @@ +#!/usr/bin/env php +gen(5); +$execution->id->range('1-5'); +$execution->name->range('迭代1,迭代2,迭代3,迭代4,迭代5'); +$execution->type->range('stage'); +$execution->status->range('doing'); +$execution->parent->range('0,0,1,1,1'); +$execution->grade->range('1{2},2{3}'); +$execution->path->range('1,2,`1,3`,`1,4`,`1,5`')->prefix(',')->postfix(','); +$execution->begin->range('20230102 000000:0')->type('timestamp')->format('YY/MM/DD'); +$execution->end->range('20230212 000000:0')->type('timestamp')->format('YY/MM/DD'); +$execution->deliverable->range('`{"product_waterfall_request":{"whenClosed":[{"deliverable":"1","required":true,"category":"test","template":""}]}}`'); +$execution->gen(5); +su('admin'); + +/** + +title=executionModel->getByID(); +timeout=0 +cid=1 + +- 查看执行1是否可关闭 @1 +- 查看执行2是否可关闭 @1 +- 查看执行3是否可关闭 @1 +- 查看执行4是否可关闭 @1 +- 查看执行5是否可关闭 @1 + +*/ + +global $tester; +$tester->loadModel('execution'); +$execution1 = $tester->execution->getByID(1); +$execution2 = $tester->execution->getByID(2); +$execution3 = $tester->execution->getByID(3); +$execution4 = $tester->execution->getByID(4); +$execution5 = $tester->execution->getByID(5); + +r($tester->execution->canCloseByDeliverable($execution1)) && p('') && e('1'); // 查看执行1是否可关闭 +r($tester->execution->canCloseByDeliverable($execution2)) && p('') && e('1'); // 查看执行2是否可关闭 +r($tester->execution->canCloseByDeliverable($execution3)) && p('') && e('1'); // 查看执行3是否可关闭 +r($tester->execution->canCloseByDeliverable($execution4)) && p('') && e('1'); // 查看执行4是否可关闭 +r($tester->execution->canCloseByDeliverable($execution5)) && p('') && e('1'); // 查看执行5是否可关闭 \ No newline at end of file diff --git a/module/execution/test/model/resetexecutionsorts.php b/module/execution/test/model/resetexecutionsorts.php index 5620e18ee0..2a4c51a249 100755 --- a/module/execution/test/model/resetexecutionsorts.php +++ b/module/execution/test/model/resetexecutionsorts.php @@ -27,11 +27,25 @@ title=测试executionModel->resetExecutionSorts(); timeout=0 cid=1 +- 检查没有执行时的排序 @0 +- 检查项目 2 的执行排序 @3,5,7,8,6,4 + +- 检查项目 60 的执行排序 @106,112,107,113,108,114,109,115,110,116,111,117 + +- 检查项目 61 的执行排序 @118,119,120,121,122,123 + +- 检查项目 100 的执行排序 @124,125,126 + */ -$projectList = array(0, 2); +$projectList = array(0, 2, 60, 61, 100); $executionTester = new executionTest(); -r($executionTester->resetExecutionSortsTest($projectList[0])) && p() && e('0'); // 检查没有执行时的排序 -r($executionTester->resetExecutionSortsTest($projectList[1])) && p() && e('3,5,7,8,6,4'); // 检查有执行时的排序 -r($executionTester->resetExecutionSortsTest($projectList[1], 'hasParent')) && p() && e('3,5,7,8,6,4'); // 检查有执行并且传parenExecutions时的排序 +r($executionTester->resetExecutionSortsTest($projectList[0])) && p() && e('0'); // 检查没有执行时的排序 +r($executionTester->resetExecutionSortsTest($projectList[1])) && p() && e('3,5,7,8,6,4'); // 检查项目 2 的执行排序 + +zenData('project')->loadYaml('execution')->gen('30'); + +r($executionTester->resetExecutionSortsTest($projectList[2])) && p() && e('106,112,107,113,108,114,109,115,110,116,111,117'); // 检查项目 60 的执行排序 +r($executionTester->resetExecutionSortsTest($projectList[3])) && p() && e('118,119,120,121,122,123'); // 检查项目 61 的执行排序 +r($executionTester->resetExecutionSortsTest($projectList[4])) && p() && e('124,125,126'); // 检查项目 100 的执行排序 diff --git a/module/execution/test/tao/setkanbanmenu.php b/module/execution/test/tao/setkanbanmenu.php index 782884b17c..d5499a2938 100644 --- a/module/execution/test/tao/setkanbanmenu.php +++ b/module/execution/test/tao/setkanbanmenu.php @@ -11,7 +11,17 @@ title=测试executionModel->setKanbanMenu(); timeout=0 cid=1 +- 测试替换看板执行的二级菜单第kanban条的link属性 @看板|execution|kanban|executionID=%s +- 查看交付物菜单第deliverable条的link属性 @交付物|execution|deliverable|executionID=%s +- 查看构建菜单第build条的link属性 @构建|execution|build|executionID=%s +- 查看累积流图菜单第CFD条的link属性 @累积流图|execution|cfd|executionID=%s +- 查看设置菜单第settings条的link属性 @设置|execution|view|executionID=%s + */ $executionTester = new executionTest(); -r($executionTester->setKanbanMenuTest()) && p('kanban:link') && e('看板|execution|kanban|executionID=%s'); // 测试替换看板执行的二级菜单 +r($executionTester->setKanbanMenuTest()) && p('kanban:link') && e('看板|execution|kanban|executionID=%s'); // 测试替换看板执行的二级菜单 +r($executionTester->setKanbanMenuTest()) && p('deliverable:link') && e('交付物|execution|deliverable|executionID=%s'); // 查看交付物菜单 +r($executionTester->setKanbanMenuTest()) && p('build:link') && e('构建|execution|build|executionID=%s'); // 查看构建菜单 +r($executionTester->setKanbanMenuTest()) && p('CFD:link') && e('累积流图|execution|cfd|executionID=%s'); // 查看累积流图菜单 +r($executionTester->setKanbanMenuTest()) && p('settings:link') && e('设置|execution|view|executionID=%s'); // 查看设置菜单 \ No newline at end of file diff --git a/module/extension/model.php b/module/extension/model.php index 65226c2e8f..ff59e05951 100644 --- a/module/extension/model.php +++ b/module/extension/model.php @@ -724,7 +724,7 @@ class extensionModel extends model { $commandTips[] = PHP_OS == 'Linux' ? "sudo rm -fr $appRoot$dir" : "rmdir $appRoot$dir /s /q"; } - elseif(!@rmdir($path)) + elseif(!$this->classFile->removeDir($path)) { $commandTips[] = PHP_OS == 'Linux' ? "sudo rm -fr $appRoot$dir" : "rmdir $appRoot$dir /s /q"; } diff --git a/module/file/control.php b/module/file/control.php index db69bd4785..e3359d633d 100755 --- a/module/file/control.php +++ b/module/file/control.php @@ -571,6 +571,11 @@ class file extends control } if($file) { + if($this->viewType === 'json') + { + echo json_encode(array('result' => 'success', 'data' => array('id' => $file->id, 'title' => $file->title, 'extension' => $file->extension, 'size' => $file->realPath, 'gid' => $file->gid, 'addedBy' => $file->addedBy, 'addedDate' => $file->addedDate, 'objectType' => $file->objectType, 'objectID' => $file->objectID))); + return; + } $fileID = $file->id; return $this->fetch('file', 'read', "fileID=$fileID&stream=$stream"); } @@ -582,6 +587,13 @@ class file extends control $file = $this->file->query($objectType, $objectID, $title, $extra); if(empty($file)) return $this->send(array('result' => 'fail', 'message' => $this->lang->file->fileNotFound, 'load' => helper::createLink('my', 'index'), 'closeModal' => true)); $fileID = $file->id; + + if($this->viewType === 'json') + { + echo json_encode(array('result' => 'success', 'data' => array('id' => $file->id, 'title' => $file->title, 'extension' => $file->extension, 'size' => $file->realPath, 'gid' => $file->gid, 'addedBy' => $file->addedBy, 'addedDate' => $file->addedDate, 'objectType' => $file->objectType, 'objectID' => $file->objectID))); + return; + } + return $this->fetch('file', 'read', "fileID=$fileID&stream=$stream"); } diff --git a/module/file/model.php b/module/file/model.php index 611e7bc02e..5b4732dedc 100755 --- a/module/file/model.php +++ b/module/file/model.php @@ -185,7 +185,7 @@ class fileModel extends model $file['objectID'] = $objectID; $file['addedBy'] = $this->app->user->account; $file['addedDate'] = $now; - $file['extra'] = $extra; + if($extra) $file['extra'] = $extra; unset($file['tmpname']); $this->dao->insert(TABLE_FILE)->data($file)->exec(); $fileTitles[$this->dao->lastInsertId()] = $file['title']; @@ -279,6 +279,7 @@ class fileModel extends model $file['title'] = $purifier->purify($file['title']); $file['size'] = $size[$id]; $file['tmpname'] = $tmp_name[$id]; + $file['extra'] = !empty($extra[$id]) ? $extra[$id] : ''; $files[] = $file; } } @@ -464,12 +465,12 @@ class fileModel extends model /** * Set path name of the uploaded file to be saved. * - * @param int $fileID - * @param string $extension + * @param string|int $fileID + * @param string $extension * @access public * @return string */ - public function setPathName(int $fileID, string $extension): string + public function setPathName(string|int $fileID, string $extension): string { $sessionID = session_id(); $randString = substr($sessionID, mt_rand(0, strlen($sessionID) - 5), 3); diff --git a/module/gitlab/control.php b/module/gitlab/control.php index 95043ed545..0e305e773b 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -690,7 +690,7 @@ class gitlab extends control $groups = $this->gitlab->apiGetGroups($gitlabID, 'name_asc', 'maintainer'); foreach($groups as $group) $groupIDList[] = $group->id; - foreach($result['projects'] as $key => $project) + foreach($result['projects'] as $project) { $project->adminer = (bool)$this->app->user->admin; if(!$project->adminer and isset($project->owner) and $project->owner->id == $openID) $project->adminer = true; diff --git a/module/gitlab/model.php b/module/gitlab/model.php index 97ab3d9934..540fcf7ef1 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -634,11 +634,12 @@ class gitlabModel extends model if(empty($result)) return array('pager' => null, 'projects' => array()); $header = $result['header']; - $recTotal = isset($header['X-Total']) ? $header['X-Total']: $header['x-total']; - $recPerPage = isset($header['X-Per-Page']) ? $header['X-Per-Page'] : $header['x-per-page']; + $recTotal = isset($header['X-Total']) ? $header['X-Total']: zget($header, 'x-total', 0); + $recPerPage = isset($header['X-Per-Page']) ? $header['X-Per-Page'] : zget($header, 'x-per-page', 0); $this->app->loadClass('pager', true); $pager = pager::init($recTotal, $recPerPage, $pager->pageID); + if(empty($recTotal)) return array('pager' => $pager, 'projects' => array()); return array('pager' => $pager, 'projects' => json_decode($result['body'])); } diff --git a/module/group/lang/de.php b/module/group/lang/de.php index c5242f8351..8c14b1a702 100644 --- a/module/group/lang/de.php +++ b/module/group/lang/de.php @@ -488,6 +488,7 @@ $lang->group->package->projectBuild = 'Project Build'; $lang->group->package->importCaseLib = 'Import Case Lib'; $lang->group->package->commonSetting = 'Common Setting'; $lang->group->package->stageSetting = 'Stage Setting'; +$lang->group->package->deliverable = 'Deliverable Setting'; $lang->group->package->classify = 'Classify'; $lang->group->package->cmcl = 'Cmcl'; $lang->group->package->auditcl = 'Auditcl'; @@ -620,5 +621,7 @@ $lang->group->package->application = 'Manage Application'; $lang->group->package->component = 'Component'; $lang->group->package->browseRule = 'Browse Rule'; $lang->group->package->manageRule = 'Manage Rule'; +$lang->group->package->executionDeliverable = 'Execution Deliverable'; +$lang->group->package->projectDeliverable = 'Project Deliverable'; include (dirname(__FILE__) . '/resource.php'); diff --git a/module/group/lang/en.php b/module/group/lang/en.php index 0077e8d7b3..2d6cb05ddb 100644 --- a/module/group/lang/en.php +++ b/module/group/lang/en.php @@ -488,6 +488,7 @@ $lang->group->package->projectBuild = 'Project Build'; $lang->group->package->importCaseLib = 'Import Case Lib'; $lang->group->package->commonSetting = 'Common Setting'; $lang->group->package->stageSetting = 'Stage Setting'; +$lang->group->package->deliverable = 'Deliverable Setting'; $lang->group->package->classify = 'Classify'; $lang->group->package->cmcl = 'Cmcl'; $lang->group->package->auditcl = 'Auditcl'; @@ -620,5 +621,7 @@ $lang->group->package->application = 'Manage Application'; $lang->group->package->component = 'Component'; $lang->group->package->browseRule = 'Browse Rule'; $lang->group->package->manageRule = 'Manage Rule'; +$lang->group->package->executionDeliverable = 'Execution Deliverable'; +$lang->group->package->projectDeliverable = 'Project Deliverable'; include (dirname(__FILE__) . '/resource.php'); diff --git a/module/group/lang/fr.php b/module/group/lang/fr.php index 8b10db5e55..035195166c 100644 --- a/module/group/lang/fr.php +++ b/module/group/lang/fr.php @@ -488,6 +488,7 @@ $lang->group->package->projectBuild = 'Project Build'; $lang->group->package->importCaseLib = 'Import Case Lib'; $lang->group->package->commonSetting = 'Common Setting'; $lang->group->package->stageSetting = 'Stage Setting'; +$lang->group->package->deliverable = 'Deliverable Setting'; $lang->group->package->classify = 'Classify'; $lang->group->package->cmcl = 'Cmcl'; $lang->group->package->auditcl = 'Auditcl'; @@ -620,5 +621,7 @@ $lang->group->package->application = 'Manage Application'; $lang->group->package->component = 'Component'; $lang->group->package->browseRule = 'Browse Rule'; $lang->group->package->manageRule = 'Manage Rule'; +$lang->group->package->executionDeliverable = 'Execution Deliverable'; +$lang->group->package->projectDeliverable = 'Project Deliverable'; include (dirname(__FILE__) . '/resource.php'); diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index af21d0cf7b..9d005d006f 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1605,6 +1605,7 @@ $lang->mail->methodOrder[50] = 'resend'; $lang->resource->custom = new stdclass(); $lang->resource->custom->set = 'set'; $lang->resource->custom->product = 'productName'; +$lang->resource->custom->project = 'projectCommon'; $lang->resource->custom->execution = 'executionCommon'; $lang->resource->custom->required = 'required'; $lang->resource->custom->restore = 'restore'; @@ -1623,6 +1624,7 @@ $lang->resource->custom->limitTaskDate = 'limitTaskDateAction'; $lang->custom->methodOrder[10] = 'set'; $lang->custom->methodOrder[15] = 'product'; +$lang->custom->methodOrder[17] = 'project'; $lang->custom->methodOrder[20] = 'execution'; $lang->custom->methodOrder[25] = 'required'; $lang->custom->methodOrder[30] = 'restore'; diff --git a/module/group/lang/zh-cn.php b/module/group/lang/zh-cn.php index 91b990594b..6dfa612257 100644 --- a/module/group/lang/zh-cn.php +++ b/module/group/lang/zh-cn.php @@ -442,7 +442,7 @@ $lang->group->package->workflowLabel = '工作流标签'; $lang->group->package->workflowReport = '工作流报表'; $lang->group->package->workflowDatasource = '工作流数据源'; $lang->group->package->workflowRule = '工作流验证规则'; -$lang->group->package->workflowGroup = '工作流流程模板'; +$lang->group->package->workflowGroup = '工作流流程管理'; $lang->group->package->workflow = '工作流'; $lang->group->package->rule = '规则引擎'; $lang->group->package->downloadCode = '下载代码'; @@ -488,6 +488,7 @@ $lang->group->package->projectBuild = '项目构建'; $lang->group->package->importCaseLib = '导入用例库'; $lang->group->package->commonSetting = '通用配置'; $lang->group->package->stageSetting = '阶段列表设置'; +$lang->group->package->deliverable = '交付物设置'; $lang->group->package->classify = '分类项设置'; $lang->group->package->cmcl = '审计设置'; $lang->group->package->auditcl = 'QA检查项设置'; @@ -620,5 +621,7 @@ $lang->group->package->application = '管理应用'; $lang->group->package->component = '组件'; $lang->group->package->browseRule = '浏览规则'; $lang->group->package->manageRule = '创建维护规则'; +$lang->group->package->executionDeliverable = '交付物'; +$lang->group->package->projectDeliverable = '交付物'; include (dirname(__FILE__) . '/resource.php'); diff --git a/module/group/packagemanager.php b/module/group/packagemanager.php index f8c3e7e6e5..16e5400ea1 100644 --- a/module/group/packagemanager.php +++ b/module/group/packagemanager.php @@ -65,90 +65,94 @@ $config->group->subset->project = new stdclass(); $config->group->subset->project->order = 170; $config->group->subset->project->nav = 'project'; -$config->group->subset->projectplan = new stdclass(); -$config->group->subset->projectplan->order = 180; -$config->group->subset->projectplan->nav = 'project'; +$config->group->subset->programplan = new stdclass(); +$config->group->subset->programplan->order = 180; +$config->group->subset->programplan->nav = 'project'; $config->group->subset->projectstory = new stdclass(); $config->group->subset->projectstory->order = 190; $config->group->subset->projectstory->nav = 'project'; -$config->group->subset->programplan = new stdclass(); -$config->group->subset->programplan->order = 200; -$config->group->subset->programplan->nav = 'project'; +$config->group->subset->projectplan = new stdclass(); +$config->group->subset->projectplan->order = 200; +$config->group->subset->projectplan->nav = 'project'; $config->group->subset->design = new stdclass(); $config->group->subset->design->order = 210; $config->group->subset->design->nav = 'project'; -$config->group->subset->issue = new stdclass(); -$config->group->subset->issue->order = 230; -$config->group->subset->issue->nav = 'project'; +$config->group->subset->projecttrack = new stdclass(); +$config->group->subset->projecttrack->order = 220; +$config->group->subset->projecttrack->nav = 'project'; -$config->group->subset->risk = new stdclass(); -$config->group->subset->risk->order = 240; -$config->group->subset->risk->nav = 'project'; +$config->group->subset->projectDeliverable = new stdclass(); +$config->group->subset->projectDeliverable->order = 230; +$config->group->subset->projectDeliverable->nav = 'project'; -$config->group->subset->workestimation = new stdclass(); -$config->group->subset->workestimation->order = 260; -$config->group->subset->workestimation->nav = 'project'; +$config->group->subset->projectreview = new stdclass(); +$config->group->subset->projectreview->order = 240; +$config->group->subset->projectreview->nav = 'project'; -$config->group->subset->opportunity = new stdclass(); -$config->group->subset->opportunity->order = 290; -$config->group->subset->opportunity->nav = 'project'; +$config->group->subset->cm = new stdclass(); +$config->group->subset->cm->order = 250; +$config->group->subset->cm->nav = 'project'; -$config->group->subset->meeting = new stdclass(); -$config->group->subset->meeting->order = 350; -$config->group->subset->meeting->nav = 'project'; +$config->group->subset->projectqa = new stdclass(); +$config->group->subset->projectqa->order = 260; +$config->group->subset->projectqa->nav = 'project'; $config->group->subset->projectbuild = new stdclass(); -$config->group->subset->projectbuild->order = 360; +$config->group->subset->projectbuild->order = 270; $config->group->subset->projectbuild->nav = 'project'; $config->group->subset->projectrelease = new stdclass(); -$config->group->subset->projectrelease->order = 370; +$config->group->subset->projectrelease->order = 280; $config->group->subset->projectrelease->nav = 'project'; +$config->group->subset->projectreport = new stdclass(); +$config->group->subset->projectreport->order = 290; +$config->group->subset->projectreport->nav = 'project'; + +$config->group->subset->projectresearch = new stdclass(); +$config->group->subset->projectresearch->order = 300; +$config->group->subset->projectresearch->nav = 'project'; + +$config->group->subset->workestimation = new stdclass(); +$config->group->subset->workestimation->order = 310; +$config->group->subset->workestimation->nav = 'project'; + +$config->group->subset->issue = new stdclass(); +$config->group->subset->issue->order = 320; +$config->group->subset->issue->nav = 'project'; + +$config->group->subset->risk = new stdclass(); +$config->group->subset->risk->order = 330; +$config->group->subset->risk->nav = 'project'; + +$config->group->subset->opportunity = new stdclass(); +$config->group->subset->opportunity->order = 340; +$config->group->subset->opportunity->nav = 'project'; + +$config->group->subset->pssp = new stdclass(); +$config->group->subset->pssp->order = 350; +$config->group->subset->pssp->nav = 'project'; + +$config->group->subset->projectauditplan = new stdclass(); +$config->group->subset->projectauditplan->order = 360; +$config->group->subset->projectauditplan->nav = 'project'; + +$config->group->subset->projectgapanalysis = new stdclass(); +$config->group->subset->projectgapanalysis->order = 370; +$config->group->subset->projectgapanalysis->nav = 'project'; + +$config->group->subset->meeting = new stdclass(); +$config->group->subset->meeting->order = 380; +$config->group->subset->meeting->nav = 'project'; + $config->group->subset->projectsettings = new stdclass(); $config->group->subset->projectsettings->order = 390; $config->group->subset->projectsettings->nav = 'project'; -$config->group->subset->projectreview = new stdclass(); -$config->group->subset->projectreview->order = 400; -$config->group->subset->projectreview->nav = 'project'; - -$config->group->subset->projecttrack = new stdclass(); -$config->group->subset->projecttrack->order = 410; -$config->group->subset->projecttrack->nav = 'project'; - -$config->group->subset->projectqa = new stdclass(); -$config->group->subset->projectqa->order = 420; -$config->group->subset->projectqa->nav = 'project'; - -$config->group->subset->pssp = new stdclass(); -$config->group->subset->pssp->order = 430; -$config->group->subset->pssp->nav = 'project'; - -$config->group->subset->cm = new stdclass(); -$config->group->subset->cm->order = 440; -$config->group->subset->cm->nav = 'project'; - -$config->group->subset->projectreport = new stdclass(); -$config->group->subset->projectreport->order = 490; -$config->group->subset->projectreport->nav = 'project'; - -$config->group->subset->projectresearch = new stdclass(); -$config->group->subset->projectresearch->order = 500; -$config->group->subset->projectresearch->nav = 'project'; - -$config->group->subset->projectauditplan = new stdclass(); -$config->group->subset->projectauditplan->order = 510; -$config->group->subset->projectauditplan->nav = 'project'; - -$config->group->subset->projectgapanalysis = new stdclass(); -$config->group->subset->projectgapanalysis->order = 520; -$config->group->subset->projectgapanalysis->nav = 'project'; - $config->group->subset->execution = new stdclass(); $config->group->subset->execution->order = 530; $config->group->subset->execution->nav = 'execution'; @@ -157,34 +161,38 @@ $config->group->subset->task = new stdclass(); $config->group->subset->task->order = 540; $config->group->subset->task->nav = 'execution'; -$config->group->subset->build = new stdclass(); -$config->group->subset->build->order = 550; -$config->group->subset->build->nav = 'execution'; - -$config->group->subset->executionview = new stdclass(); -$config->group->subset->executionview->order = 560; -$config->group->subset->executionview->nav = 'execution'; - $config->group->subset->executionkanban = new stdclass(); -$config->group->subset->executionkanban->order = 580; +$config->group->subset->executionkanban->order = 550; $config->group->subset->executionkanban->nav = 'execution'; $config->group->subset->executionburn = new stdclass(); -$config->group->subset->executionburn->order = 590; +$config->group->subset->executionburn->order = 560; $config->group->subset->executionburn->nav = 'execution'; $config->group->subset->executioncfd = new stdclass(); -$config->group->subset->executioncfd->order = 600; +$config->group->subset->executioncfd->order = 570; $config->group->subset->executioncfd->nav = 'execution'; +$config->group->subset->executionview = new stdclass(); +$config->group->subset->executionview->order = 580; +$config->group->subset->executionview->nav = 'execution'; + $config->group->subset->executionstory = new stdclass(); -$config->group->subset->executionstory->order = 610; +$config->group->subset->executionstory->order = 590; $config->group->subset->executionstory->nav = 'execution'; +$config->group->subset->executionDeliverable = new stdclass(); +$config->group->subset->executionDeliverable->order = 600; +$config->group->subset->executionDeliverable->nav = 'execution'; + $config->group->subset->executionqa = new stdclass(); -$config->group->subset->executionqa->order = 620; +$config->group->subset->executionqa->order = 610; $config->group->subset->executionqa->nav = 'execution'; +$config->group->subset->build = new stdclass(); +$config->group->subset->build->order = 620; +$config->group->subset->build->nav = 'execution'; + $config->group->subset->executionsettings = new stdclass(); $config->group->subset->executionsettings->order = 630; $config->group->subset->executionsettings->nav = 'execution'; @@ -1010,6 +1018,7 @@ $config->group->package->manageProject->privs['project-activate'] = array( $config->group->package->manageProject->privs['project-updateOrder'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 7, 'depend' => array('project-browse'), 'recommend' => array('project-create', 'project-edit')); $config->group->package->manageProject->privs['project-manageProducts'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 8, 'depend' => array('project-browse'), 'recommend' => array('project-create', 'project-edit')); $config->group->package->manageProject->privs['project-programTitle'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 9, 'depend' => array('project-browse'), 'recommend' => array('program-browse')); +$config->group->package->manageProject->privs['project-workflowGroup'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array('project-browse'), 'recommend' => array('program-browse')); $config->group->package->importProject = new stdclass(); $config->group->package->importProject->order = 15; @@ -1047,6 +1056,12 @@ $config->group->package->projectWhitelist->privs['project-whitelist'] = ar $config->group->package->projectWhitelist->privs['project-addWhitelist'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 110, 'depend' => array('project-whitelist'), 'recommend' => array('project-unbindWhitelist')); $config->group->package->projectWhitelist->privs['project-unbindWhitelist'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 115, 'depend' => array('project-whitelist'), 'recommend' => array('project-addWhitelist')); +$config->group->package->projectDeliverable = new stdclass(); +$config->group->package->projectDeliverable->order = 5; +$config->group->package->projectDeliverable->subset = 'projectDeliverable'; +$config->group->package->projectDeliverable->privs = array(); +$config->group->package->projectDeliverable->privs['project-deliverable'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array(), 'recommend' => array()); + $config->group->package->browseExecution = new stdclass(); $config->group->package->browseExecution->order = 5; $config->group->package->browseExecution->subset = 'execution'; @@ -1094,6 +1109,13 @@ $config->group->package->executionWhitelist->privs['execution-whitelist'] $config->group->package->executionWhitelist->privs['execution-addWhitelist'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 245, 'depend' => array('execution-whitelist'), 'recommend' => array('execution-unbindWhitelist')); $config->group->package->executionWhitelist->privs['execution-unbindWhitelist'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 250, 'depend' => array('execution-whitelist'), 'recommend' => array('execution-addWhitelist')); +$config->group->package->executionDeliverable = new stdclass(); +$config->group->package->executionDeliverable->order = 5; +$config->group->package->executionDeliverable->subset = 'executionDeliverable'; +$config->group->package->executionDeliverable->nav = 'execution'; +$config->group->package->executionDeliverable->privs = array(); +$config->group->package->executionDeliverable->privs['execution-deliverable'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array(), 'recommend' => array()); + $config->group->package->gantt = new stdclass(); $config->group->package->gantt->order = 5; $config->group->package->gantt->subset = 'executionview'; @@ -2567,7 +2589,7 @@ $config->group->package->workflowGroup = new stdclass(); $config->group->package->workflowGroup->order = 65; $config->group->package->workflowGroup->subset = 'workflow'; $config->group->package->workflowGroup->privs = array(); -$config->group->package->workflowGroup->privs['workflowgroup-product'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 5, 'depend' => array('workflow-browseFlow'), 'recommend' => array()); +$config->group->package->workflowGroup->privs['workflowgroup-product'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 5, 'depend' => array('workflow-browseFlow'), 'recommend' => array()); $config->group->package->workflowGroup->privs['workflowgroup-project'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 10, 'depend' => array('workflow-browseFlow'), 'recommend' => array()); $config->group->package->workflowGroup->privs['workflowgroup-create'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 15, 'depend' => array('workflow-browseFlow'), 'recommend' => array()); $config->group->package->workflowGroup->privs['workflowgroup-edit'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 20, 'depend' => array('workflow-browseFlow'), 'recommend' => array()); @@ -2580,6 +2602,7 @@ $config->group->package->workflowGroup->privs['workflowgroup-setExclusive'] = $config->group->package->workflowGroup->privs['workflowgroup-activateFlow'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 55, 'depend' => array('workflow-browseFlow'), 'recommend' => array()); $config->group->package->workflowGroup->privs['workflowgroup-deactivateFlow'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 60, 'depend' => array('workflow-browseFlow'), 'recommend' => array()); $config->group->package->workflowGroup->privs['workflowgroup-rule'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 65, 'depend' => array('workflow-browseFlow'), 'recommend' => array()); +$config->group->package->workflowGroup->privs['workflowgroup-deliverable'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 70, 'depend' => array('workflowgroup-project'), 'recommend' => array()); $config->group->package->workflow = new stdclass(); $config->group->package->workflow->order = 5; @@ -2979,6 +3002,7 @@ $config->group->package->commonSetting = new stdclass(); $config->group->package->commonSetting->order = 5; $config->group->package->commonSetting->subset = 'modelconfig'; $config->group->package->commonSetting->privs = array(); +$config->group->package->commonSetting->privs['custom-project'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 1, 'depend' => array(), 'recommend' => array()); $config->group->package->commonSetting->privs['stage-setType'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 25, 'depend' => array(), 'recommend' => array()); $config->group->package->commonSetting->privs['custom-flow'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 35, 'depend' => array('admin-index', 'admin-register'), 'recommend' => array()); $config->group->package->commonSetting->privs['custom-estimate'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 50, 'depend' => array(), 'recommend' => array()); @@ -2998,6 +3022,16 @@ $config->group->package->stageSetting->privs['stage-edit'] = array('editi $config->group->package->stageSetting->privs['stage-delete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 5, 'depend' => array(), 'recommend' => array('stage-create', 'stage-edit')); $config->group->package->stageSetting->privs['stage-plusBrowse'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 1, 'depend' => array(), 'recommend' => array()); +$config->group->package->deliverable = new stdclass(); +$config->group->package->deliverable->order = 20; +$config->group->package->deliverable->subset = 'modelconfig'; +$config->group->package->deliverable->privs = array(); +$config->group->package->deliverable->privs['deliverable-browse'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 0, 'depend' => array(), 'recommend' => array()); +$config->group->package->deliverable->privs['deliverable-create'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 1, 'depend' => array('deliverable-browse'), 'recommend' => array()); +$config->group->package->deliverable->privs['deliverable-edit'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 2, 'depend' => array('deliverable-browse'), 'recommend' => array('deliverable-view', 'deliverable-browse')); +$config->group->package->deliverable->privs['deliverable-delete'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 3, 'depend' => array('deliverable-browse'), 'recommend' => array('deliverable-view', 'deliverable-browse')); +$config->group->package->deliverable->privs['deliverable-view'] = array('edition' => 'max,ipd', 'vision' => 'rnd', 'order' => 4, 'depend' => array('deliverable-browse'), 'recommend' => array()); + $config->group->package->classify = new stdclass(); $config->group->package->classify->order = 30; $config->group->package->classify->subset = 'modelconfig'; diff --git a/module/install/control.php b/module/install/control.php index c66c9de8fd..187111e537 100644 --- a/module/install/control.php +++ b/module/install/control.php @@ -24,6 +24,8 @@ class install extends control if(!$this->app->installing && $this->app->tab != 'devops' && !isInModal()) helper::end(); + set_time_limit(0); + $this->app->loadLang('user'); $this->app->loadLang('admin'); $this->config->webRoot = getWebRoot(); diff --git a/module/instance/model.php b/module/instance/model.php index 3d22a9aa5c..6ca619756a 100644 --- a/module/instance/model.php +++ b/module/instance/model.php @@ -50,6 +50,22 @@ class instanceModel extends model return $instance; } + /** + * 获取应用实例数量。 + * Get instance count. + * + * @param string $status + * @access public + * @return int + */ + public function getInstanceCount(string $status = ''): int + { + return $this->dao->select('count(*) as count')->from(TABLE_INSTANCE) + ->where('deleted')->eq(0) + ->beginIF($status)->andWhere('status')->eq($status)->fi() + ->fetch('count'); + } + /** * 根据应用url获取应用信息。 * Get a application by url. diff --git a/module/instance/test/model/getinstancecount.php b/module/instance/test/model/getinstancecount.php new file mode 100755 index 0000000000..b856663c73 --- /dev/null +++ b/module/instance/test/model/getinstancecount.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +gen(200); + +/** + +title=instanceModel->getByID(); +timeout=0 +cid=1 + +- 获取所有instance数量 @200 +- 获取运行中的instance数量 @198 +- 获取关闭的instance数量 @1 +- 获取异常的instance数量 @1 +- 获取不存在状态的instance数量 @0 +*/ + +global $tester; +$instance = $tester->loadModel('instance'); + +r($instance->getInstanceCount()) && p() && e('200'); // 获取所有instance数量 +r($instance->getInstanceCount('running')) && p() && e('198'); // 获取运行中的instance数量 +r($instance->getInstanceCount('stopped')) && p() && e('1'); // 获取关闭的instance数量 +r($instance->getInstanceCount('abnormal')) && p() && e('1'); // 获取异常的instance数量 +r($instance->getInstanceCount('test')) && p() && e('0'); // 获取不存在状态的instance数量 diff --git a/module/job/model.php b/module/job/model.php index 38c582b0b7..ec35d687e3 100644 --- a/module/job/model.php +++ b/module/job/model.php @@ -296,7 +296,7 @@ class jobModel extends model ->fetch(); if(!$job) return false; - if(($this->app->rawModule != 'job' || $this->app->rawMethod != 'exec') && $this->app->rawModule != 'mr' && !empty($job->autoRun)) return false; + if(($this->app->rawModule != 'job' || $this->app->rawMethod != 'exec') && !in_array($this->app->rawModule, array('mr', 'sonarqube')) && !empty($job->autoRun)) return false; $repo = $this->loadModel('repo')->getByID($job->repo); if(!$repo) return false; diff --git a/module/misc/lang/de.php b/module/misc/lang/de.php index cdb9133131..6d54f17aa5 100644 --- a/module/misc/lang/de.php +++ b/module/misc/lang/de.php @@ -114,6 +114,7 @@ $lang->misc->feature->promptExecImage = 'theme/default/images/main/prompt_exec $lang->misc->feature->promptLearnMore = 'https://www.zentao.net/book/zentaopms/1097.html'; /* Release Date. */ +$lang->misc->releaseDate['21.7.1'] = '2025-05-30'; $lang->misc->releaseDate['21.7'] = '2025-05-16'; $lang->misc->releaseDate['21.6.1'] = '2025-04-30'; $lang->misc->releaseDate['21.6'] = '2025-04-11'; @@ -248,6 +249,8 @@ $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; /* Release Detail. */ +$lang->misc->feature->all['21.7.1'][] = array('title' => 'Implement enhanced project management features, including adding a top toolbar to the document editor, configuring single project workflow management, optimizing requirements, and adding deliverable management functionality.', 'desc' => ''); +$lang->misc->feature->all['21.7'][] = array('title' => 'Now, ZenTao supports bulk editing of parent-child stages across both Waterfall and Waterfall Plus methodologies, enables dependencies between cross-execution tasks, and facilitates batch stage editing within Integrated Product Development (IPD) projects, along with bug fixes.', 'desc' => ''); $lang->misc->feature->all['21.6.1'][] = array('title' => 'Documentation Bug Resolution.', 'desc' => ''); $lang->misc->feature->all['21.6'][] = array('title' => 'Jira import optimization. Multi-user document collaboration.', 'desc' => ''); $lang->misc->feature->all['21.6.beta'][] = array('title' => 'Jira 2.0 import implementation and Confluence integration deployment.', 'desc' => ''); diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php index 7f71ca8df9..4a9041025d 100644 --- a/module/misc/lang/en.php +++ b/module/misc/lang/en.php @@ -114,6 +114,7 @@ $lang->misc->feature->promptExecImage = 'theme/default/images/main/prompt_exec $lang->misc->feature->promptLearnMore = 'https://www.zentao.net/book/zentaopms/1097.html'; /* Release Date. */ +$lang->misc->releaseDate['21.7.1'] = '2025-05-30'; $lang->misc->releaseDate['21.7'] = '2025-05-16'; $lang->misc->releaseDate['21.6.1'] = '2025-04-30'; $lang->misc->releaseDate['21.6'] = '2025-04-11'; @@ -248,6 +249,8 @@ $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; /* Release Detail. */ +$lang->misc->feature->all['21.7.1'][] = array('title' => 'Implement enhanced project management features, including adding a top toolbar to the document editor, configuring single project workflow management, optimizing requirements, and adding deliverable management functionality.', 'desc' => ''); +$lang->misc->feature->all['21.7'][] = array('title' => 'Now, ZenTao supports bulk editing of parent-child stages across both Waterfall and Waterfall Plus methodologies, enables dependencies between cross-execution tasks, and facilitates batch stage editing within Integrated Product Development (IPD) projects, along with bug fixes.', 'desc' => ''); $lang->misc->feature->all['21.6.1'][] = array('title' => 'Documentation Bug Resolution.', 'desc' => ''); $lang->misc->feature->all['21.6'][] = array('title' => 'Jira import optimization. Multi-user document collaboration.', 'desc' => ''); $lang->misc->feature->all['21.6.beta'][] = array('title' => 'Jira 2.0 import implementation and Confluence integration deployment.', 'desc' => ''); diff --git a/module/misc/lang/fr.php b/module/misc/lang/fr.php index f76e8b99f6..346a65289f 100644 --- a/module/misc/lang/fr.php +++ b/module/misc/lang/fr.php @@ -114,6 +114,7 @@ $lang->misc->feature->promptExecImage = 'theme/default/images/main/prompt_exec $lang->misc->feature->promptLearnMore = 'https://www.zentao.net/book/zentaopms/1097.html'; /* Release Date. */ +$lang->misc->releaseDate['21.7.1'] = '2025-05-30'; $lang->misc->releaseDate['21.7'] = '2025-05-16'; $lang->misc->releaseDate['21.6.1'] = '2025-04-30'; $lang->misc->releaseDate['21.6'] = '2025-04-11'; @@ -248,6 +249,8 @@ $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; /* Release Detail. */ +$lang->misc->feature->all['21.7.1'][] = array('title' => 'Implement enhanced project management features, including adding a top toolbar to the document editor, configuring single project workflow management, optimizing requirements, and adding deliverable management functionality.', 'desc' => ''); +$lang->misc->feature->all['21.7'][] = array('title' => 'Now, ZenTao supports bulk editing of parent-child stages across both Waterfall and Waterfall Plus methodologies, enables dependencies between cross-execution tasks, and facilitates batch stage editing within Integrated Product Development (IPD) projects, along with bug fixes.', 'desc' => ''); $lang->misc->feature->all['21.6.1'][] = array('title' => 'Documentation Bug Resolution.', 'desc' => ''); $lang->misc->feature->all['21.6'][] = array('title' => 'Jira import optimization. Multi-user document collaboration.', 'desc' => ''); $lang->misc->feature->all['21.6.beta'][] = array('title' => 'Jira 2.0 import implementation and Confluence integration deployment.', 'desc' => ''); diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php index 9dc058b50c..381472abb7 100644 --- a/module/misc/lang/zh-cn.php +++ b/module/misc/lang/zh-cn.php @@ -114,6 +114,7 @@ $lang->misc->feature->promptExecImage = 'theme/default/images/main/prompt_exec $lang->misc->feature->promptLearnMore = 'https://www.zentao.net/book/zentaopms/1097.html'; /* Release Date. */ +$lang->misc->releaseDate['21.7.1'] = '2025-05-30'; $lang->misc->releaseDate['21.7'] = '2025-05-16'; $lang->misc->releaseDate['21.6.1'] = '2025-04-30'; $lang->misc->releaseDate['21.6'] = '2025-04-11'; @@ -248,7 +249,8 @@ $lang->misc->releaseDate['7.1.stable'] = '2015-03-07'; $lang->misc->releaseDate['6.3.stable'] = '2014-11-07'; /* Release Detail. */ -$lang->misc->feature->all['21.7'][] = array('title' => '', 'desc' => ''); +$lang->misc->feature->all['21.7.1'][] = array('title' => '文档编辑器增加顶部工具栏;单项目流程管理配置;优化需求;增加交付物管理功能。', 'desc' => ''); +$lang->misc->feature->all['21.7'][] = array('title' => '瀑布、融合瀑布支持批量维护父子阶段;支持建立跨执行任务依赖关系;IPD项目支持批量维护父子阶段,修复bug。', 'desc' => ''); $lang->misc->feature->all['21.6.1'][] = array('title' => '修复文档相关Bug。', 'desc' => ''); $lang->misc->feature->all['21.6'][] = array('title' => 'Jira导入优化,文档多人协作。', 'desc' => ''); $lang->misc->feature->all['21.6.beta'][] = array('title' => 'Jira导入2.0版本,Confluence导入。', 'desc' => ''); diff --git a/module/pivot/model.php b/module/pivot/model.php index 3c2e36c4f0..3a0536d52b 100644 --- a/module/pivot/model.php +++ b/module/pivot/model.php @@ -1224,7 +1224,7 @@ class pivotModel extends model public function addRowSummary(array $groupTree, array $data, array $groups, int $currentGroup = 0): array { $first = reset($groupTree); - if(is_string($first)) + if(is_scalar($first)) { $groupData = array(); $rows = array(); diff --git a/module/product/model.php b/module/product/model.php index d0aae19827..631c7670fb 100755 --- a/module/product/model.php +++ b/module/product/model.php @@ -2041,7 +2041,7 @@ class productModel extends model if($module == 'bug' && $method == 'view') return helper::createLink('bug', 'browse', "productID=%s&branch={$branchID}&extra=$extra"); if($module == 'bug' && $method == 'report') return helper::createLink('bug', 'browse', "productID=%s{$branchParam}"); if($module == 'qa' && $method == 'index') return helper::createLink('bug', 'browse', "productID=%s{$branchParam}"); - if($module == 'story' && $method == 'report') return helper::createLink($module, $method, "productID=%s&branch={$branchID}&extra=$extra"); + if($module == 'story' && $method == 'report') return helper::createLink($module, $method, "productID=%s&branch={$branchID}&stroyType=$module"); if($module == 'testcase' && $method == 'browse') return helper::createLink($module, $method, "productID=%s&branch={$branchID}" . ($extra ? "&browseType=$extra" : '')); if($module == 'testreport' && $method == 'create') return helper::createLink($module, $method, "objectID=&objectType=testtask&extra=%s"); if($module == 'testtask' && $method == 'browse') return helper::createLink($module, $method, "productID=%s&branch={$branchID}"); diff --git a/module/product/test/model/getproductlink.php b/module/product/test/model/getproductlink.php index 51c27a5f62..ba502cca66 100644 --- a/module/product/test/model/getproductlink.php +++ b/module/product/test/model/getproductlink.php @@ -17,12 +17,12 @@ cid=0 - 当前页面是product-dynamic,切换1.5级导航时跳转链接。 @/product-dynamic-%s-.html - 当前页面是project-bug,切换1.5级导航时跳转链接。 @/project-bug--%s.html - 当前页面是qa-index,切换1.5级导航时跳转链接。 @/bug-browse-%s.html -- 当前页面是story-report,切换1.5级导航时跳转链接。 @/story-report-%s-all-.html +- 当前页面是story-report,切换1.5级导航时跳转链接。 @/story-report-%s-all-story.html - 当前页面是testcase-browse,切换1.5级导航时跳转链接。 @/testcase-browse-%s-all.html - 当前页面是testreport-create,切换1.5级导航时跳转链接。 @/testreport-create--testtask-%s.html - 当前页面是testreport-edit,切换1.5级导航时跳转链接。 @/testreport-browse-%s.html - 当前页面是testtask-browseUnits,切换1.5级导航时跳转链接。 @/testtask-browseUnits-%s-newest-id_desc-0-0-1.html -- 当前页面是testtask-browse,切换1.5级导航时跳转链接。 @/testtask-browse-%s-all-.html +- 当前页面是testtask-browse,切换1.5级导航时跳转链接。 @/testtask-browse-%s-all.html - 当前页面是execution-bug,切换1.5级导航时跳转链接。 @/execution-bug--%s.html - 当前页面是execution-testcase,切换1.5级导航时跳转链接。 @/execution-testcase--%s.html - 当前页面是product-doc,切换1.5级导航时跳转链接。 @/product-doc-%s.html @@ -81,7 +81,7 @@ r($productModel->getProductLink('product', 'project')) && p() && e('/pro r($productModel->getProductLink('product', 'dynamic')) && p() && e('/product-dynamic-%s-.html'); //当前页面是product-dynamic,切换1.5级导航时跳转链接。 r($productModel->getProductLink('project', 'bug')) && p() && e('/project-bug--%s.html'); //当前页面是project-bug,切换1.5级导航时跳转链接。 r($productModel->getProductLink('qa', 'index')) && p() && e('/bug-browse-%s.html'); //当前页面是qa-index,切换1.5级导航时跳转链接。 -r($productModel->getProductLink('story', 'report')) && p() && e('/story-report-%s-all-.html'); //当前页面是story-report,切换1.5级导航时跳转链接。 +r($productModel->getProductLink('story', 'report')) && p() && e('/story-report-%s-all-story.html'); //当前页面是story-report,切换1.5级导航时跳转链接。 r($productModel->getProductLink('testcase', 'browse')) && p() && e('/testcase-browse-%s-all.html'); //当前页面是testcase-browse,切换1.5级导航时跳转链接。 r($productModel->getProductLink('testreport', 'create')) && p() && e('/testreport-create--testtask-%s.html'); //当前页面是testreport-create,切换1.5级导航时跳转链接。 r($productModel->getProductLink('testreport', 'edit')) && p() && e('/testreport-browse-%s.html'); //当前页面是testreport-edit,切换1.5级导航时跳转链接。 @@ -124,4 +124,4 @@ r($productModel->getProductLink('feedback', 'view')) && p() && e('/feedback-brow $productModel->app->tab = 'project'; r($productModel->getProductLink('testcase', 'groupCase', '1')) && p() && e('/testcase-groupcase-%s-all--1.html#app=project'); //当前页面是testcase-groupcase,在项目视图下,切换1.5级导航时跳转链接。 -r($productModel->getProductLink('testcase', 'zeroCase', 'projectID=1')) && p() && e('/testcase-zerocase-%s-all--1.html#app=project'); //当前页面是testcase-zerocase,在项目视图下,切换1.5级导航时跳转链接。 +r($productModel->getProductLink('testcase', 'zeroCase', 'projectID=1')) && p() && e('/testcase-zerocase-%s-all--1.html#app=project'); //当前页面是testcase-zerocase,在项目视图下,切换1.5级导航时跳转链接。 \ No newline at end of file diff --git a/module/product/ui/browse.html.php b/module/product/ui/browse.html.php index d749db9a20..e28788fb28 100644 --- a/module/product/ui/browse.html.php +++ b/module/product/ui/browse.html.php @@ -284,7 +284,9 @@ $fnGenerateFootToolbar = function() use ($lang, $app, $product, $productID, $pro /* Remove empty data from data list. */ unset($lang->story->reviewResultList[''], $lang->story->reviewResultList['revert']); unset($lang->story->reasonList[''], $lang->story->reasonList['subdivided'], $lang->story->reasonList['duplicate']); - unset($plans[''], $lang->story->stageList[''], $users['']); + unset($lang->story->stageList[''], $users['']); + + if($storyType == 'story') $plans = \arrayUnion(array(0 => $lang->null), $plans); /* Generate dropdown menu items for the DataTable footer toolbar.*/ $planItems = $planItems ?? array(); diff --git a/module/program/ui/common.field.php b/module/program/ui/common.field.php index 0db9b7a616..b4739d28dc 100644 --- a/module/program/ui/common.field.php +++ b/module/program/ui/common.field.php @@ -8,7 +8,6 @@ $fields->field('parent') ->control(array('control' => 'picker', 'required' => true)) ->items(data('parents')) ->value(data('parentProgram.id') ? data('parentProgram.id') : 0) - ->disabled(!empty(data('parentProgram.id'))) ->data('parentBudget', data('parentProgram.budget')) ->data('parentBegin', data('parentProgram.begin')) ->data('parentEnd', data('parentProgram.end')); diff --git a/module/programplan/js/create.ui.js b/module/programplan/js/create.ui.js index 41c7eff0e3..2ad6dbc053 100644 --- a/module/programplan/js/create.ui.js +++ b/module/programplan/js/create.ui.js @@ -226,13 +226,19 @@ window.handleRenderRow = function($row, index, data) $typePicker.render({items: typeItems}); } + /* 已关闭且有交付物的阶段无法变更阶段类型。 */ + $row.find('[data-name="attribute"]').find('.picker-box').on('inited', function(e, info) + { + if(typeof data != 'undefined' && typeof data.hasDeliverable != 'undefined') info[0].render({disabled: true}); + }); + if(project.model == 'ipd') { if(planID == 0 && level == 0) { $row.find('[data-name="ACTIONS"]').find('[data-type="sort"]').addClass('disabled').attr('title', sortableTip); $row.find('[data-name="ACTIONS"]').find('[data-type="addSibling"]').prop('disabled', true).attr('title', addSiblingTip); - $row.find('[data-name="ACTIONS"]').find('[data-type="delete"]').prop('disabled', true); + $row.find('[data-name="ACTIONS"]').find('[data-type="delete"]').addClass('hidden'); } $row.find('[data-name="attribute"]').find('.picker-box').on('inited', function(e, info){ info[0].render({disabled: true}); }); @@ -519,4 +525,4 @@ window.moveChildren = function(id, processedIds = new Set()) $parent.after(element); moveChildren($(element).attr('data-gid'), processedIds); }); -} \ No newline at end of file +} diff --git a/module/programplan/model.php b/module/programplan/model.php index b2ea2238aa..b52b8f6865 100755 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -369,6 +369,8 @@ class programplanModel extends model $parents[$level] = $stageID; unset($plan->id, $plan->type); + if(in_array($this->config->edition, array('max', 'ipd'))) $plan = $this->execution->changeExecutionDeliverable($stageID, $plan); + $changes = $this->programplanTao->updateRow($stageID, $projectID, $plan); if(dao::isError()) return false; @@ -386,6 +388,22 @@ class programplanModel extends model } else { + if(!empty($project->deliverable) && in_array($this->config->edition, array('max', 'ipd'))) + { + $projectModel = $project->model; + if($projectModel == 'agileplus') $projectModel = 'scrum'; + if($projectModel == 'waterfallplus') $projectModel = 'waterfall'; + + $projectType = !empty($project->hasProduct) ? 'product' : 'project'; + $objectCode = $plan->attribute ? "{$projectType}_{$projectModel}_{$plan->attribute}" : "{$projectType}_{$projectModel}_{$plan->lifetime}"; + if($plan->type == 'kanban') $objectCode = "{$projectType}_{$projectModel}_kanban"; + + $projectDeliverable = $project->deliverable; + $projectDeliverable = !empty($projectDeliverable) ? json_decode($projectDeliverable, true) : array(); + $stageDeliverable = !empty($projectDeliverable[$objectCode]) ? array("{$objectCode}" => $projectDeliverable[$objectCode]) : array(); + $plan->deliverable = $stageDeliverable ? json_encode($stageDeliverable) : ''; + } + if($level > 0 && isset($parents[$level - 1])) $plan->parent = $parents[$level - 1]; $stageID = $this->programplanTao->insertStage($plan, $projectID, $productID, $level > 0 ? $plan->parent : $parentID); if(dao::isError()) return false; @@ -611,9 +629,9 @@ class programplanModel extends model * @param string $action * @param bool $isParent * @access public - * @return bool + * @return bool|array */ - public function computeProgress(int $stageID, string $action = '', bool $isParent = false): bool + public function computeProgress(int $stageID, string $action = '', bool $isParent = false): bool|array { $stage = $this->loadModel('execution')->fetchByID($stageID); if(empty($stage) || empty($stage->path)) return false; @@ -647,6 +665,17 @@ class programplanModel extends model $newParent = $result['newParent'] ?? null; $parentAction = $result['parentAction'] ?? ''; + /* 如果当前是顶级阶段,并且由于交付物不能关闭,则跳转到顶级阶段的关闭页面。 */ + if(isset($newParent->status) && $newParent->status == 'closed') + { + $isTopStage = $parent->grade == 1 && $parent->type != 'project' && $stageID != $id && $parent->status == 'doing'; + if(in_array($this->config->edition, array('max', 'ipd')) && $isTopStage && !$this->execution->canCloseByDeliverable($parent)) + { + $url = helper::createLink('execution', 'close', "executionID={$parent->id}"); + return array('result' => 'fail', 'callback' => "zui.Modal.confirm('{$this->lang->execution->cannotAutoCloseParent}').then((res) => {if(res) {loadModal('$url', '.modal-dialog');} else {loadPage();}});"); + } + } + /** 更新状态以及记录日志。 */ /** Update status and save log. */ if(isset($newParent) && $newParent) diff --git a/module/programplan/ui/edit.html.php b/module/programplan/ui/edit.html.php index 195582d4fa..aef5381878 100644 --- a/module/programplan/ui/edit.html.php +++ b/module/programplan/ui/edit.html.php @@ -45,6 +45,7 @@ formPanel set::name('parent'), set::items($parentStageList), set::value($plan->parent), + set::disabled($hasUploadedDeliverable), set::required(true), on::change('changeParentStage') ) @@ -95,7 +96,7 @@ formPanel ( setID('attributeType'), setClass('flex self-center w-full'), - $enableOptionalAttr ? picker + $enableOptionalAttr && empty($plan->hasDeliverable) ? picker ( setID('attribute'), set::name('attribute'), diff --git a/module/programplan/zen.php b/module/programplan/zen.php index 6731de2836..98e0e7c8df 100644 --- a/module/programplan/zen.php +++ b/module/programplan/zen.php @@ -200,10 +200,7 @@ class programplanZen extends programplan /* Compute fields for create view. */ list($visibleFields, $requiredFields, $customFields, $showFields, $defaultFields) = $this->computeFieldsCreateView($viewData); - if($viewData->project->model == 'ipd') - { - $this->config->programplan->form->create['attribute']['options'] = $this->lang->stage->ipdTypeList; - } + if($viewData->project->model == 'ipd') $this->config->programplan->form->create['attribute']['options'] = $this->lang->stage->ipdTypeList; $this->view->title = $this->lang->programplan->create . $this->lang->hyphen . $viewData->project->name; $this->view->productList = $viewData->productList; @@ -297,25 +294,31 @@ class programplanZen extends programplan * @access protected * @return void */ - protected function buildEditView(object $plan) + public function buildEditView(object $plan) { $this->loadModel('project'); $this->loadModel('execution'); $this->app->loadLang('stage'); + $project = $this->project->getByID($plan->project); $parentStage = $this->project->getByID($plan->parent, 'stage'); - $this->view->title = $this->lang->programplan->edit; - $this->view->isCreateTask = $this->programplan->isCreateTask($plan->id); - $this->view->plan = $plan; - $this->view->project = $this->project->getByID($plan->project); - $this->view->parentStageList = $this->programplan->getParentStageList($plan->project, $plan->id, $plan->product); - $this->view->enableOptionalAttr = empty($parentStage) || (!empty($parentStage) && $parentStage->attribute == 'mix'); - $this->view->isTopStage = $this->programplan->isTopStage($plan->id); - $this->view->isLeafStage = $this->programplan->checkLeafStage($plan->id); - $this->view->PMUsers = $this->loadModel('user')->getPairs('noclosed|nodeleted|pmfirst', $plan->PM); - $this->view->project = $this->project->getByID($plan->project); - $this->view->requiredFields = $this->config->execution->edit->requiredFields; + $enableOptionalAttr = empty($parentStage) || (!empty($parentStage) && $parentStage->attribute == 'mix'); + if($project->model == 'ipd') $enableOptionalAttr = false; + + $this->view->title = $this->lang->programplan->edit; + $this->view->isCreateTask = $this->programplan->isCreateTask($plan->id); + $this->view->plan = $plan; + $this->view->project = $project; + $this->view->parentStageList = $this->programplan->getParentStageList($plan->project, $plan->id, $plan->product); + $this->view->enableOptionalAttr = $enableOptionalAttr; + $this->view->isTopStage = $this->programplan->isTopStage($plan->id); + $this->view->isLeafStage = $this->programplan->checkLeafStage($plan->id); + $this->view->PMUsers = $this->loadModel('user')->getPairs('noclosed|nodeleted|pmfirst', $plan->PM); + $this->view->project = $this->project->getByID($plan->project); + $this->view->requiredFields = $this->config->execution->edit->requiredFields; + $this->view->hasUploadedDeliverable = in_array($this->config->edition, array('max', 'ipd')) ? $this->execution->hasUploadedDeliverable($plan) : false; + $this->display(); } diff --git a/module/project/config/dtable.php b/module/project/config/dtable.php index 97aff15b75..044546eae1 100755 --- a/module/project/config/dtable.php +++ b/module/project/config/dtable.php @@ -97,6 +97,17 @@ $config->project->dtable->fieldList['invested']['group'] = 5; $config->project->dtable->fieldList['invested']['show'] = true; $config->project->dtable->fieldList['invested']['sortType'] = false; +if(helper::hasFeature('deliverable') && in_array($config->edition, array('max', 'ipd'))) +{ + $config->project->dtable->fieldList['deliverable']['title'] = $lang->project->deliverableAbbr; + $config->project->dtable->fieldList['deliverable']['name'] = 'deliverable'; + $config->project->dtable->fieldList['deliverable']['type'] = 'html'; + $config->project->dtable->fieldList['deliverable']['width'] = '120px'; + $config->project->dtable->fieldList['deliverable']['group'] = 5; + $config->project->dtable->fieldList['deliverable']['show'] = true; + $config->project->dtable->fieldList['deliverable']['sortType'] = false; +} + $config->project->dtable->fieldList['begin']['title'] = $lang->project->begin; $config->project->dtable->fieldList['begin']['name'] = 'begin'; $config->project->dtable->fieldList['begin']['type'] = 'date'; @@ -188,6 +199,17 @@ $config->project->execution->dtable->fieldList['status']['width'] = '80'; $config->project->execution->dtable->fieldList['status']['group'] = '1'; $config->project->execution->dtable->fieldList['status']['show'] = true; +if(helper::hasFeature('deliverable') && in_array($config->edition, array('max', 'ipd'))) +{ + $config->project->execution->dtable->fieldList['deliverable']['title'] = $lang->project->deliverableAbbr; + $config->project->execution->dtable->fieldList['deliverable']['name'] = 'deliverable'; + $config->project->execution->dtable->fieldList['deliverable']['type'] = 'html'; + $config->project->execution->dtable->fieldList['deliverable']['width'] = '100px'; + $config->project->execution->dtable->fieldList['deliverable']['group'] = '1'; + $config->project->execution->dtable->fieldList['deliverable']['show'] = true; + $config->project->execution->dtable->fieldList['deliverable']['sortType'] = false; +} + $config->project->execution->dtable->fieldList['PM']['title'] = $lang->project->PM; $config->project->execution->dtable->fieldList['PM']['name'] = 'PM'; $config->project->execution->dtable->fieldList['PM']['type'] = 'avatarBtn'; diff --git a/module/project/config/form.php b/module/project/config/form.php index 143cfdf679..56bcdab02a 100755 --- a/module/project/config/form.php +++ b/module/project/config/form.php @@ -36,6 +36,7 @@ $config->project->form->edit = $config->project->form->create; $config->project->form->edit['products'] = array('type' => 'array', 'required' => false, 'default' => array()); $config->project->form->edit['branch'] = array('type' => 'array', 'required' => false, 'default' => array()); $config->project->form->edit['plans'] = array('type' => 'array', 'required' => false, 'default' => array()); +$config->project->form->edit['taskDateLimit'] = array('type' => 'string', 'required' => false, 'default' => array()); unset($config->project->form->edit['hasProduct']); unset($config->project->form->edit['stageBy']); unset($config->project->form->edit['multiple']); diff --git a/module/project/control.php b/module/project/control.php index d149e07841..ac679da73a 100755 --- a/module/project/control.php +++ b/module/project/control.php @@ -652,7 +652,10 @@ class project extends control $this->executeHooks($projectID); list($userPairs, $userList) = $this->projectZen->buildUsers(); - if($this->config->edition != 'open') $this->view->workflowGroups = $this->loadModel('workflowgroup')->getPairs('project', $project->model, $project->hasProduct, 'all'); + if($this->config->edition != 'open' && !empty($project->workflowGroup)) + { + $this->view->workflowGroup = $this->loadModel('workflowgroup')->getByID((int)$project->workflowGroup); + } $this->view->title = $this->lang->project->view; $this->view->projectID = $projectID; diff --git a/module/project/js/execution.ui.js b/module/project/js/execution.ui.js index 34c170f9c4..fb34cd5df4 100644 --- a/module/project/js/execution.ui.js +++ b/module/project/js/execution.ui.js @@ -93,7 +93,7 @@ window.onRenderCell = function(result, {col, row}) return result; } if(col.name == 'rawID' && data.parent && !data.isExecution) result.push({className: 'ml-5'}); - if(['estimate', 'consumed', 'left'].includes(col.name) && result) result[0] = data.type == 'point' ? '' : {html: result[0] + ' h'}; + if(['estimate', 'consumed', 'left', 'totalEstimate', 'totalConsumed', 'totalLeft'].includes(col.name) && result && typeof result[0] != 'undefined') result[0] = data.type == 'point' ? '' : {html: result[0] + ' h'}; if(col.name == 'progress' && data.type == 'point') result[0] = ''; return result; diff --git a/module/project/tao.php b/module/project/tao.php index b941368228..3ba79f722f 100755 --- a/module/project/tao.php +++ b/module/project/tao.php @@ -1050,6 +1050,7 @@ class projectTao extends projectModel include $this->app->getModulePath('', 'execution') . 'lang/' . $this->app->getClientLang() . '.php'; + if($projectModel == 'ipd') unset($lang->waterfall->menu->other['dropMenu']->deliverable); $lang->execution->typeList['sprint'] = $executionCommonLang; } elseif($projectModel == 'kanban') diff --git a/module/project/test/model/addplans.php b/module/project/test/model/addplans.php index 7cab569203..5f9e6c3418 100755 --- a/module/project/test/model/addplans.php +++ b/module/project/test/model/addplans.php @@ -8,7 +8,9 @@ zenData('product')->gen(100); zenData('productplan')->gen(100); $storyTable = zenData('story'); $storyTable->status->range('active'); +$storyTable->version->range('1'); $storyTable->gen(100); +zenData('storyspec')->gen(100); zenData('planstory')->gen(100); zenData('projectstory')->gen(0); @@ -20,6 +22,15 @@ title=测试 projectModel::addPlans(); timeout=0 cid=1 +- 将计划1,4,7下的需求关联到项目13,查看关联后的需求数 @16 +- 将计划1,4,7下的需求关联到项目13,查看关联后的需求ID/产品ID + - 第3条的story属性 @4 + - 第3条的product属性 @1 +- 将计划2,5,10,13下的需求关联到项目11,查看关联后的需求数 @8 +- 将计划2,5,10,13下的需求关联到项目11,查看关联后的需求ID/产品ID + - 第0条的story属性 @13 + - 第0条的product属性 @4 + */ $project = new Project(); @@ -32,4 +43,4 @@ r($project->addPlansTest(13, $plan)) && p('3:story,product') && e('4,1'); // 将 $plan = array(); $plan[1] = array(2, 5, 10, 13); r(count($project->addPlansTest(11, $plan))) && p('') && e('8'); // 将计划2,5,10,13下的需求关联到项目11,查看关联后的需求数 -r($project->addPlansTest(11, $plan)) && p('0:story,product') && e('13,4'); // 将计划2,5,10,13下的需求关联到项目11,查看关联后的需求ID/产品ID +r($project->addPlansTest(11, $plan)) && p('0:story,product') && e('13,4'); // 将计划2,5,10,13下的需求关联到项目11,查看关联后的需求ID/产品ID \ No newline at end of file diff --git a/module/project/test/model/batchupdate.php b/module/project/test/model/batchupdate.php index 91824daaf1..4ad7533a3a 100755 --- a/module/project/test/model/batchupdate.php +++ b/module/project/test/model/batchupdate.php @@ -29,6 +29,27 @@ title=测试taskModel->batchUpdate(); timeout=0 cid=1 +- 查看被编辑了的项目数量 @3 +- 查看被编辑了的项目11详情 + - 第1条的name属性 @批量修改项目11 + - 第1条的parent属性 @1 + - 第1条的PM属性 @user10 + - 第1条的begin属性 @2022-02-08 + - 第1条的acl属性 @open +- 查看被编辑了的项目12详情 + - 第2条的name属性 @批量修改项目12 + - 第2条的parent属性 @2 + - 第2条的PM属性 @user11 + - 第2条的begin属性 @2022-03-05 + - 第2条的acl属性 @private +- 查看被编辑了的项目13详情 + - 第3条的name属性 @批量修改项目13 + - 第3条的parent属性 @3 + - 第3条的PM属性 @user13 + - 第3条的begin属性 @2022-02-19 + - 第3条的acl属性 @program +- 异常情况第message[end]条的0属性 @ID4『计划完成』应当大于『2023-02-19』。 + */ $project = new Project(); @@ -40,7 +61,7 @@ $data[1]->parent = 1; $data[1]->PM = 'user10'; $data[1]->begin = '2022-02-08'; $data[1]->end = '2022-04-13'; -$data[1]->day = 10; +$data[1]->days = 10; $data[1]->acl = 'open'; $data[2] = new stdClass(); @@ -49,7 +70,7 @@ $data[2]->parent = 2; $data[2]->PM = 'user11'; $data[2]->begin = '2022-03-05'; $data[2]->end = '2022-04-13'; -$data[2]->day = 10; +$data[2]->days = 10; $data[2]->acl = 'private'; $data[3] = new stdClass(); @@ -58,7 +79,7 @@ $data[3]->parent = 3; $data[3]->PM = 'user13'; $data[3]->begin = '2022-02-19'; $data[3]->end = '2022-04-13'; -$data[3]->day = 14; +$data[3]->days = 14; $data[3]->acl = 'program'; $projects = $project->batchUpdate($data); @@ -79,4 +100,4 @@ $data[4]->day = 14; $data[4]->acl = 'program'; $projects = $project->batchUpdate($data); -r($projects) && p('message[end]:0') && e('ID4『计划完成』应当大于『2023-02-19』。'); // 异常情况 +r($projects) && p('message[end]:0') && e('ID4『计划完成』应当大于『2023-02-19』。'); // 异常情况 \ No newline at end of file diff --git a/module/project/test/model/getdisabledproducts.php b/module/project/test/model/getdisabledproducts.php index 2fd5c5cb4a..aa45dc5eb8 100644 --- a/module/project/test/model/getdisabledproducts.php +++ b/module/project/test/model/getdisabledproducts.php @@ -9,6 +9,13 @@ title=测试 projectModel->getDisabledProducts(); timeout=0 cid=1 +- 测试获取敏捷项目不可修改产品 @0 +- 测试获取以产品创建的瀑布项目不可修改产品属性2 @项目已经关联了该产品中的研发需求,不能取消关联,您可以取消关联研发需求后再操作。 +- 测试获取以产品创建的瀑布项目不可修改产品属性3 @该产品已经创建了阶段,如需解除与项目的关联,请删除已创建的阶段后再操作。 +- 测试获取以产品创建的瀑布项目不可修改产品属性4 @该产品已经创建了阶段并关联了研发需求,如需解除与项目的关联,请先解除研发需求的关联关系,然后删除已创建的阶段后再操作。 +- 测试获取以项目创建的瀑布项目不可修改产品属性5 @该产品的研发需求已经关联到了项目和执行中,请先解除研发需求与项目和执行的关联后再操作。 +- 测试获取以项目创建的瀑布项目不可修改产品属性6 @项目已经关联了该产品中的研发需求,不能取消关联,您可以取消关联研发需求后再操作。 + */ zenData('project')->loadYaml('project')->gen(10); @@ -24,4 +31,4 @@ r($projectTester->getDisabledProductsTest($projectIdList[1])) && p('2') && e(' r($projectTester->getDisabledProductsTest($projectIdList[2])) && p('3') && e('该产品已经创建了阶段,如需解除与项目的关联,请删除已创建的阶段后再操作。'); // 测试获取以产品创建的瀑布项目不可修改产品 r($projectTester->getDisabledProductsTest($projectIdList[3])) && p('4') && e('该产品已经创建了阶段并关联了研发需求,如需解除与项目的关联,请先解除研发需求的关联关系,然后删除已创建的阶段后再操作。'); // 测试获取以产品创建的瀑布项目不可修改产品 r($projectTester->getDisabledProductsTest($projectIdList[4])) && p('5') && e('该产品的研发需求已经关联到了项目和执行中,请先解除研发需求与项目和执行的关联后再操作。'); // 测试获取以项目创建的瀑布项目不可修改产品 -r($projectTester->getDisabledProductsTest($projectIdList[5])) && p('6') && e('项目已经关联了该产品中的研发需求,不能取消关联,您可以取消关联研发需求后再操作。'); // 测试获取以项目创建的瀑布项目不可修改产品 +r($projectTester->getDisabledProductsTest($projectIdList[5])) && p('6') && e('项目已经关联了该产品中的研发需求,不能取消关联,您可以取消关联研发需求后再操作。'); // 测试获取以项目创建的瀑布项目不可修改产品 \ No newline at end of file diff --git a/module/project/test/model/yaml/getdisabledproducts/project.yaml b/module/project/test/model/yaml/getdisabledproducts/project.yaml index 2cf2a1d34d..f1aaef5293 100644 --- a/module/project/test/model/yaml/getdisabledproducts/project.yaml +++ b/module/project/test/model/yaml/getdisabledproducts/project.yaml @@ -7,7 +7,7 @@ fields: - field: type range: project{6},stage{6} - field: stageBy - range: "product{4},project{2},[]{6}" + range: "product{4},project{2}" - field: project range: '0{6},3{2},4,5' - field: model diff --git a/module/project/test/tao/setmenubymodel.php b/module/project/test/tao/setmenubymodel.php index 37648e686f..391d2b8b4d 100644 --- a/module/project/test/tao/setmenubymodel.php +++ b/module/project/test/tao/setmenubymodel.php @@ -9,8 +9,16 @@ su('admin'); /** title=测试 projectModel::setMenuByModel(); +timeout=0 cid=1 -pid=1 + +- 项目不存在的情况 @迭代 +- 项目不存在的情况 @迭代 +- 敏捷项目 @迭代 +- 融合敏捷项目 @迭代 +- 融合瀑布项目 @阶段 +- 瀑布项目 @阶段 +- 看板项目 @项目看板 */ @@ -22,4 +30,4 @@ r($projectTester->setMenuByModelTest('scrum')) && p() && e('迭代'); r($projectTester->setMenuByModelTest('agileplus')) && p() && e('迭代'); // 融合敏捷项目 r($projectTester->setMenuByModelTest('waterfall')) && p() && e('阶段'); // 融合瀑布项目 r($projectTester->setMenuByModelTest('waterfallplus')) && p() && e('阶段'); // 瀑布项目 -r($projectTester->setMenuByModelTest('kanban')) && p() && e('项目看板'); // 看板项目 +r($projectTester->setMenuByModelTest('kanban')) && p() && e('项目看板'); // 看板项目 \ No newline at end of file diff --git a/module/project/ui/browsebycard.html.php b/module/project/ui/browsebycard.html.php index 67456d5ae4..e2b28d4efa 100644 --- a/module/project/ui/browsebycard.html.php +++ b/module/project/ui/browsebycard.html.php @@ -44,7 +44,7 @@ featureBar set::text($lang->project->mine), set::checked($this->cookie->involved ? 'checked' : '') ), - li(searchToggle(set::module('project'))) + li(searchToggle(set::module('project'), set::open($browseType == 'bysearch'))) ); /* zin: Define the toolbar on main menu. */ diff --git a/module/project/ui/browsebylist.html.php b/module/project/ui/browsebylist.html.php index f2ea2480d0..5d64b2314e 100644 --- a/module/project/ui/browsebylist.html.php +++ b/module/project/ui/browsebylist.html.php @@ -25,7 +25,7 @@ featureBar set::text($lang->project->mine), set::checked($this->cookie->involved ? 'checked' : '') ), - li(searchToggle(set::module('project'))) + li(searchToggle(set::module('project'), set::open($browseType == 'bysearch'))) ); /* zin: Define the toolbar on main menu. */ diff --git a/module/project/ui/view.html.php b/module/project/ui/view.html.php index ee38c06624..e3e719c0ed 100644 --- a/module/project/ui/view.html.php +++ b/module/project/ui/view.html.php @@ -277,12 +277,12 @@ row ( setClass('flex mt-4 program'), $programDom ? div(setClass('clip programBox w-1/2'), $programDom) : null, - $config->edition != 'open' && $project->workflowGroup ? div + $config->edition != 'open' && !empty($project->workflowGroup) ? div ( setClass('clip w-1/2'), set::title($lang->project->workflowGroup), icon('flow', setClass('pr-1')), - zget($workflowGroups, $project->workflowGroup) + $workflowGroup->name ) : null ), div diff --git a/module/project/zen.php b/module/project/zen.php index ec118dcc37..2cd37c4278 100755 --- a/module/project/zen.php +++ b/module/project/zen.php @@ -330,7 +330,8 @@ class projectZen extends project if($this->config->edition != 'open') { $workflowGroups = $this->loadModel('workflowgroup')->getPairs('project', $model, $hasProduct, 'normal', '0'); - $this->view->workflowGroups = $this->workflowgroup->appendBuildinLabel($workflowGroups); + $this->view->workflowGroupPairs = $workflowGroups; + $this->view->workflowGroups = $this->workflowgroup->appendBuildinLabel($workflowGroups); } /* Get copy projects. */ @@ -478,12 +479,18 @@ class projectZen extends project $this->view->availableBudget = $parentProject ? $this->program->getBudgetLeft($parentProject) + (float)$project->budget : $project->budget; $this->view->budgetUnitList = $this->project->getBudgetUnitList(); $this->view->model = $project->model; - $this->view->disableModel = $this->project->checkCanChangeModel($projectID, $project->model) ? '' : 'disabled'; + $this->view->disableModel = $this->project->checkCanChangeModel($projectID, $project->model) ? false : true; $this->view->teamMembers = $this->user->getTeamMemberPairs($projectID, 'project'); $this->view->from = $from; $this->view->programID = $programID; $this->view->disableParent = $disableParent; $this->view->groups = $this->loadModel('group')->getPairs(); + + if(in_array($this->config->edition, array('max', 'ipd')) && $this->project->checkUploadedDeliverable($project)) + { + $this->view->disableModel = true; + } + $this->display(); } @@ -1393,6 +1400,12 @@ class projectZen extends project $project->estimate = helper::formatHours($project->estimate); $project->consume = helper::formatHours($project->consume); $project->left = helper::formatHours($project->left); + + /* 交付物提交进度。 */ + if(in_array($this->config->edition, array('max', 'ipd'))) + { + $project->deliverable = $this->project->countDeliverable($project); + } } return array_values($projectList); diff --git a/module/repo/css/ajaxgeteditorcontent.ui.css b/module/repo/css/ajaxgeteditorcontent.ui.css index 7f49d6ba58..faf9fbd61a 100644 --- a/module/repo/css/ajaxgeteditorcontent.ui.css +++ b/module/repo/css/ajaxgeteditorcontent.ui.css @@ -37,8 +37,8 @@ #related .nav-item {gap: 0;} .nav-tabs>li>a.active {font-weight: 700;color: #313c52!important} #relationTabs .tab-content{overflow: auto;} -.repoCode .view-line-icon {position: absolute; right: 50px; top: 2px; font-weight: bold; cursor: pointer;background-color: white;padding: 1px 8px} -.repoCode .view-line-icon.add-bug {left: 5px;} +.repoCode .view-line-icon {position: absolute; top: 2px; font-weight: bold; cursor: pointer;background-color: white;padding: 1px 8px} +.repoCode .view-line-icon.add-bug {left: 10px;} .repoCode .view-line-icon.add-bug .icon {font-weight: bold;} .repoCode .view-line-icon .bug-count {vertical-align: middle; padding-left: 5px;} .repoCode #bugForm {margin: 0; padding: 10px 20px 10px 0;} diff --git a/module/search/ui/buildform.html.php b/module/search/ui/buildform.html.php index f299dbe961..0c98e39247 100644 --- a/module/search/ui/buildform.html.php +++ b/module/search/ui/buildform.html.php @@ -16,8 +16,10 @@ foreach($fieldParams as $name => $param) $condition->name = $name; $condition->control = $param['control']; $condition->defaultOperator = $param['operator']; - if(isset($config->search->controlProps[$module][$name])) $condition->controlProps = $config->search->controlProps[$module][$name]; $condition->placeholder = ''; + $condition->controlProps = isset($config->search->controlProps[$module][$name]) ? (array)$config->search->controlProps[$module][$name] : array(); + if($condition->control == 'select' && !isset($condition->controlProps['maxItemsCount'])) $condition->controlProps['maxItemsCount'] = 200; + if(isset($param['class']) && in_array('date', explode(' ', $param['class']))) { diff --git a/module/sonarqube/control.php b/module/sonarqube/control.php index 799938d50d..26cb07e32e 100644 --- a/module/sonarqube/control.php +++ b/module/sonarqube/control.php @@ -376,7 +376,7 @@ class sonarqube extends control */ public function browseIssue(int $sonarqubeID, string $projectKey = '', bool $search = false, string $orderBy = 'severity_desc', int $recPerPage = 100, int $pageID = 1) { - $projectKey = str_replace('*', '-', $projectKey); + $projectKey = helper::safe64Decode(urldecode($projectKey)); if(isset($_POST['keyword'])) { $keyword = htmlspecialchars(trim($_POST['keyword'])); diff --git a/module/sonarqube/js/browseproject.ui.js b/module/sonarqube/js/browseproject.ui.js index 1e0c7d8fec..39030115b0 100644 --- a/module/sonarqube/js/browseproject.ui.js +++ b/module/sonarqube/js/browseproject.ui.js @@ -1,4 +1,4 @@ -function search() +window.searchProject = function() { loadPage({method:'post', data: {keyword: $('#keyword').val()}, target: '#table-sonarqube-browseproject>*'}); } diff --git a/module/sonarqube/ui/browseissue.html.php b/module/sonarqube/ui/browseissue.html.php index d011155071..3b407efc18 100644 --- a/module/sonarqube/ui/browseissue.html.php +++ b/module/sonarqube/ui/browseissue.html.php @@ -12,7 +12,7 @@ declare(strict_types=1); namespace zin; -$replaceKey = str_replace('-', '*', $projectKey); +$replaceKey = urlencode(helper::safe64Encode($projectKey)); $issueList = array(); foreach($sonarqubeIssueList as $issue) { diff --git a/module/sonarqube/ui/browseproject.html.php b/module/sonarqube/ui/browseproject.html.php index 458a214338..eb5adfad10 100644 --- a/module/sonarqube/ui/browseproject.html.php +++ b/module/sonarqube/ui/browseproject.html.php @@ -38,6 +38,7 @@ featureBar ), form ( + set::ajax(array('beforeSubmit' => jsRaw('() => {window.searchProject(); return false;}'))), setID('searchForm'), setClass('ml-4'), set::actions(array()), @@ -53,7 +54,7 @@ featureBar ( setClass('primary'), $lang->sonarqube->search, - on::click('search') + on::click('searchProject') ) ) ) diff --git a/module/sonarqube/ui/reportview.html.php b/module/sonarqube/ui/reportview.html.php index 7e7fbf0a9a..43bf57dde8 100644 --- a/module/sonarqube/ui/reportview.html.php +++ b/module/sonarqube/ui/reportview.html.php @@ -30,7 +30,7 @@ div setClass('text-md font-bold'), set('data-close-modal', true), $projectName, - $qualitygate && hasPriv('instance', 'manage') ? set::href(createLink('sonarqube', 'browseIssue', "sonarqubeID={$sonarqubeID}&project=" . str_replace('-', '*', $projectKey))) : null + $qualitygate && hasPriv('instance', 'manage') ? set::href(createLink('sonarqube', 'browseIssue', "sonarqubeID={$sonarqubeID}&project=" . urlencode(helper::safe64Encode($projectKey)))) : null ), label ( diff --git a/module/story/lang/de.php b/module/story/lang/de.php index 4aae120834..715f1c7780 100644 --- a/module/story/lang/de.php +++ b/module/story/lang/de.php @@ -18,6 +18,7 @@ $lang->story->createStory = 'Create ' . $lang->story->story; $lang->story->createRequirement = 'Create ' . $lang->story->requirement; $lang->story->affectedStories = "Affected {$lang->story->story}"; +$lang->story->browse = "{$lang->SRCommon} List"; $lang->story->batchCreate = "Mehere hinzufügen"; $lang->story->change = "Ändern"; $lang->story->changed = 'Geändert'; diff --git a/module/story/lang/en.php b/module/story/lang/en.php index 58e543813c..58c8f29eec 100644 --- a/module/story/lang/en.php +++ b/module/story/lang/en.php @@ -18,6 +18,7 @@ $lang->story->createStory = 'Create ' . $lang->story->story; $lang->story->createRequirement = 'Create ' . $lang->story->requirement; $lang->story->affectedStories = "Affected {$lang->story->story}"; +$lang->story->browse = "{$lang->SRCommon} List"; $lang->story->batchCreate = "Batch Create"; $lang->story->change = "Change"; $lang->story->changed = 'Change'; diff --git a/module/story/lang/fr.php b/module/story/lang/fr.php index df707ddfde..664d5ad42b 100644 --- a/module/story/lang/fr.php +++ b/module/story/lang/fr.php @@ -18,6 +18,7 @@ $lang->story->createStory = 'Create ' . $lang->story->story; $lang->story->createRequirement = 'Create ' . $lang->story->requirement; $lang->story->affectedStories = "Affected {$lang->story->story}"; +$lang->story->browse = "{$lang->SRCommon} List"; $lang->story->batchCreate = "Créer par Lot"; $lang->story->change = "Changer"; $lang->story->changed = 'Changée'; diff --git a/module/story/lang/zh-cn.php b/module/story/lang/zh-cn.php index 3727d87cd6..753bb04682 100644 --- a/module/story/lang/zh-cn.php +++ b/module/story/lang/zh-cn.php @@ -18,6 +18,7 @@ $lang->story->createStory = '添加' . $lang->story->story; $lang->story->createRequirement = '添加' . $lang->story->requirement; $lang->story->affectedStories = "影响的{$lang->story->story}"; +$lang->story->browse = "{$lang->SRCommon}列表"; $lang->story->batchCreate = "批量创建"; $lang->story->change = "变更"; $lang->story->changed = "{$lang->SRCommon}变更"; diff --git a/module/story/model.php b/module/story/model.php index f8cfbda8f7..5d98009f0b 100644 --- a/module/story/model.php +++ b/module/story/model.php @@ -935,7 +935,19 @@ class storyModel extends model $this->action->logHistory($actionID, $changes); if(isset($story->finalResult)) { - $action = $story->finalResult == 'clarify' ? 'ReviewClarified' : 'review' . $story->finalResult . 'ed'; + if($story->finalResult == 'clarify') + { + $action = 'reviewclarified'; + } + elseif($story->finalResult == 'active') + { + $action = 'reviewpassed'; + } + else + { + $action = 'review' . $story->finalResult . 'ed'; + } + $this->action->create('story', $storyID, $action, '', "{$story->finalResult}|$oldStatus"); } } @@ -1759,18 +1771,18 @@ class storyModel extends model $allChanges[$storyID] = common::createChanges($oldStory, $story); if($story->plan != $oldStory->plan and !empty($oldStory->plan) and $oldStory->type == 'story') { - foreach(explode(',', (string)$oldStory->plan) as $planID) + foreach(explode(',', (string)$oldStory->plan) as $oldPlanID) { - if(!$planID) continue; - $unlinkPlans[$planID] = empty($unlinkPlans[$planID]) ? $storyID : "{$unlinkPlans[$planID]},$storyID"; + if(!$oldPlanID) continue; + $unlinkPlans[$oldPlanID] = empty($unlinkPlans[$oldPlanID]) ? $storyID : "{$unlinkPlans[$oldPlanID]},$storyID"; } } if($story->plan != $oldStory->plan and !empty($story->plan)) { - foreach(explode(',', (string)$story->plan) as $planID) + foreach(explode(',', (string)$story->plan) as $newPlanID) { - if(!$planID) continue; - $link2Plans[$planID] = empty($link2Plans[$planID]) ? $storyID : "{$link2Plans[$planID]},$storyID"; + if(!$newPlanID) continue; + $link2Plans[$newPlanID] = empty($link2Plans[$newPlanID]) ? $storyID : "{$link2Plans[$newPlanID]},$storyID"; } } } diff --git a/module/story/test/model/batchchangeplan.php b/module/story/test/model/batchchangeplan.php index fb1ad44615..772ec505ee 100755 --- a/module/story/test/model/batchchangeplan.php +++ b/module/story/test/model/batchchangeplan.php @@ -8,18 +8,18 @@ timeout=0 cid=0 - 批量修改6个需求的计划,查看被修改计划的需求数量 @4 -- 批量修改6个需求的计划,查看被修改计划的需求数量 @3 +- 批量修改6个需求的计划,查看被修改计划的需求数量 @4 - 批量修改6个需求的计划,查看需求1修改后的计划ID第1条的plan属性 @10 - 批量修改6个需求的计划,查看需求2修改后的计划ID第2条的plan属性 @10 - 批量修改6个需求的计划,查看需求4修改后的计划ID第4条的plan属性 @2,10 - 批量修改6个需求的计划,查看需求5修改后的计划ID第5条的plan属性 @10 - 批量修改6个需求的计划,查看需求1修改后的计划ID第1条的plan属性 @10,9 - 批量修改6个需求的计划,查看需求2修改后的计划ID第2条的plan属性 @9 -- 批量修改6个需求的计划,查看需求4修改后的计划ID第4条的plan属性 @2,10 +- 批量修改6个需求的计划,查看需求4修改后的计划ID第4条的plan属性 @2,9 - 批量修改6个需求的计划,查看需求1修改后的计划ID第1条的plan属性 @10,9,5 - 批量修改6个需求的计划,查看需求2修改后的计划ID第2条的plan属性 @5 -- 批量修改6个需求的计划,查看需求4修改后的计划ID第4条的plan属性 @2,10,5 -- 批量修改6个需求的计划,查看需求5修改后的计划ID第5条的plan属性 @10,5 +- 批量修改6个需求的计划,查看需求4修改后的计划ID第4条的plan属性 @2,5 +- 批量修改6个需求的计划,查看需求5修改后的计划ID第5条的plan属性 @10,9,5 */ include dirname(__FILE__, 5) . '/test/lib/init.php'; @@ -51,15 +51,15 @@ $stories2 = $story->batchChangePlanTest($storyIdList, 9); $stories3 = $story->batchChangePlanTest($storyIdList, 5, 9); r(count($stories1)) && p() && e('4'); // 批量修改6个需求的计划,查看被修改计划的需求数量 -r(count($stories2)) && p() && e('3'); // 批量修改6个需求的计划,查看被修改计划的需求数量 +r(count($stories2)) && p() && e('4'); // 批量修改6个需求的计划,查看被修改计划的需求数量 r($stories1) && p('1:plan') && e('10'); // 批量修改6个需求的计划,查看需求1修改后的计划ID r($stories1) && p('2:plan') && e('10'); // 批量修改6个需求的计划,查看需求2修改后的计划ID r($stories1) && p('4:plan', '|') && e('2,10'); // 批量修改6个需求的计划,查看需求4修改后的计划ID r($stories1) && p('5:plan') && e('10'); // 批量修改6个需求的计划,查看需求5修改后的计划ID r($stories2) && p('1:plan', '|') && e('10,9'); // 批量修改6个需求的计划,查看需求1修改后的计划ID r($stories2) && p('2:plan') && e('9'); // 批量修改6个需求的计划,查看需求2修改后的计划ID -r($stories2) && p('4:plan', '|') && e('2,10'); // 批量修改6个需求的计划,查看需求4修改后的计划ID +r($stories2) && p('4:plan', '|') && e('2,9'); // 批量修改6个需求的计划,查看需求4修改后的计划ID r($stories3) && p('1:plan', '|') && e('10,9,5'); // 批量修改6个需求的计划,查看需求1修改后的计划ID r($stories3) && p('2:plan') && e('5'); // 批量修改6个需求的计划,查看需求2修改后的计划ID -r($stories3) && p('4:plan', '|') && e('2,10,5'); // 批量修改6个需求的计划,查看需求4修改后的计划ID -r($stories3) && p('5:plan', '|') && e('10,5'); // 批量修改6个需求的计划,查看需求5修改后的计划ID \ No newline at end of file +r($stories3) && p('4:plan', '|') && e('2,5'); // 批量修改6个需求的计划,查看需求4修改后的计划ID +r($stories3) && p('5:plan', '|') && e('10,9,5'); // 批量修改6个需求的计划,查看需求5修改后的计划ID \ No newline at end of file diff --git a/module/story/ui/batchtotask.html.php b/module/story/ui/batchtotask.html.php index ec81bfdb5a..cb161d1421 100644 --- a/module/story/ui/batchtotask.html.php +++ b/module/story/ui/batchtotask.html.php @@ -28,10 +28,10 @@ $fields['story'] = array_merge(array('name' => 'story', 'label' => $la $fields['name'] = array_merge(array('name' => 'name', 'label' => $lang->task->name, 'width' => '250px', 'ditto' => false, 'defaultDitto' => 'off', 'filter' => 'trim', 'control' => 'text'), $config->task->form->batchcreate['name']); $fields['type'] = array_merge(array('name' => 'type', 'label' => $lang->typeAB, 'width' => '140px', 'ditto' => true, 'defaultDitto' => 'off', 'items' => $lang->task->typeList, 'control' => 'picker'), $config->task->form->batchcreate['type']); $fields['assignedTo'] = array_merge(array('name' => 'assignedTo', 'label' => $lang->task->assignedTo, 'width' => '128px', 'ditto' => false, 'defaultDitto' => 'off', 'items' => $members, 'control' => array('control' => 'taskAssignedTo', 'manageLink' => ($manageLink ? $manageLink : ''))), $config->task->form->batchcreate['assignedTo']); -$fields['estimate'] = array_merge(array('name' => 'estimate', 'label' => $lang->task->estimateAB, 'width' => '120px', 'ditto' => true, 'defaultDitto' => 'on', 'filter' => 'trim', 'control' => 'text'), $config->task->form->batchcreate['estimate']); +$fields['estimate'] = array_merge(array('name' => 'estimate', 'label' => $lang->task->estimateAB, 'width' => '120px', 'ditto' => true, 'defaultDitto' => 'off', 'filter' => 'trim', 'control' => 'text'), $config->task->form->batchcreate['estimate']); $fields['estStarted'] = array_merge(array('name' => 'estStarted', 'label' => $lang->task->estStarted, 'width' => '120px', 'ditto' => true, 'defaultDitto' => 'on', 'filter' => 'trim', 'control' => 'date'), $config->task->form->batchcreate['estStarted']); $fields['deadline'] = array_merge(array('name' => 'deadline', 'label' => $lang->task->deadline, 'width' => '120px', 'ditto' => true, 'defaultDitto' => 'on', 'filter' => 'trim', 'control' => 'date'), $config->task->form->batchcreate['deadline']); -$fields['pri'] = array_merge(array('name' => 'pri', 'label' => $lang->task->pri, 'width' => '110px', 'ditto' => true, 'defaultDitto' => 'on', 'items' => $lang->task->priList, 'control' => 'priPicker'), $config->task->form->batchcreate['pri']); +$fields['pri'] = array_merge(array('name' => 'pri', 'label' => $lang->task->pri, 'width' => '110px', 'ditto' => true, 'defaultDitto' => 'off', 'items' => $lang->task->priList, 'control' => 'priPicker'), $config->task->form->batchcreate['pri']); $data = array(); foreach($stories as $storyID => $story) diff --git a/module/story/ui/change.html.php b/module/story/ui/change.html.php index bb759547dc..c31db507f1 100644 --- a/module/story/ui/change.html.php +++ b/module/story/ui/change.html.php @@ -191,7 +191,7 @@ detailBody ( array('text' => $lang->save, 'data-status' => 'active', 'class' => 'primary', 'btnType' => 'submit'), array('text' => $lang->story->doNotSubmit, 'data-status' => 'draft', 'class' => 'secondary', 'btnType' => 'submit'), - array('text' => $lang->goback, 'data-back' => 'APP', 'class' => 'open-url') + isInModal() ? null : array('text' => $lang->goback, 'data-back' => 'APP', 'class' => 'open-url') )), sectionList($formItems), h::hr(), diff --git a/module/story/ui/edit.html.php b/module/story/ui/edit.html.php index ccf24c8f39..09f33d0351 100644 --- a/module/story/ui/edit.html.php +++ b/module/story/ui/edit.html.php @@ -197,6 +197,7 @@ detailBody ), section ( + setID('comment'), set::title($lang->story->comment), formGroup(editor(set::name('comment'), set::uid($uid))) ) diff --git a/module/system/control.php b/module/system/control.php index d00c41dd94..703ff319b9 100644 --- a/module/system/control.php +++ b/module/system/control.php @@ -43,10 +43,11 @@ class system extends control $actions = $this->loadModel('action')->getDynamic('all', 'today'); - $this->view->title = $this->lang->my->common; - $this->view->instances = $instances; - $this->view->actions = $actions; - $this->view->pager = $pager; + $this->view->title = $this->lang->my->common; + $this->view->instances = $instances; + $this->view->actions = $actions; + $this->view->pager = $pager; + $this->view->instanceTotal = $this->instance->getInstanceCount(); $this->display(); } @@ -715,10 +716,12 @@ class system extends control { $cneMetrics = $this->loadModel('cne')->cneMetrics(); $result = array( - 'status' => $cneMetrics->status, - 'node_count' => $cneMetrics->node_count, - 'cpuInfo' => $this->systemZen->getCpuUsage($cneMetrics->metrics->cpu), - 'memoryInfo' => $this->systemZen->getMemUsage($cneMetrics->metrics->memory) + 'status' => $cneMetrics->status, + 'node_count' => $cneMetrics->node_count, + 'ready_count' => zget($cneMetrics, 'ready_count', 0), + 'nodeError' => zget($cneMetrics, 'nodeError', ''), + 'cpuInfo' => $this->systemZen->getCpuUsage($cneMetrics->metrics->cpu), + 'memoryInfo' => $this->systemZen->getMemUsage($cneMetrics->metrics->memory) ); return $this->send(array('result' => 'success', 'data' => $result)); } diff --git a/module/system/js/dashboard.ui.js b/module/system/js/dashboard.ui.js index 949a16a1fc..f5420df8ae 100644 --- a/module/system/js/dashboard.ui.js +++ b/module/system/js/dashboard.ui.js @@ -87,7 +87,17 @@ function loadCneStatistic() memoryCircle = new zui.ProgressCircle('#memory-circle', {percent: 0, size: 160, circleColor: memoryInfo.color, circleWidth: 8, text: ''}); $('#status-icon').replaceWith(''); $('#cne-statistic .cne-status').text(statusList[res.data.status]); - $('#cne-statistic .node-quantity').text(res.data.node_count); + const nodeQuantity = res.data.node_count == res.data.ready_count ? res.data.ready_count : res.data.ready_count + '/' + res.data.node_count; + $('#cne-statistic .node-quantity').text(nodeQuantity); + const nodeError = res.data.nodeError; + if(!nodeError) + { + $('#cne-statistic .node-quantity-help').addClass('hidden'); + } + else + { + $('#cne-statistic .node-quantity-help').removeClass('hidden').attr('title', nodeError); + } $('#cne-statistic .icon-cpu').css('color' , cpuInfo.color); $('#cne-statistic .icon-memory').css('color' , memoryInfo.color); $('.cpu-rate').html(cpuInfo.rate + '%'); diff --git a/module/system/lang/de.php b/module/system/lang/de.php index 04a4a5b2cc..b5e089115c 100644 --- a/module/system/lang/de.php +++ b/module/system/lang/de.php @@ -304,3 +304,6 @@ $lang->system->platform->navs['ossview'] = 'OSS'; $lang->system->runningStatus['normal'] = 'Normal'; $lang->system->runningStatus['error'] = 'Error'; + +$lang->system->serviceNotice = 'Only the store app are supported.'; +$lang->system->nodeNotice = 'Node(%s) exception reason: %s'; diff --git a/module/system/lang/en.php b/module/system/lang/en.php index 04a4a5b2cc..b5e089115c 100644 --- a/module/system/lang/en.php +++ b/module/system/lang/en.php @@ -304,3 +304,6 @@ $lang->system->platform->navs['ossview'] = 'OSS'; $lang->system->runningStatus['normal'] = 'Normal'; $lang->system->runningStatus['error'] = 'Error'; + +$lang->system->serviceNotice = 'Only the store app are supported.'; +$lang->system->nodeNotice = 'Node(%s) exception reason: %s'; diff --git a/module/system/lang/fr.php b/module/system/lang/fr.php index 04a4a5b2cc..b5e089115c 100644 --- a/module/system/lang/fr.php +++ b/module/system/lang/fr.php @@ -304,3 +304,6 @@ $lang->system->platform->navs['ossview'] = 'OSS'; $lang->system->runningStatus['normal'] = 'Normal'; $lang->system->runningStatus['error'] = 'Error'; + +$lang->system->serviceNotice = 'Only the store app are supported.'; +$lang->system->nodeNotice = 'Node(%s) exception reason: %s'; diff --git a/module/system/lang/zh-cn.php b/module/system/lang/zh-cn.php index 61005056bc..fa3ec7821a 100644 --- a/module/system/lang/zh-cn.php +++ b/module/system/lang/zh-cn.php @@ -304,3 +304,6 @@ $lang->system->platform->navs['ossview'] = '对象存储'; $lang->system->runningStatus['normal'] = '正常'; $lang->system->runningStatus['error'] = '异常'; + +$lang->system->serviceNotice = '仅统计应用市场安装的服务,手工配置的服务不在统计范围内。'; +$lang->system->nodeNotice = '节点(%s) 异常原因:%s'; diff --git a/module/system/ui/dashboard.html.php b/module/system/ui/dashboard.html.php index 7ecebb1ab4..80998c2d13 100644 --- a/module/system/ui/dashboard.html.php +++ b/module/system/ui/dashboard.html.php @@ -59,13 +59,25 @@ div ( setClass('flex col justify-between'), div(setClass('text-4xl font-semibold text-primary node-quantity'), 0), - $lang->system->nodeQuantity + span + ( + $lang->system->nodeQuantity, + icon('help node-quantity-help ml-1 text-gray-500 cursor-pointer') + ) ), div ( setClass('flex col justify-between'), - div(setClass('text-4xl font-semibold text-primary'), zget($pageInfo, 'recTotal', 0)), - $lang->system->serviceQuantity + div + ( + setClass('text-4xl font-semibold text-primary'), + zget($pageInfo, 'recTotal', 0) == $instanceTotal ? $instanceTotal : zget($pageInfo, 'recTotal', 0) . '/' . $instanceTotal + ), + span + ( + $lang->system->serviceQuantity, + icon('help ml-1 text-gray-500 cursor-pointer', set::title($lang->system->serviceNotice)) + ) ) ) ) @@ -150,4 +162,4 @@ div set::onRenderCell(jsRaw('window.renderInstanceList')), set::footPager(usePager()) ) -); \ No newline at end of file +); diff --git a/module/task/js/batchedit.ui.js b/module/task/js/batchedit.ui.js index 8c08ad6d95..6074247c84 100644 --- a/module/task/js/batchedit.ui.js +++ b/module/task/js/batchedit.ui.js @@ -39,11 +39,21 @@ window.renderRowData = function($row, index, row) const parentTask = parentTasks[row.parent]; $row.find('[id^="estStarted"]').on('inited', function(e, info) { - if(parentTask.estStarted == '') info[0].render({disabled: true}); + if(parentTask.estStarted == '') + { + row.estStarted = ''; + if(parentTasks[row.id] != undefined) parentTasks[row.id].estStarted = ''; + info[0].render({readonly: true}); + } }); $row.find('[id^="deadline"]').on('inited', function(e, info) { - if(parentTask.deadline == '') info[0].render({disabled: true}); + if(parentTask.deadline == '') + { + row.deadline = ''; + if(parentTasks[row.id] != undefined) parentTasks[row.id].deadline = ''; + info[0].render({readonly: true}); + } }); } @@ -196,14 +206,16 @@ function checkBatchEstStartedAndDeadline(event) $estStartedTd.find('.date-tip').remove(); const $childrenEstStarted = $(event.target).closest('tbody').find('tr[data-parent="' + taskID + '"]').find('[name^=estStarted]'); + $childrenEstStarted.each(function() { let $childDatePicker = $(this).zui('datePicker'); - $childDatePicker.render({disabled: estStarted.length == 0}); + $childDatePicker.render({readonly: estStarted.length == 0}); if(estStarted.length == 0) $childDatePicker.$.setValue(''); checkBatchEstStartedAndDeadline({target: this}); }); + if(estStarted.length > 0) { let $datetip = $('
'); @@ -233,11 +245,12 @@ function checkBatchEstStartedAndDeadline(event) $childrenDeadline.each(function() { let $childDatePicker = $(this).zui('datePicker'); - $childDatePicker.render({disabled: deadline.length == 0}); + $childDatePicker.render({readonly: deadline.length == 0}); if(deadline.length == 0) $childDatePicker.$.setValue(''); checkBatchEstStartedAndDeadline({target: this}); }); + if(deadline.length > 0) { let $datetip = $('
'); diff --git a/module/task/js/create.ui.js b/module/task/js/create.ui.js index ea654a9118..ba757f59a4 100644 --- a/module/task/js/create.ui.js +++ b/module/task/js/create.ui.js @@ -17,6 +17,8 @@ function toggleTeam() $assignedToBox.find('.picker-box').addClass('hidden'); $assignedToBox.find('.assignedToList').removeClass('hidden'); $('input[name=estimate]').attr('disabled', true); + $('[name=parent]').zui('picker').$.setValue(''); + $('[name=parent]').zui('picker').render({disabled: true}); } else { @@ -24,6 +26,7 @@ function toggleTeam() $assignedToBox.find('.picker-box').removeClass('hidden'); $assignedToBox.find('.assignedToList').addClass('hidden'); $('input[name=estimate]').removeAttr('disabled'); + $('[name=parent]').zui('picker').render({disabled: false}); } } diff --git a/module/task/js/edit.ui.js b/module/task/js/edit.ui.js index cd7ae4ed1e..351accb6fa 100644 --- a/module/task/js/edit.ui.js +++ b/module/task/js/edit.ui.js @@ -125,9 +125,12 @@ window.changeMode = function() $('.team-group').removeClass('hidden'); $('#estimate').attr('readonly', 'readonly'); $('#left').attr('readonly', 'readonly'); + $('[name=parent]').zui('picker').$.setValue(''); + $('[name=parent]').zui('picker').render({disabled: true}); } else { + $('[name=parent]').zui('picker').render({disabled: false}); $('#assignedTo').picker({disabled: false}); $('.team-group').addClass('hidden'); $('#estimate').removeAttr('readonly'); diff --git a/module/task/lang/de.php b/module/task/lang/de.php index 8feeb4a82b..e544b33c78 100644 --- a/module/task/lang/de.php +++ b/module/task/lang/de.php @@ -10,6 +10,7 @@ * @link https://www.zentao.net */ $lang->task->index = "Index"; +$lang->task->browse = "Aufgabenliste"; $lang->task->create = "Aufgabe erstellen"; $lang->task->batchCreate = "Mehere erstellen"; $lang->task->batchCreateChildren = "Mehere Teilaufgaben"; diff --git a/module/task/lang/en.php b/module/task/lang/en.php index a9d6796b81..df27a2403d 100755 --- a/module/task/lang/en.php +++ b/module/task/lang/en.php @@ -10,6 +10,7 @@ * @link https://www.zentao.net */ $lang->task->index = "Home"; +$lang->task->browse = "Task List"; $lang->task->create = "Create Task"; $lang->task->batchCreate = "Batch Create"; $lang->task->batchCreateChildren = "Batch Create Child Tasks"; diff --git a/module/task/lang/fr.php b/module/task/lang/fr.php index a85ea8bcb5..f6909f442c 100644 --- a/module/task/lang/fr.php +++ b/module/task/lang/fr.php @@ -10,6 +10,7 @@ * @link https://www.zentao.net */ $lang->task->index = "Accueil"; +$lang->task->browse = "Liste des Tâches"; $lang->task->create = "Créer Tâche"; $lang->task->batchCreate = "Créer par Lots"; $lang->task->batchCreateChildren = "Créer sous-tâches par lots"; diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php index 164a921461..26c167b100 100755 --- a/module/task/lang/zh-cn.php +++ b/module/task/lang/zh-cn.php @@ -10,6 +10,7 @@ * @link https://www.zentao.net */ $lang->task->index = "任务一览"; +$lang->task->browse = "任务列表"; $lang->task->create = "建任务"; $lang->task->batchCreate = "批量创建"; $lang->task->batchCreateChildren = "批量建子任务"; diff --git a/module/task/ui/edit.html.php b/module/task/ui/edit.html.php index 604bb54ed3..54f84a9d51 100644 --- a/module/task/ui/edit.html.php +++ b/module/task/ui/edit.html.php @@ -73,6 +73,9 @@ $closedReasonOptions = $lang->task->reasonList; $teamOptions = $members; $hiddenTeam = $task->mode != '' ? '' : 'hidden'; +$disabledEstStarted = $project && $project->taskDateLimit == 'limit' && !empty($parentTask) && helper::isZeroDate($parentTask->estStarted); +$disabledDeadline = $project && $project->taskDateLimit == 'limit' && !empty($parentTask) && helper::isZeroDate($parentTask->deadline); + if($task->status == 'wait') unset($statusOptions['pause']); if(!empty($task->team)) @@ -251,6 +254,7 @@ detailBody set::name('parent'), set::value($task->parent), set::items($tasks), + set::disabled(!empty($task->mode)), on::change('getParentEstStartedAndDeadline') ) ) : formHidden('parent', $task->parent), @@ -467,9 +471,9 @@ detailBody datePicker ( set::name('estStarted'), - set::disabled($project && $project->taskDateLimit == 'limit' && !empty($parentTask) && helper::isZeroDate($parentTask->estStarted) ? true : false), + set::disabled($disabledEstStarted), on::change('checkEstStartedAndDeadline'), - helper::isZeroDate($task->estStarted) ? null : set::value($task->estStarted) + set::value((helper::isZeroDate($task->estStarted) || $disabledEstStarted) ? null : $task->estStarted) ) ) ), @@ -482,9 +486,9 @@ detailBody datePicker ( set::name('deadline'), - set::disabled($project && $project->taskDateLimit == 'limit' && !empty($parentTask) && helper::isZeroDate($parentTask->deadline) ? true : false), + set::disabled($disabledDeadline), on::change('checkEstStartedAndDeadline'), - helper::isZeroDate($task->deadline) ? null : set::value($task->deadline) + set::value((helper::isZeroDate($task->deadline) || $disabledDeadline) ? null : $task->deadline) ) ) ), diff --git a/module/task/zen.php b/module/task/zen.php index 0e8fd1089b..d1e0b165aa 100644 --- a/module/task/zen.php +++ b/module/task/zen.php @@ -739,7 +739,7 @@ class taskZen extends task $task->assignedDate = !empty($task->assignedTo) && $oldTask->assignedTo != $task->assignedTo ? $now : $oldTask->assignedDate; $task->version = $oldTask->name != $task->name || $oldTask->estStarted != $task->estStarted || $oldTask->deadline != $task->deadline ? $oldTask->version + 1 : $oldTask->version; $task->consumed = $task->consumed < 0 ? $task->consumed : $task->consumed + $oldTask->consumed; - $task->storyVersion = ($task->story && $oldTask->story != $task->story) ? $this->loadModel('story')->getVersion((int)$task->story) : 1; + $task->storyVersion = ($task->story && $oldTask->story != $task->story) ? $this->loadModel('story')->getVersion((int)$task->story) : $oldTask->storyVersion; if(empty($task->closedReason) && $task->status == 'closed') { @@ -1169,7 +1169,9 @@ class taskZen extends task if($task->status == 'cancel') continue; if($task->status == 'done' && !$task->consumed) dao::$errors["consumed[{$taskID}]"] = (array)sprintf($this->lang->error->notempty, $this->lang->task->consumedThisTime); - $this->checkLegallyDate($task, $project->taskDateLimit == 'limit', isset($parents[$task->parent]) ? $parents[$task->parent] : null, $taskID); + $parentTask = isset($parents[$task->parent]) ? $parents[$task->parent] : null; + if(isset($tasks[$task->parent])) $parentTask = zget($tasks, $task->parent, null); + $this->checkLegallyDate($task, $project->taskDateLimit == 'limit', $parentTask, $taskID); } return !dao::isError(); } diff --git a/module/todo/model.php b/module/todo/model.php index 075283c99e..17bffc7f54 100755 --- a/module/todo/model.php +++ b/module/todo/model.php @@ -391,7 +391,6 @@ class todoModel extends model */ public function activate(int $todoID): bool { - $oldTodo = $this->fetchByID($todoID); $this->dao->update(TABLE_TODO)->set('status')->eq('wait')->where('id')->eq($todoID)->exec(); $todo = $this->fetchByID($todoID); diff --git a/module/transfer/ui/import.html.php b/module/transfer/ui/import.html.php index cbf556678e..5a29070e0f 100644 --- a/module/transfer/ui/import.html.php +++ b/module/transfer/ui/import.html.php @@ -22,6 +22,6 @@ formPanel set::items($typeList) ) : null, input(set::type('file'), set::name('file')), - span(setClass('label secondary'), $lang->transfer->importNotice) + span(setClass('label secondary h-auto'), $lang->transfer->importNotice) ); h::js('$.cookie.set("maxImport", 0, {expires:config.cookieLife, path:config.webRoot});'); diff --git a/module/tutorial/model.php b/module/tutorial/model.php index 0bacf79939..a807b67dcb 100644 --- a/module/tutorial/model.php +++ b/module/tutorial/model.php @@ -186,6 +186,7 @@ class tutorialModel extends model $project->charter = 0; $project->market = 1; $project->budgetUnit = 'CNY'; + $project->deliverable = ''; list($guide, $guideTask, $guideStepIndex) = empty($_SERVER['HTTP_X_ZIN_TUTORIAL']) ? array('', '', '') : explode('-', $_SERVER['HTTP_X_ZIN_TUTORIAL']); if($guide && strpos($guide, 'scrumProjectManage') !== false) @@ -292,20 +293,21 @@ class tutorialModel extends model { $execution = $this->getExecution(); - $execution->progress = 0; - $execution->estimate = 0; - $execution->consumed = 0; - $execution->left = 0; - $execution->leftTasks = '—'; - $execution->teamMembers = array_keys($this->getTeamMembers()); - $execution->teamCount = count($execution->teamMembers); - $execution->hasProduct = '1'; - $execution->multiple = ''; - $execution->order = 1; - $execution->burns = array(); - $execution->type = 'sprint'; - $execution->projectName = ''; - $execution->projectModel = 'scrum'; + $execution->progress = 0; + $execution->estimate = 0; + $execution->consumed = 0; + $execution->left = 0; + $execution->leftTasks = '—'; + $execution->teamMembers = array_keys($this->getTeamMembers()); + $execution->teamCount = count($execution->teamMembers); + $execution->hasProduct = '1'; + $execution->multiple = ''; + $execution->order = 1; + $execution->burns = array(); + $execution->type = 'sprint'; + $execution->projectName = ''; + $execution->projectModel = 'scrum'; + $execution->deliverable = ''; if($browseType && $browseType != 'all') $execution->name .= '-' . $browseType; @@ -540,7 +542,7 @@ class tutorialModel extends model */ public function getExecutionPairs(): array { - return array(3 => 'Test execution'); + return array(2 => 'Test Project', 3 => 'Test execution'); } /** @@ -637,6 +639,8 @@ class tutorialModel extends model $execution->openedDate = helper::now(); $execution->closedDate = helper::now(); $execution->milestone = 0; + $execution->workflowGroup = 0; + $execution->deliverable = ''; list($guide, $guideTask, $guideStepIndex) = empty($_SERVER['HTTP_X_ZIN_TUTORIAL']) ? array('', '', '') : explode('-', $_SERVER['HTTP_X_ZIN_TUTORIAL']); if($guide && strpos($guide, 'scrumProjectManage') !== false) diff --git a/module/upgrade/config.php b/module/upgrade/config.php index e0021b04e8..8c60c4d1ba 100644 --- a/module/upgrade/config.php +++ b/module/upgrade/config.php @@ -67,7 +67,8 @@ $config->upgrade->maxVersion['max6_5'] = '21_5'; $config->upgrade->maxVersion['max6_6_beta'] = '21_6_beta'; $config->upgrade->maxVersion['max6_6'] = '21_6'; $config->upgrade->maxVersion['max6_6_1'] = '21_6_1'; -$config->upgrade->maxVersion['max6_7'] = '21_7'; // max insert position. +$config->upgrade->maxVersion['max6_7'] = '21_7'; +$config->upgrade->maxVersion['max7_0'] = '21_7_1'; // max insert position. $config->upgrade->bizVersion = array(); $config->upgrade->bizVersion['biz1_0'] = '9_5_1'; @@ -173,7 +174,8 @@ $config->upgrade->bizVersion['biz11_5'] = '21_5'; $config->upgrade->bizVersion['biz11_6_beta'] = '21_6_beta'; $config->upgrade->bizVersion['biz11_6'] = '21_6'; $config->upgrade->bizVersion['biz11_6_1'] = '21_6_1'; -$config->upgrade->bizVersion['biz11_7'] = '21_7'; // biz insert position. +$config->upgrade->bizVersion['biz11_7'] = '21_7'; +$config->upgrade->bizVersion['biz12_0'] = '21_7_1'; // biz insert position. $config->upgrade->proVersion = array(); $config->upgrade->proVersion['pro1_0'] = '3_1'; @@ -316,7 +318,8 @@ $config->upgrade->ipdVersion['ipd3_5'] = '21_5'; $config->upgrade->ipdVersion['ipd3_6_beta'] = '21_6_beta'; $config->upgrade->ipdVersion['ipd3_6'] = '21_6'; $config->upgrade->ipdVersion['ipd3_6_1'] = '21_6_1'; -$config->upgrade->ipdVersion['ipd3_7'] = '21_7'; // ipd insert position. +$config->upgrade->ipdVersion['ipd3_7'] = '21_7'; +$config->upgrade->ipdVersion['ipd4_0'] = '21_7_1'; // ipd insert position. $config->upgrade->lowerTables = array(); $config->upgrade->lowerTables[$config->db->prefix . 'caseStep'] = $config->db->prefix . 'casestep'; @@ -1312,10 +1315,6 @@ $config->delete['20_1'][] = 'execution/ipd/testcase/ext/ui/view.effort.html.hook $config->delete['20_1_1'][] = 'extension/max/design/ext/ui/browse.zentamax.html.hook.php'; $config->delete['20_1_1'][] = 'extension/max/doc/ext/ui/create.zentamax.html.hook.php'; $config->delete['20_1_1'][] = 'extension/max/doc/ext/view/create.zentamax.html.hook.php'; -$config->delete['20_1_1'][] = 'extension/max/execution/ext/model/zentaomax.php'; -$config->delete['20_1_1'][] = 'extension/ipd/execution/ext/model/zentaomax.php'; -$config->delete['20_1_1'][] = 'extension/max/execution/ext/model/class/zentaomax.class.php'; -$config->delete['20_1_1'][] = 'extension/ipd/execution/ext/model/class/zentaomax.class.php'; $config->delete['20_3_0'][] = 'extension/ipd/story/ext/tao/class/ipd.class.php'; $config->delete['20_3_0'][] = 'extension/ipd/story/ext/tao/ipd.php'; @@ -1476,6 +1475,13 @@ $config->delete['21_6_beta'][] = 'extension/ipd/common/ext/lang/en/effort.php'; $config->delete['21_6_beta'][] = 'extension/ipd/common/ext/lang/fr/effort.php'; $config->delete['21_6_beta'][] = 'extension/ipd/common/ext/lang/zh-cn/effort.php'; +$config->delete['21_6_beta'][] = 'extension/ipd/project/ext/model/class/zentaoipd.class.php'; +$config->delete['21_6_beta'][] = 'extension/max/project/ext/model/class/zentaoipd.class.php'; +$config->delete['21_6_beta'][] = 'extension/biz/project/ext/model/class/zentaoipd.class.php'; +$config->delete['21_6_beta'][] = 'extension/ipd/project/ext/model/zentaoipd.php'; +$config->delete['21_6_beta'][] = 'extension/max/project/ext/model/zentaoipd.php'; +$config->delete['21_6_beta'][] = 'extension/biz/project/ext/model/zentaoipd.php'; + $config->upgrade->openModules = array('action', 'admin', 'ai', 'bi', 'aiapp', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', 'cache', 'caselib', 'chart', 'ci', 'client', 'common', 'company', 'compile', 'convert', 'cron', 'custom', 'datatable', 'dataview', 'dept', 'design', 'dev', 'dimension', 'doc', 'durationestimation', 'entry', 'execution', 'extension', 'file', 'git', 'gitlab', 'group', 'holiday', 'im', 'index', 'index.html', 'install', 'issue', 'jenkins', 'job', 'kanban', 'license', 'mail', 'message', 'metric', 'misc', 'mr', 'my', 'personnel', 'pipeline', 'product', 'productplan', 'productset', 'program', 'programplan', 'project', 'projectbuild', 'projectplan', 'projectrelease', 'projectstory', 'pivot', 'qa', 'release', 'repo', 'report', 'risk', 'score', 'screen', 'search', 'setting', 'sonarqube', 'sso', 'stage', 'stakeholder', 'story', 'subject', 'svn', 'task', 'testcase', 'testreport', 'testsuite', 'testtask', 'todo', 'tree', 'tutorial', 'upgrade', 'user', 'webhook', 'weekly', 'workestimation', 'gitea', 'gogs', 'transfer', 'zahost', 'zanode', 'editor', 'charter', 'roadmap', 'account', 'cne', 'host', 'instance', 'ops', 'serverroom', 'space', 'store', 'system', 'solution', 'demand', 'gitfox', 'epic', 'requirement', 'mark'); $config->upgrade->unsetModules = array('design', 'program', 'programplan', 'projectbuild', 'projectrelease', 'stage', 'stakeholder', 'product', 'branch', 'productplan', 'release', 'build', 'qa', 'bug', 'testcase', 'testtask', 'testreport', 'testsuite', 'caselib', 'automation', 'repo', 'ci', 'compile', 'jenkins', 'job', 'svn', 'gitlab', 'sonarqube', 'mr', 'git', 'report', 'sqlbuilder', 'feedback', 'faq', 'attend', 'holiday', 'leave', 'makeup', 'overtime', 'lieu', 'ops', 'host', 'serverroom', 'account', 'domain', 'service', 'deploy', 'conference', 'traincourse', 'pssp', 'baseline', 'classify', 'cm', 'cmcl', 'auditcl', 'reviewcl', 'process', 'activity', 'zoutput', 'auditplan', 'nc', 'subject', 'weekly', 'workestimation', 'issue', 'durationestimation', 'risk', 'opportunity', 'trainplan', 'gapanalysis', 'researchplan', 'researchreport', 'meeting', 'meetingroom', 'budget', 'reviewissue', 'reviewsetting', 'review', 'milestone', 'measurement', 'measrecord', 'assetlib', 'setting', 'im', 'client', 'ldap', 'dev', 'api', 'gitea', 'gogs', 'zanode', 'zahost'); diff --git a/module/upgrade/config/upgradeflow.php b/module/upgrade/config/upgradeflow.php index 09d1ba509a..f755866ccf 100644 --- a/module/upgrade/config/upgradeflow.php +++ b/module/upgrade/config/upgradeflow.php @@ -110,6 +110,7 @@ $config->upgrade->execFlow['21_2'] = array('functions' => 'importBuildinW $config->upgrade->execFlow['21_3'] = array('functions' => 'createDevOpsChartModule'); $config->upgrade->execFlow['21_6_beta'] = array('functions' => 'convertCharset,processCharterBranch'); $config->upgrade->execFlow['21_6_1'] = array('xxsqls' => "$appRoot/db/upgradexuanxuan9.1.2.sql"); +$config->upgrade->execFlow['21_7'] = array('functions' => 'fixWorkflowNameForExecution'); if(!empty($config->isINT)) { diff --git a/module/upgrade/lang/version.php b/module/upgrade/lang/version.php index d9ebf20c59..1600b67f61 100644 --- a/module/upgrade/lang/version.php +++ b/module/upgrade/lang/version.php @@ -212,7 +212,8 @@ $lang->upgrade->fromVersions['21_5'] = '21.5'; $lang->upgrade->fromVersions['21_6_beta'] = '21.6.beta'; $lang->upgrade->fromVersions['21_6'] = '21.6'; $lang->upgrade->fromVersions['21_6_1'] = '21.6.1'; -$lang->upgrade->fromVersions['21_7'] = '21.7'; // pms insert position. +$lang->upgrade->fromVersions['21_7'] = '21.7'; +$lang->upgrade->fromVersions['21_7_1'] = '21.7.1'; // pms insert position. global $config; /* Lite. */ @@ -425,7 +426,8 @@ $lang->upgrade->fromVersions['biz11_5'] = 'Biz11.5'; $lang->upgrade->fromVersions['biz11_6_beta'] = 'Biz11.6.beta'; $lang->upgrade->fromVersions['biz11_6'] = 'Biz11.6'; $lang->upgrade->fromVersions['biz11_6_1'] = 'Biz11.6.1'; -$lang->upgrade->fromVersions['biz11_7'] = 'Biz11.7'; // biz insert position. +$lang->upgrade->fromVersions['biz11_7'] = 'Biz11.7'; +$lang->upgrade->fromVersions['biz12_0'] = 'Biz12.0'; // biz insert position. /* Max. */ $lang->upgrade->fromVersions['max2_0_beta4'] = 'Max2.0.beta4'; @@ -496,7 +498,8 @@ $lang->upgrade->fromVersions['max6_5'] = 'Max6.5'; $lang->upgrade->fromVersions['max6_6_beta'] = 'Max6.6.beta'; $lang->upgrade->fromVersions['max6_6'] = 'Max6.6'; $lang->upgrade->fromVersions['max6_6_1'] = 'Max6.6.1'; -$lang->upgrade->fromVersions['max6_7'] = 'Max6.7'; // max insert position. +$lang->upgrade->fromVersions['max6_7'] = 'Max6.7'; +$lang->upgrade->fromVersions['max7_0'] = 'Max7.0'; // max insert position. /* Ipd */ $lang->upgrade->fromVersions['ipd1_0_beta1'] = 'Ipd1.0.beta1'; @@ -528,4 +531,5 @@ $lang->upgrade->fromVersions['ipd3_4'] = 'Ipd3.4'; $lang->upgrade->fromVersions['ipd3_5'] = 'Ipd3.5'; $lang->upgrade->fromVersions['ipd3_6_beta'] = 'Ipd3.6.beta'; $lang->upgrade->fromVersions['ipd3_6'] = 'Ipd3.6'; -$lang->upgrade->fromVersions['ipd3_6_1'] = 'Ipd3.6.1'; // ipd insert position. +$lang->upgrade->fromVersions['ipd3_6_1'] = 'Ipd3.6.1'; +$lang->upgrade->fromVersions['ipd3_7'] = 'Ipd3.7'; // ipd insert position. \ No newline at end of file diff --git a/module/upgrade/model.php b/module/upgrade/model.php index 252d13935e..384df60d56 100644 --- a/module/upgrade/model.php +++ b/module/upgrade/model.php @@ -10664,6 +10664,7 @@ class upgradeModel extends model ->andWhere('t1.status')->ne('draft') ->andWhere('t2.rawContent')->in(null) ->andWhere('t1.templateType')->eq('') + ->andWhere('t1.template')->eq('') ->andWhere('t2.fromVersion')->eq(0) ->fetchAll('id', false); @@ -10935,4 +10936,33 @@ class upgradeModel extends model } return true; } + + /** + * 修改执行模块工作流动作名称 + * Fix workflow action and field name for execution. + * + * @access public + * @return bool + */ + public function fixWorkflowNameForExecution() + { + $this->app->loadLang('execution'); + + $this->dao->update(TABLE_WORKFLOWACTION)->set('name')->eq($this->lang->execution->allExecutionAB)->where('module')->eq('execution')->andWhere('action')->eq('all')->exec(); + $this->dao->update(TABLE_WORKFLOWACTION)->set('name')->eq($this->lang->execution->create)->where('module')->eq('execution')->andWhere('action')->eq('create')->exec(); + $this->dao->update(TABLE_WORKFLOWACTION)->set('name')->eq($this->lang->execution->delete)->where('module')->eq('execution')->andWhere('action')->eq('delete')->exec(); + $this->dao->update(TABLE_WORKFLOWACTION)->set('name')->eq($this->lang->execution->edit)->where('module')->eq('execution')->andWhere('action')->eq('edit')->exec(); + $this->dao->update(TABLE_WORKFLOWACTION)->set('name')->eq($this->lang->execution->view)->where('module')->eq('execution')->andWhere('action')->eq('view')->exec(); + $this->dao->update(TABLE_WORKFLOWACTION)->set('name')->eq($this->lang->execution->batchEdit)->where('module')->eq('execution')->andWhere('action')->eq('batchedit')->exec(); + + $this->dao->update(TABLE_WORKFLOWFIELD)->set('name')->eq($this->lang->execution->id)->where('module')->eq('execution')->andWhere('field')->eq('id')->exec(); + $this->dao->update(TABLE_WORKFLOWFIELD)->set('name')->eq($this->lang->execution->type)->where('module')->eq('execution')->andWhere('field')->eq('type')->exec(); + $this->dao->update(TABLE_WORKFLOWFIELD)->set('name')->eq($this->lang->execution->name)->where('module')->eq('execution')->andWhere('field')->eq('name')->exec(); + $this->dao->update(TABLE_WORKFLOWFIELD)->set('name')->eq($this->lang->execution->code)->where('module')->eq('execution')->andWhere('field')->eq('code')->exec(); + $this->dao->update(TABLE_WORKFLOWFIELD)->set('name')->eq($this->lang->execution->status)->where('module')->eq('execution')->andWhere('field')->eq('status')->exec(); + $this->dao->update(TABLE_WORKFLOWFIELD)->set('name')->eq($this->lang->execution->desc)->where('module')->eq('execution')->andWhere('field')->eq('desc')->exec(); + $this->dao->update(TABLE_WORKFLOWFIELD)->set('name')->eq($this->lang->execution->PM)->where('module')->eq('execution')->andWhere('field')->eq('PM')->exec(); + + return true; + } } diff --git a/module/user/model.php b/module/user/model.php index 9893929b71..cba2cac97b 100644 --- a/module/user/model.php +++ b/module/user/model.php @@ -301,7 +301,7 @@ class userModel extends model unset($this->config->user->moreLink); if($maxCount && $maxCount == $userCount) { - if(is_array($usersToAppended)) $usersToAppended = join(',', $usersToAppended); + if(is_array($usersToAppended)) $usersToAppended = implode(',', $usersToAppended); $moreLinkParams = "params={$params}&usersToAppended={$usersToAppended}"; $moreLink = helper::createLink('user', 'ajaxGetMore'); @@ -749,7 +749,7 @@ class userModel extends model sort($oldGroups); sort($newGroups); - if(join(',', $oldGroups) == join(',', $newGroups)) return false; + if(implode(',', $oldGroups) == implode(',', $newGroups)) return false; /* 如果权限组发生变化,则删除原有的权限组,重新创建并更新用户视图。*/ /* If the group changed, delete the old group, create new group and update user view. */ @@ -1298,6 +1298,7 @@ class userModel extends model */ public function getProjects(string $account, string $status = 'all', string $orderBy = 'id_desc', object $pager = null): array { + $this->loadModel('project'); $projects = $this->userTao->fetchProjects($account, $status, $orderBy, $pager); if(!$projects) return array(); @@ -1317,6 +1318,8 @@ class userModel extends model $project->storyPoints = $projectStory ? round($projectStory->estimate, 1) : 0; $project->storyCount = $projectStory ? $projectStory->count : 0; $project->executionCount = zget($projectExecutionCount, $project->id, 0); + + if(in_array($this->config->edition, array('max', 'ipd'))) $project->deliverable = $this->project->countDeliverable($project); } return $projects; @@ -1708,7 +1711,7 @@ class userModel extends model $programView = ''; if(!empty($manageObjects['programs']['isAdmin'])) { - $programView = join(',', array_keys($allPrograms)); + $programView = implode(',', array_keys($allPrograms)); } else { @@ -1727,7 +1730,7 @@ class userModel extends model /* 如果有某个项目集的管理权限,也可以访问该项目集。 */ if(strpos(",$managePrograms,", ",$programID,") !== false) $programs[$programID] = $programID; } - $programView = join(',', $programs); + $programView = implode(',', $programs); } return $programView; @@ -1749,7 +1752,7 @@ class userModel extends model $productView = ''; if(!empty($manageObjects['products']['isAdmin'])) { - $productView = join(',', array_keys($allProducts)); + $productView = implode(',', array_keys($allProducts)); } else { @@ -1768,7 +1771,7 @@ class userModel extends model /* 如果有某个产品的管理权限,也可以访问该产品。 */ if(strpos(",$manageProducts,", ",$productID,") !== false) $products[$productID] = $productID; } - $productView = join(',', $products); + $productView = implode(',', $products); } return $productView; @@ -1793,7 +1796,7 @@ class userModel extends model $projectView = ''; if(!empty($manageObjects['projects']['isAdmin'])) { - $projectView = join(',', array_keys($allProjects)); + $projectView = implode(',', array_keys($allProjects)); } else { @@ -1811,7 +1814,7 @@ class userModel extends model /* 如果有某个项目管理权限,也可以访问该项目。 */ if(strpos(",$manageProjects,", ",$projectID,") !== false) $projects[$projectID] = $projectID; } - $projectView = join(',', $projects); + $projectView = implode(',', $projects); } return $projectView; @@ -1835,7 +1838,7 @@ class userModel extends model $sprintView = ''; if(!empty($manageObjects['executions']['isAdmin'])) { - $sprintView = join(',', array_keys($allSprints)); + $sprintView = implode(',', array_keys($allSprints)); } else { @@ -1852,7 +1855,7 @@ class userModel extends model /* 如果有某个迭代管理权限,也可以访问该迭代。 */ if(strpos(",$manageExecutions,", ",$sprintID,") !== false) $sprints[$sprintID] = $sprintID; } - $sprintView = join(',', $sprints); + $sprintView = implode(',', $sprints); } return $sprintView; @@ -1907,7 +1910,8 @@ class userModel extends model if(empty($account)) return $userView; $userView = $this->dao->select('*')->from(TABLE_USERVIEW)->where('account')->eq($account)->fetch(); - if(!empty($userView) && !$force) return $userView; + $isEmpty = empty($userView); + if(!$isEmpty && !$force) return $userView; /* Init objects. */ list($allProducts, $allProjects, $allPrograms, $allSprints, $teams, $whiteList, $stakeholders) = $this->initViewObjects($force); @@ -1919,10 +1923,10 @@ class userModel extends model $isAdmin = strpos($this->app->company->admins, ',' . $account . ',') !== false; if($isAdmin) { - $userView->programs = join(',', array_keys($allPrograms)); - $userView->products = join(',', array_keys($allProducts)); - $userView->projects = join(',', array_keys($allProjects)); - $userView->sprints = join(',', array_keys($allSprints)); + $userView->programs = implode(',', array_keys($allPrograms)); + $userView->products = implode(',', array_keys($allProducts)); + $userView->projects = implode(',', array_keys($allProjects)); + $userView->sprints = implode(',', array_keys($allSprints)); } else { @@ -1942,7 +1946,14 @@ class userModel extends model } /* 更新访问权限表。 */ - $this->dao->replace(TABLE_USERVIEW)->data($userView)->exec(); + if($isEmpty) + { + $this->dao->insert(TABLE_USERVIEW)->data($userView)->exec(); + } + else + { + $this->dao->update(TABLE_USERVIEW)->data($userView)->where('account')->eq($account)->exec(); + } return $userView; } @@ -2070,16 +2081,16 @@ class userModel extends model if(empty($acls) && !empty($this->session->user->rights['acls'])) $acls = $this->session->user->rights['acls']; if(empty($projects) && !empty($this->session->user->rights['projects'])) $projects = $this->session->user->rights['projects']; - $userView = $this->computeUserView($account, true); + $userView = $this->computeUserView($account); /* Get opened projects, programs, products and set it to userview. */ $openedProducts = array_keys($this->loadModel('product')->getListByAcl('open')); $openedPrograms = array_keys($this->loadModel('project')->getListByAclAndType('open', 'program')); $openedProjects = array_keys($this->project->getListByAclAndType('open', 'project')); - $userView->products = rtrim($userView->products, ',') . ',' . join(',', $openedProducts); - $userView->programs = rtrim($userView->programs, ',') . ',' . join(',', $openedPrograms); - $userView->projects = rtrim($userView->projects, ',') . ',' . join(',', $openedProjects); + $userView->products = rtrim($userView->products, ',') . ',' . implode(',', $openedProducts); + $userView->programs = rtrim($userView->programs, ',') . ',' . implode(',', $openedPrograms); + $userView->projects = rtrim($userView->projects, ',') . ',' . implode(',', $openedProjects); /* 合并用户视图权限到用户访问权限。 */ $userView = $this->mergeAclsToUserView($account, $userView, $acls, $projects); @@ -2125,10 +2136,10 @@ class userModel extends model $openedSprints = $this->loadModel('project')->getListByAclAndType('open', 'sprint,stage,kanban'); $openedSprints = array_filter(array_map(function($sprint) use ($userView) { if(strpos(",{$userView->projects},", ",{$sprint->project},") !== false) return $sprint->id; }, $openedSprints)); - $userView->sprints = rtrim($userView->sprints, ',') . ',' . join(',', $openedSprints); + $userView->sprints = rtrim($userView->sprints, ',') . ',' . implode(',', $openedSprints); $canViewSprints = $this->dao->select('executions')->from(TABLE_PROJECTADMIN)->where('account')->eq($account)->fetch('executions'); - if($canViewSprints) $userView->sprints .= ',' . $canViewSprints; + if($canViewSprints != 'all') $userView->sprints .= ',' . $canViewSprints; return $userView; } diff --git a/test/data/deliverable.yaml b/test/data/deliverable.yaml new file mode 100644 index 0000000000..ee40d120cc --- /dev/null +++ b/test/data/deliverable.yaml @@ -0,0 +1,34 @@ +title: table zt_deliverable +desc: "交付物" +author: Sun Guangming +version: "1.0" +fields: + - field: id + note: "ID" + range: 1-1000 + - field: name + fields: + - field: name1 + range: '交付物' + - field: name2 + range: 1-1000 + - field: module + range: project,execution + - field: method + range: create,close + - field: model + fields: + - field: model1 + range: product,project + postfix: "_" + - field: model2 + range: waterfall,scrum + postfix: "_" + - field: model3 + range: mix,request,design,dev,qa,release,review + - field: type + range: doc,file + - field: files + range: 1-10 + - field: desc + range: '交付物描述' \ No newline at end of file diff --git a/test/data/instance.yaml b/test/data/instance.yaml index e29d9c7645..faa3a11bb8 100644 --- a/test/data/instance.yaml +++ b/test/data/instance.yaml @@ -27,5 +27,7 @@ fields: range: 'cloud' - field: channel range: 'stable' + - field: status + range: running{100},stopped,abnormal - field: domain range: 'rila.dops.corp.cc,7czx.dops.corp.cc,xqly.dops.corp.cc,ane3.dops.corp.cc,qphl.dops.corp.cc' diff --git a/test/lib/coverage.php b/test/lib/coverage.php index 453a788162..e1e37e6169 100644 --- a/test/lib/coverage.php +++ b/test/lib/coverage.php @@ -55,13 +55,22 @@ class coverage /** * Save traces and restart code coverage. * + * @param string $rawModule + * @param string $rawMethod * @access public * @return void */ - public function saveAndRestartCodeCoverage(): void + public function saveAndRestartCodeCoverage(string $url = ''): void { $traces = xdebug_get_code_coverage(); - $this->saveTraces($traces); + if($url) + { + $this->saveTracesByIndex($traces, $url); + } + else + { + $this->saveTraces($traces); + } xdebug_stop_code_coverage(); xdebug_start_code_coverage(); @@ -114,6 +123,32 @@ class coverage return file_put_contents($this->traceFile, json_encode($log)); } + /** + * Save traces to file. + * + * @param array $traces + * @access private + * @return bool + */ + private function saveTracesByIndex(array $traces, string $url): bool + { + $tracePath = $this->zentaoRoot . "/tmp/webcoverage"; + if(!is_dir($tracePath)) mkdir($tracePath, 0777, true); + + $traceFile = $tracePath . '/' . urlencode($url) . '.json'; + $traces = $this->filterTraces($traces); + $traces = $this->groupTraceByIndex($traces); + + $log = new stdclass; + $log->time = date('Y-m-d H:i:s'); + $log->ztfPath = getenv('ZTF_REPORT_DIR'); + $log->traces = $traces; + if(!$log->traces) return false; + + + return file_put_contents($traceFile, json_encode($log)); + } + /** * Compute the line coverage test method. * @param array $traces @@ -197,6 +232,61 @@ class coverage return $methodCount; } + /** + * 获取class方法行数。 + * Get the total number of methods in class. + * + * @param string $moduleName + * @param string $type + * @access private + * @return int + */ + private function getClassMethodLines(string $moduleName, string $type): int + { + if(file_exists($this->getClassFile($moduleName, $type)) === false) return 0; + $classFileContents = file_get_contents($this->getClassFile($moduleName, $type)); + $lines = explode("\n", $classFileContents); + + $inComment = false; + $lineCount = 0; + + foreach($lines as $line) + { + $trimmed = trim($line); + + // 跳过class定义行 + if(preg_match('/^class\s+/i', $trimmed)) continue; + + // 跳过function定义行 + if(strpos($trimmed, 'function') !== false) continue; + + // 跳过php定义行 + if(strpos($trimmed, '') !== false) continue; + + // 处理多行注释 + if($inComment) + { + if(strpos($trimmed, '*/') !== false) $inComment = false; + continue; + } + + if(strpos($trimmed, '/*') === 0) + { + $inComment = true; + if(strpos($trimmed, '*/') !== false) $inComment = false; + continue; + } + + // 移除单行注释 + $cleanLine = preg_replace('@//.*$@', '', $line); + $cleanLine = preg_replace('@#.*$@', '', $cleanLine); + + if(!empty(trim($cleanLine))) $lineCount++; + } + + return $lineCount; + } + /** * Get test method file. * @@ -279,6 +369,31 @@ class coverage return $groupedTraces; } + /** + * Group traces by module. + * + * @param array $traces + * @access private + * @return array + */ + private function groupTraceByIndex(array $traces): array + { + $groupedTraces = array(); + + foreach($traces as $filePath => $fileTrace) + { + $moduleName = $this->getModuleByFilePath($filePath); + if($moduleName == 'xuan') continue; + $fileName = basename($filePath, '.php'); + $groupedTraces['module'] = $moduleName; + $groupedTraces['type'] = $fileName; + + $groupedTraces['executeLines'] = $fileTrace; + } + + return $groupedTraces; + } + /** * Get current fileTrace belog to which module. * @@ -304,10 +419,11 @@ class coverage * Generate module stats report. * * @param array $traces + * @param string $type * @access public * @return string */ - private function genModuleStatsReport(array $traces): string + private function genModuleStatsReport(array $traces, string $type = ''): string { $summaryTable = << @@ -333,7 +449,7 @@ EOT; foreach($traces as $module => $moduleTraces) { - $summaryTable .= $this->genStatsTableByModule($module, $moduleTraces); + $summaryTable .= $this->genStatsTableByModule($module, $moduleTraces, $type); } $summaryTable .= '' . PHP_EOL; @@ -345,10 +461,11 @@ EOT; * * @param string $module * @param array $moduleTraces + * @param string $reportType * @access private * @return void */ - private function genStatsTableByModule(string $module, array $moduleTraces) + private function genStatsTableByModule(string $module, array $moduleTraces, string $reportType = '') { $modelMethodesCount = $this->getClassMethodCount($module, 'model'); $controlMethodesCount = $this->getClassMethodCount($module, 'control'); @@ -364,7 +481,11 @@ EOT; foreach($moduleTraces as $type => $methods) { $moduleCoverageList[$type] = 0; - foreach($methods as $methodCoverage) $moduleCoverageList[$type] += $methodCoverage['coverage']; + foreach($methods as $methodCoverage) + { + if(empty($methodCoverage['coverage'])) continue; + $moduleCoverageList[$type] += $methodCoverage['coverage']; + } } $summaryTable = '' . PHP_EOL; @@ -381,9 +502,23 @@ EOT; foreach($this->unfilteredTraces as $fileType) { $fileType = str_replace('.php', '', $fileType); - $methodCount = $this->getClassMethodCount($module, $fileType); - - $summaryTable .= isset($moduleCoverageList[$fileType]) ? "" . round($moduleCoverageList[$fileType] / $methodCount, 2) * 100 . '%' . PHP_EOL : '0%' . PHP_EOL; + if(empty($moduleTraces[$fileType])) + { + $summaryTable .= '0%' . PHP_EOL; + continue; + } + if($reportType == 'web') + { + $methodLines = $this->getClassMethodLines($module, $fileType); + $execLines = empty($moduleTraces[$fileType]['executeLines']) ? 0 : count($moduleTraces[$fileType]['executeLines']); + $coverage = $methodLines == 0 ? 0 : round($execLines / $methodLines, 2) * 100; + $summaryTable .= "" . $coverage . '%' . PHP_EOL; + } + else + { + $methodCount = $this->getClassMethodCount($module, $fileType); + $summaryTable .= "" . round($moduleCoverageList[$fileType] / $methodCount, 2) * 100 . '%' . PHP_EOL; + } } $summaryTable .= '' . PHP_EOL; @@ -396,10 +531,11 @@ EOT; * @param string $module * @param string $file * @param array $fileTraces + * @param string $reportType * @access private * @return string */ - private function genCoverageTableByFile(string $module, string $file, array $fileTraces): string + private function genCoverageTableByFile(string $module, string $file, array $fileTraces, string $reportType = ''): string { $file = $this->getClassFile($module, $file); $coverageTable = << $methodInfo) + foreach($fileTraces as $methodInfo) { - foreach($methodInfo['executeLines'] as $executeLine => $count) $coverageLineList[$executeLine] = $count; + $executeLine = $reportType == 'web' ? $methodInfo : $methodInfo['executeLines']; + foreach($executeLine as $executeLine => $count) $coverageLineList[$executeLine] = $count; } foreach($content as $line => $code) @@ -444,10 +581,11 @@ EOT; * * @param string $filePath * @param string $key + * @param string $type * @return array|string|false * */ - public function loadTraceFromFiles(string $filePath, string $key = ''): array|string|false + public function loadTraceFromFiles(string $filePath, string $key = '', $type = ''): array|string|false { $tracesFiles = glob("{$filePath}/*.json"); if(!$tracesFiles) return false ; @@ -456,11 +594,25 @@ EOT; foreach($tracesFiles as $file) { $tracesInfo = json_decode(file_get_contents($file), true); - if(!isset($tracesInfo['traces'])) continue; - + if(empty($tracesInfo['traces'])) continue; $traces = $tracesInfo['traces']; - $tracesList['traces'][$traces['module']][$traces['type']][$traces['method']]['executeLines'] = $traces['executeLines']; - $tracesList['traces'][$traces['module']][$traces['type']][$traces['method']]['coverage'] = $traces['coverage']; + + if($type == 'web') + { + if(empty($tracesList[$traces['module']][$traces['type']]['executeLines'])) + { + $tracesList['traces'][$traces['module']][$traces['type']]['executeLines'] = $traces['executeLines']; + } + else + { + $tracesList['traces'][$traces['module']][$traces['type']]['executeLines'] = array_merge($tracesList[$traces['module']][$traces['type']]['executeLines'], $traces['executeLines']); + } + } + else + { + $tracesList['traces'][$traces['module']][$traces['type']][$traces['method']]['executeLines'] = $traces['executeLines']; + $tracesList['traces'][$traces['module']][$traces['type']][$traces['method']]['coverage'] = $traces['coverage']; + } $tracesList['time'] = $tracesInfo['time']; $tracesList['ztfPath'] = $tracesInfo['ztfPath']; @@ -499,15 +651,44 @@ EOT; return $reportHtml; } + /** + * Generate web summary report. + * + * @param string $module + * @param string $file + * @return string + */ + public function genWebSummaryReport(string $module='', string $file=''): string + { + /* Get trace from file. */ + $tracesPath = $this->zentaoRoot . '/tmp/webcoverage'; + $traces = $this->loadTraceFromFiles($tracesPath, 'traces', 'web'); + + /* Generate report. */ + $reportHtml = empty($file) ? '' . PHP_EOL : '' . PHP_EOL; + if(empty($file)) + { + $reportHtml .= $this->genModuleStatsReport($traces, 'web'); + } + else + { + $reportHtml .= $this->genCoverageTableByFile($module, $file, $traces[$module][$file], 'web'); + } + $reportHtml .= ''; + + return $reportHtml; + } + /** * Get ztf report. * + * @param string $type * @access public * @return object */ - public function getZtfReport(): object|false + public function getZtfReport($type = ''): object|false { - $reportFile = $this->getZtfReportFile(); + $reportFile = $this->getZtfReportFile($type); if(!$reportFile) return false; $content = file_get_contents($reportFile); @@ -528,15 +709,16 @@ EOT; /** * Get ztf report. * + * @param string $type * @access public * @return string|false */ - public function getZtfReportFile(): string|false + public function getZtfReportFile($type): string|false { $latestTime = 0; $latestFile = ''; $tracePath = $this->zentaoRoot . "/tmp/coverage/"; - $reportPath = $this->loadTraceFromFiles($tracePath, 'ztfPath'); + $reportPath = $this->loadTraceFromFiles($tracePath, 'ztfPath', $type); exec("find $reportPath -type f -name result.json", $files, $returnCode); if($returnCode !== 0 || empty($files)) return false; diff --git a/test/lib/webdriver/webdriver.class.php b/test/lib/webdriver/webdriver.class.php index 3ddffd5927..4c421a4c8e 100644 --- a/test/lib/webdriver/webdriver.class.php +++ b/test/lib/webdriver/webdriver.class.php @@ -1207,4 +1207,54 @@ class dom $value = json_encode($value); return $this->driver->executeScript("arguments[0].setHTML($value);", array($this->element)); } + + /** + * 设置ZinTool + * Set ZinTool + * + * @access public + * @return void + */ + public function setZinTool() + { + $this->driver->executeScript(<< +{ + const pageInfo = args[0]; // 页面信息 + const perfInfo = args[1]; // 性能数据信息 + + if(perfInfo.stage === 'renderEnd') // 检查当前更新是为渲染结束 + { + window.performanceData = { + pageInfo: pageInfo, + perf: perfInfo.perf + }; + } +}); +JS + ); + return $this; + } + + /** + * 获取ZinTool信息. + * Get ZinTool info. + * + * @param int $timeout + * @access public + * @return array + */ + public function getZinToolInfo($timeout = 10) + { + $count = 0; + $result = array(); + while($count < $timeout) + { + $result = $this->driver->executeScript('return window.performanceData || {};'); + sleep(1); + if(!empty($result)) break; + $count++; + } + return $result; + } } diff --git a/www/coverage.php b/www/coverage.php index fa635a3415..1df44c3f37 100644 --- a/www/coverage.php +++ b/www/coverage.php @@ -14,8 +14,7 @@ if($ztfReport) } else { - $ztfPath = $coverage->loadTraceFromFile('ztfPath'); - $ztfHtml = "

在{$ztfPath}/ 没有找到ZTF测试报告。

"; + $ztfHtml = "

没有找到ZTF测试报告。

"; } diff --git a/www/dev.php b/www/dev.php index 44ab12e996..8224e5c284 100644 --- a/www/dev.php +++ b/www/dev.php @@ -240,12 +240,12 @@ function initTable(data) size: 'lg', mono: false, error: [ - '', + '
', '', '', - '', - '', - '', + '', + '', + '', '', '', '', @@ -253,7 +253,10 @@ function initTable(data) '', ``, ``, - ``, + '', '', ].join('\n')).join('\n'), '', @@ -502,6 +505,13 @@ function setAutoRefreshTimer() if(beginDate > endDate) $('#timestamp__lt').val(event.target.value); }); $('#autoRefresh').on('change', setAutoRefreshTimer); + + $(document).on('click', '.copy-on-click', function() + { + const text = $(this).text(); + navigator.clipboard.writeText(text); + zui.Messager.show({type: 'success', content: 'Copied!'}); + }); setAutoRefreshTimer(); })()); diff --git a/www/js/zui3/icons/ZentaoIcon.eot b/www/js/zui3/icons/ZentaoIcon.eot index 07a09a16f5..959094d5af 100755 Binary files a/www/js/zui3/icons/ZentaoIcon.eot and b/www/js/zui3/icons/ZentaoIcon.eot differ diff --git a/www/js/zui3/icons/ZentaoIcon.svg b/www/js/zui3/icons/ZentaoIcon.svg index 23f96be381..b1cc418687 100755 --- a/www/js/zui3/icons/ZentaoIcon.svg +++ b/www/js/zui3/icons/ZentaoIcon.svg @@ -306,6 +306,7 @@ + diff --git a/www/js/zui3/icons/ZentaoIcon.ttf b/www/js/zui3/icons/ZentaoIcon.ttf index cc6544ddf3..9d17f1d377 100755 Binary files a/www/js/zui3/icons/ZentaoIcon.ttf and b/www/js/zui3/icons/ZentaoIcon.ttf differ diff --git a/www/js/zui3/icons/ZentaoIcon.woff b/www/js/zui3/icons/ZentaoIcon.woff index 776d85cab2..95386d4faa 100755 Binary files a/www/js/zui3/icons/ZentaoIcon.woff and b/www/js/zui3/icons/ZentaoIcon.woff differ diff --git a/www/js/zui3/zui.zentao.css b/www/js/zui3/zui.zentao.css index 14251f436f..4c0a53a17f 100644 --- a/www/js/zui3/zui.zentao.css +++ b/www/js/zui3/zui.zentao.css @@ -1,2 +1,2 @@ -/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border-color:rgb(var(--color-gray-200-rgb));border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:rgb(var(--color-gray-400-rgb));opacity:1}input::placeholder,textarea::placeholder{color:rgb(var(--color-gray-400-rgb));opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}:root{--screen-2xl:1720px;--color-gray-50:#fcfdfe;--color-gray-100:#eff1f3;--color-gray-200:#ebedf3;--color-gray-300:#d2d6e5;--color-gray-400:#b2b9c5;--color-gray-500:#64758b;--color-gray-600:#4a577f;--color-gray-700:#3d4667;--color-gray-800:#353d57;--color-gray-900:#30394a;--color-gray-950:#0b0f18;--color-gray-50-rgb:252,253,254;--color-gray-100-rgb:239,241,243;--color-gray-200-rgb:235,237,243;--color-gray-300-rgb:210,214,229;--color-gray-400-rgb:178,185,197;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:74,87,127;--color-gray-700-rgb:61,70,103;--color-gray-800-rgb:53,61,87;--color-gray-900-rgb:48,57,74;--color-gray-950-rgb:11,15,24;--color-primary-50:#eef6ff;--color-primary-100:#d9eaff;--color-primary-200:#bcdcff;--color-primary-300:#8ec6ff;--color-primary-400:#59a5ff;--color-primary-500:#3883fa;--color-primary-600:#2b67e5;--color-primary-700:#144ce1;--color-primary-800:#173db6;--color-primary-900:#19388f;--color-primary-950:#142457;--color-primary-50-rgb:238,246,255;--color-primary-100-rgb:217,234,255;--color-primary-200-rgb:188,220,255;--color-primary-300-rgb:142,198,255;--color-primary-400-rgb:89,165,255;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:43,103,229;--color-primary-700-rgb:20,76,225;--color-primary-800-rgb:23,61,182;--color-primary-900-rgb:25,56,143;--color-primary-950-rgb:20,36,87;--color-secondary-50:#e7f6ff;--color-secondary-100:#cdecff;--color-secondary-200:#9bd9ff;--color-secondary-300:#77cbff;--color-secondary-400:#60c2ff;--color-secondary-500:#37b2fe;--color-secondary-600:#18a6fd;--color-secondary-700:#1099ed;--color-secondary-800:#078ada;--color-secondary-900:#046bab;--color-secondary-950:#062a4b;--color-secondary-50-rgb:231,246,255;--color-secondary-100-rgb:205,236,255;--color-secondary-200-rgb:155,217,255;--color-secondary-300-rgb:119,203,255;--color-secondary-400-rgb:96,194,255;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:24,166,253;--color-secondary-700-rgb:16,153,237;--color-secondary-800-rgb:7,138,218;--color-secondary-900-rgb:4,107,171;--color-secondary-950-rgb:6,42,75;--color-success-50:#effaf6;--color-success-100:#d6f2e7;--color-success-200:#ade5ce;--color-success-300:#83d7b6;--color-success-400:#5aca9d;--color-success-500:#31bd85;--color-success-600:#2ba675;--color-success-700:#28996c;--color-success-800:#21805a;--color-success-900:#185e3b;--color-success-950:#0e3421;--color-success-50-rgb:239,250,246;--color-success-100-rgb:214,242,231;--color-success-200-rgb:173,229,206;--color-success-300-rgb:131,215,182;--color-success-400-rgb:90,202,157;--color-success-500-rgb:49,189,133;--color-success-600-rgb:43,166,117;--color-success-700-rgb:40,153,108;--color-success-800-rgb:33,128,90;--color-success-900-rgb:24,94,59;--color-success-950-rgb:14,52,33;--color-warning-50:#fff4ea;--color-warning-100:#ffecdb;--color-warning-200:#ffd2a9;--color-warning-300:#ffbc7e;--color-warning-400:#ffaf65;--color-warning-500:#ff9f46;--color-warning-600:#f38f19;--color-warning-700:#ed8307;--color-warning-800:#d17100;--color-warning-900:#af5f01;--color-warning-950:#441506;--color-warning-50-rgb:255,244,234;--color-warning-100-rgb:255,236,219;--color-warning-200-rgb:255,210,169;--color-warning-300-rgb:255,188,126;--color-warning-400-rgb:255,175,101;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:243,143,25;--color-warning-700-rgb:237,131,7;--color-warning-800-rgb:209,113,0;--color-warning-900-rgb:175,95,1;--color-warning-950-rgb:68,21,6;--color-danger-50:#ffebeb;--color-danger-100:#ffd5d5;--color-danger-200:#ffb1b1;--color-danger-300:#ff9292;--color-danger-400:#ff7c7c;--color-danger-500:#fc5959;--color-danger-600:#fb2b2b;--color-danger-700:#d91b1b;--color-danger-800:#ba1313;--color-danger-900:#a20606;--color-danger-950:#470808;--color-danger-50-rgb:255,235,235;--color-danger-100-rgb:255,213,213;--color-danger-200-rgb:255,177,177;--color-danger-300-rgb:255,146,146;--color-danger-400-rgb:255,124,124;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:251,43,43;--color-danger-700-rgb:217,27,27;--color-danger-800-rgb:186,19,19;--color-danger-900-rgb:162,6,6;--color-danger-950-rgb:71,8,8;--color-important-50:#fff8f5;--color-important-100:#ffe2d9;--color-important-200:#ffcebf;--color-important-300:#ffb29b;--color-important-400:#ff8c68;--color-important-500:#ff8058;--color-important-600:#ff6f42;--color-important-700:#ff4912;--color-important-800:#c83509;--color-important-900:#611700;--color-important-950:#440609;--color-important-50-rgb:255,248,245;--color-important-100-rgb:255,226,217;--color-important-200-rgb:255,206,191;--color-important-300-rgb:255,178,155;--color-important-400-rgb:255,140,104;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,111,66;--color-important-700-rgb:255,73,18;--color-important-800-rgb:200,53,9;--color-important-900-rgb:97,23,0;--color-important-950-rgb:68,6,9;--color-special-50:#efecfa;--color-special-100:#e4dff7;--color-special-200:#c4b6ff;--color-special-300:#a38cff;--color-special-400:#8a6ff5;--color-special-500:#8166ee;--color-special-600:#7055df;--color-special-700:#513baa;--color-special-800:#452da5;--color-special-900:#30216e;--color-special-950:#271560;--color-special-50-rgb:239,236,250;--color-special-100-rgb:228,223,247;--color-special-200-rgb:196,182,255;--color-special-300-rgb:163,140,255;--color-special-400-rgb:138,111,245;--color-special-500-rgb:129,102,238;--color-special-600-rgb:112,85,223;--color-special-700-rgb:81,59,170;--color-special-800-rgb:69,45,165;--color-special-900-rgb:48,33,110;--color-special-950-rgb:39,21,96;--color-inherit:inherit;--color-transparent:transparent;--color-current:currentColor;--color-black:#000;--color-white:#fff;--color-canvas:#fff;--color-canvas-light:#fff;--color-canvas-dark:#fcfdfe;--color-inverse:#000;--color-surface:#eff1f3;--color-surface-light:#fcfdfe;--color-surface-strong:#ebedf3;--color-fore:#30394a;--color-fore-in-light:#30394a;--color-fore-in-dark:#fff;--color-focus:#bcdcff;--color-link:#2b47a2;--color-link-hover:#144ce1;--color-link-visited:#6328a4;--color-link-active:#144ce1;--color-placeholder:#64758b;--color-border:#ebedf3;--color-border-strong:#d2d6e5;--color-border-light:#eff1f3;--color-black-rgb:0,0,0;--color-white-rgb:255,255,255;--color-canvas-rgb:255,255,255;--color-canvas-light-rgb:255,255,255;--color-canvas-dark-rgb:252,253,254;--color-inverse-rgb:0,0,0;--color-surface-rgb:239,241,243;--color-surface-light-rgb:252,253,254;--color-surface-strong-rgb:235,237,243;--color-fore-rgb:48,57,74;--color-fore-in-light-rgb:48,57,74;--color-fore-in-dark-rgb:255,255,255;--color-focus-rgb:188,220,255;--color-link-rgb:43,71,162;--color-link-hover-rgb:20,76,225;--color-link-visited-rgb:99,40,164;--color-link-active-rgb:20,76,225;--color-placeholder-rgb:100,117,139;--color-border-rgb:235,237,243;--color-border-strong-rgb:210,214,229;--color-border-light-rgb:239,241,243;--radius-none:0px;--radius-sm:0.0625rem;--radius:0.125rem;--radius-md:0.25rem;--radius-lg:0.375rem;--radius-xl:0.5rem;--radius-2xl:0.75rem;--radius-3xl:1rem;--radius-full:9999px;--shadow-sm:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--shadow-md:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--shadow-lg:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--shadow-xl:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--shadow-2xl:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--shadow-inner:inset 0 2px 4px 0 rgba(0,0,0,.05);--shadow-none:none;--space:0.25rem;--font-size-article:0.875rem;--font-size-root:16px;--font-size-page-lineHeight:1.5384615385}.dark{--color-gray-50:#0b0f18;--color-gray-100:#30394a;--color-gray-200:#353d57;--color-gray-300:#3d4667;--color-gray-400:#4a577f;--color-gray-500:#64758b;--color-gray-600:#b2b9c5;--color-gray-700:#d2d6e5;--color-gray-800:#ebedf3;--color-gray-900:#eff1f3;--color-gray-950:#fcfdfe;--color-gray-50-rgb:11,15,24;--color-gray-100-rgb:48,57,74;--color-gray-200-rgb:53,61,87;--color-gray-300-rgb:61,70,103;--color-gray-400-rgb:74,87,127;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:178,185,197;--color-gray-700-rgb:210,214,229;--color-gray-800-rgb:235,237,243;--color-gray-900-rgb:239,241,243;--color-gray-950-rgb:252,253,254;--color-primary-50:#142457;--color-primary-100:#19388f;--color-primary-200:#173db6;--color-primary-300:#144ce1;--color-primary-400:#2b67e5;--color-primary-500:#3883fa;--color-primary-600:#59a5ff;--color-primary-700:#8ec6ff;--color-primary-800:#bcdcff;--color-primary-900:#d9eaff;--color-primary-950:#eef6ff;--color-primary-50-rgb:20,36,87;--color-primary-100-rgb:25,56,143;--color-primary-200-rgb:23,61,182;--color-primary-300-rgb:20,76,225;--color-primary-400-rgb:43,103,229;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:89,165,255;--color-primary-700-rgb:142,198,255;--color-primary-800-rgb:188,220,255;--color-primary-900-rgb:217,234,255;--color-primary-950-rgb:238,246,255;--color-secondary-50:#062a4b;--color-secondary-100:#046bab;--color-secondary-200:#078ada;--color-secondary-300:#1099ed;--color-secondary-400:#18a6fd;--color-secondary-500:#37b2fe;--color-secondary-600:#60c2ff;--color-secondary-700:#77cbff;--color-secondary-800:#9bd9ff;--color-secondary-900:#cdecff;--color-secondary-950:#e7f6ff;--color-secondary-50-rgb:6,42,75;--color-secondary-100-rgb:4,107,171;--color-secondary-200-rgb:7,138,218;--color-secondary-300-rgb:16,153,237;--color-secondary-400-rgb:24,166,253;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:96,194,255;--color-secondary-700-rgb:119,203,255;--color-secondary-800-rgb:155,217,255;--color-secondary-900-rgb:205,236,255;--color-secondary-950-rgb:231,246,255;--color-success-50:#0e3421;--color-success-100:#185e3b;--color-success-200:#21805a;--color-success-300:#28996c;--color-success-400:#2ba675;--color-success-500:#31bd85;--color-success-600:#5aca9d;--color-success-700:#83d7b6;--color-success-800:#ade5ce;--color-success-900:#d6f2e7;--color-success-950:#effaf6;--color-success-50-rgb:14,52,33;--color-success-100-rgb:24,94,59;--color-success-200-rgb:33,128,90;--color-success-300-rgb:40,153,108;--color-success-400-rgb:43,166,117;--color-success-500-rgb:49,189,133;--color-success-600-rgb:90,202,157;--color-success-700-rgb:131,215,182;--color-success-800-rgb:173,229,206;--color-success-900-rgb:214,242,231;--color-success-950-rgb:239,250,246;--color-warning-50:#441506;--color-warning-100:#af5f01;--color-warning-200:#d17100;--color-warning-300:#ed8307;--color-warning-400:#f38f19;--color-warning-500:#ff9f46;--color-warning-600:#ffaf65;--color-warning-700:#ffbc7e;--color-warning-800:#ffd2a9;--color-warning-900:#ffecdb;--color-warning-950:#fff4ea;--color-warning-50-rgb:68,21,6;--color-warning-100-rgb:175,95,1;--color-warning-200-rgb:209,113,0;--color-warning-300-rgb:237,131,7;--color-warning-400-rgb:243,143,25;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:255,175,101;--color-warning-700-rgb:255,188,126;--color-warning-800-rgb:255,210,169;--color-warning-900-rgb:255,236,219;--color-warning-950-rgb:255,244,234;--color-danger-50:#470808;--color-danger-100:#a20606;--color-danger-200:#ba1313;--color-danger-300:#d91b1b;--color-danger-400:#fb2b2b;--color-danger-500:#fc5959;--color-danger-600:#ff7c7c;--color-danger-700:#ff9292;--color-danger-800:#ffb1b1;--color-danger-900:#ffd5d5;--color-danger-950:#ffebeb;--color-danger-50-rgb:71,8,8;--color-danger-100-rgb:162,6,6;--color-danger-200-rgb:186,19,19;--color-danger-300-rgb:217,27,27;--color-danger-400-rgb:251,43,43;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:255,124,124;--color-danger-700-rgb:255,146,146;--color-danger-800-rgb:255,177,177;--color-danger-900-rgb:255,213,213;--color-danger-950-rgb:255,235,235;--color-important-50:#440609;--color-important-100:#611700;--color-important-200:#c83509;--color-important-300:#ff4912;--color-important-400:#ff6f42;--color-important-500:#ff8058;--color-important-600:#ff8c68;--color-important-700:#ffb29b;--color-important-800:#ffcebf;--color-important-900:#ffe2d9;--color-important-950:#fff8f5;--color-important-50-rgb:68,6,9;--color-important-100-rgb:97,23,0;--color-important-200-rgb:200,53,9;--color-important-300-rgb:255,73,18;--color-important-400-rgb:255,111,66;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,140,104;--color-important-700-rgb:255,178,155;--color-important-800-rgb:255,206,191;--color-important-900-rgb:255,226,217;--color-important-950-rgb:255,248,245;--color-special-50:#271560;--color-special-100:#30216e;--color-special-200:#452da5;--color-special-300:#513baa;--color-special-400:#7055df;--color-special-500:#8166ee;--color-special-600:#8a6ff5;--color-special-700:#a38cff;--color-special-800:#c4b6ff;--color-special-900:#e4dff7;--color-special-950:#efecfa;--color-special-50-rgb:39,21,96;--color-special-100-rgb:48,33,110;--color-special-200-rgb:69,45,165;--color-special-300-rgb:81,59,170;--color-special-400-rgb:112,85,223;--color-special-500-rgb:129,102,238;--color-special-600-rgb:138,111,245;--color-special-700-rgb:163,140,255;--color-special-800-rgb:196,182,255;--color-special-900-rgb:228,223,247;--color-special-950-rgb:239,236,250;--color-canvas:#0b0f18;--color-inverse:#fff;--color-surface:#353d57;--color-surface-light:#30394a;--color-surface-strong:#3d4667;--color-fore:#ebedf3;--color-focus:#173db6;--color-link:#59a5ff;--color-link-hover:#3883fa;--color-link-visited:#bcdcff;--color-link-active:#bcdcff;--color-placeholder:#4a577f;--color-border:#353d57;--color-border-strong:#3d4667;--color-border-light:#30394a;--color-canvas-rgb:11,15,24;--color-inverse-rgb:255,255,255;--color-surface-rgb:53,61,87;--color-surface-light-rgb:48,57,74;--color-surface-strong-rgb:61,70,103;--color-fore-rgb:235,237,243;--color-focus-rgb:23,61,182;--color-link-rgb:89,165,255;--color-link-hover-rgb:56,131,250;--color-link-visited-rgb:188,220,255;--color-link-active-rgb:188,220,255;--color-placeholder-rgb:74,87,127;--color-border-rgb:53,61,87;--color-border-strong-rgb:61,70,103;--color-border-light-rgb:48,57,74}.light-in-dark{--color-gray-50:#fcfdfe;--color-gray-100:#eff1f3;--color-gray-200:#ebedf3;--color-gray-300:#d2d6e5;--color-gray-400:#b2b9c5;--color-gray-500:#64758b;--color-gray-600:#4a577f;--color-gray-700:#3d4667;--color-gray-800:#353d57;--color-gray-900:#30394a;--color-gray-950:#0b0f18;--color-gray-50-rgb:252,253,254;--color-gray-100-rgb:239,241,243;--color-gray-200-rgb:235,237,243;--color-gray-300-rgb:210,214,229;--color-gray-400-rgb:178,185,197;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:74,87,127;--color-gray-700-rgb:61,70,103;--color-gray-800-rgb:53,61,87;--color-gray-900-rgb:48,57,74;--color-gray-950-rgb:11,15,24;--color-primary-50:#eef6ff;--color-primary-100:#d9eaff;--color-primary-200:#bcdcff;--color-primary-300:#8ec6ff;--color-primary-400:#59a5ff;--color-primary-500:#3883fa;--color-primary-600:#2b67e5;--color-primary-700:#144ce1;--color-primary-800:#173db6;--color-primary-900:#19388f;--color-primary-950:#142457;--color-primary-50-rgb:238,246,255;--color-primary-100-rgb:217,234,255;--color-primary-200-rgb:188,220,255;--color-primary-300-rgb:142,198,255;--color-primary-400-rgb:89,165,255;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:43,103,229;--color-primary-700-rgb:20,76,225;--color-primary-800-rgb:23,61,182;--color-primary-900-rgb:25,56,143;--color-primary-950-rgb:20,36,87;--color-secondary-50:#e7f6ff;--color-secondary-100:#cdecff;--color-secondary-200:#9bd9ff;--color-secondary-300:#77cbff;--color-secondary-400:#60c2ff;--color-secondary-500:#37b2fe;--color-secondary-600:#18a6fd;--color-secondary-700:#1099ed;--color-secondary-800:#078ada;--color-secondary-900:#046bab;--color-secondary-950:#062a4b;--color-secondary-50-rgb:231,246,255;--color-secondary-100-rgb:205,236,255;--color-secondary-200-rgb:155,217,255;--color-secondary-300-rgb:119,203,255;--color-secondary-400-rgb:96,194,255;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:24,166,253;--color-secondary-700-rgb:16,153,237;--color-secondary-800-rgb:7,138,218;--color-secondary-900-rgb:4,107,171;--color-secondary-950-rgb:6,42,75;--color-success-50:#effaf6;--color-success-100:#d6f2e7;--color-success-200:#ade5ce;--color-success-300:#83d7b6;--color-success-400:#5aca9d;--color-success-500:#31bd85;--color-success-600:#2ba675;--color-success-700:#28996c;--color-success-800:#21805a;--color-success-900:#185e3b;--color-success-950:#0e3421;--color-success-50-rgb:239,250,246;--color-success-100-rgb:214,242,231;--color-success-200-rgb:173,229,206;--color-success-300-rgb:131,215,182;--color-success-400-rgb:90,202,157;--color-success-500-rgb:49,189,133;--color-success-600-rgb:43,166,117;--color-success-700-rgb:40,153,108;--color-success-800-rgb:33,128,90;--color-success-900-rgb:24,94,59;--color-success-950-rgb:14,52,33;--color-warning-50:#fff4ea;--color-warning-100:#ffecdb;--color-warning-200:#ffd2a9;--color-warning-300:#ffbc7e;--color-warning-400:#ffaf65;--color-warning-500:#ff9f46;--color-warning-600:#f38f19;--color-warning-700:#ed8307;--color-warning-800:#d17100;--color-warning-900:#af5f01;--color-warning-950:#441506;--color-warning-50-rgb:255,244,234;--color-warning-100-rgb:255,236,219;--color-warning-200-rgb:255,210,169;--color-warning-300-rgb:255,188,126;--color-warning-400-rgb:255,175,101;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:243,143,25;--color-warning-700-rgb:237,131,7;--color-warning-800-rgb:209,113,0;--color-warning-900-rgb:175,95,1;--color-warning-950-rgb:68,21,6;--color-danger-50:#ffebeb;--color-danger-100:#ffd5d5;--color-danger-200:#ffb1b1;--color-danger-300:#ff9292;--color-danger-400:#ff7c7c;--color-danger-500:#fc5959;--color-danger-600:#fb2b2b;--color-danger-700:#d91b1b;--color-danger-800:#ba1313;--color-danger-900:#a20606;--color-danger-950:#470808;--color-danger-50-rgb:255,235,235;--color-danger-100-rgb:255,213,213;--color-danger-200-rgb:255,177,177;--color-danger-300-rgb:255,146,146;--color-danger-400-rgb:255,124,124;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:251,43,43;--color-danger-700-rgb:217,27,27;--color-danger-800-rgb:186,19,19;--color-danger-900-rgb:162,6,6;--color-danger-950-rgb:71,8,8;--color-important-50:#fff8f5;--color-important-100:#ffe2d9;--color-important-200:#ffcebf;--color-important-300:#ffb29b;--color-important-400:#ff8c68;--color-important-500:#ff8058;--color-important-600:#ff6f42;--color-important-700:#ff4912;--color-important-800:#c83509;--color-important-900:#611700;--color-important-950:#440609;--color-important-50-rgb:255,248,245;--color-important-100-rgb:255,226,217;--color-important-200-rgb:255,206,191;--color-important-300-rgb:255,178,155;--color-important-400-rgb:255,140,104;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,111,66;--color-important-700-rgb:255,73,18;--color-important-800-rgb:200,53,9;--color-important-900-rgb:97,23,0;--color-important-950-rgb:68,6,9;--color-special-50:#efecfa;--color-special-100:#e4dff7;--color-special-200:#c4b6ff;--color-special-300:#a38cff;--color-special-400:#8a6ff5;--color-special-500:#8166ee;--color-special-600:#7055df;--color-special-700:#513baa;--color-special-800:#452da5;--color-special-900:#30216e;--color-special-950:#271560;--color-special-50-rgb:239,236,250;--color-special-100-rgb:228,223,247;--color-special-200-rgb:196,182,255;--color-special-300-rgb:163,140,255;--color-special-400-rgb:138,111,245;--color-special-500-rgb:129,102,238;--color-special-600-rgb:112,85,223;--color-special-700-rgb:81,59,170;--color-special-800-rgb:69,45,165;--color-special-900-rgb:48,33,110;--color-special-950-rgb:39,21,96;--color-inherit:inherit;--color-transparent:transparent;--color-current:currentColor;--color-black:#000;--color-white:#fff;--color-canvas:#fff;--color-canvas-light:#fff;--color-canvas-dark:#fcfdfe;--color-inverse:#000;--color-surface:#eff1f3;--color-surface-light:#fcfdfe;--color-surface-strong:#ebedf3;--color-fore:#30394a;--color-fore-in-light:#30394a;--color-fore-in-dark:#fff;--color-focus:#bcdcff;--color-link:#2b47a2;--color-link-hover:#144ce1;--color-link-visited:#6328a4;--color-link-active:#144ce1;--color-placeholder:#64758b;--color-border:#ebedf3;--color-border-strong:#d2d6e5;--color-border-light:#eff1f3;--color-black-rgb:0,0,0;--color-white-rgb:255,255,255;--color-canvas-rgb:255,255,255;--color-canvas-light-rgb:255,255,255;--color-canvas-dark-rgb:252,253,254;--color-inverse-rgb:0,0,0;--color-surface-rgb:239,241,243;--color-surface-light-rgb:252,253,254;--color-surface-strong-rgb:235,237,243;--color-fore-rgb:48,57,74;--color-fore-in-light-rgb:48,57,74;--color-fore-in-dark-rgb:255,255,255;--color-focus-rgb:188,220,255;--color-link-rgb:43,71,162;--color-link-hover-rgb:20,76,225;--color-link-visited-rgb:99,40,164;--color-link-active-rgb:20,76,225;--color-placeholder-rgb:100,117,139;--color-border-rgb:235,237,243;--color-border-strong-rgb:210,214,229;--color-border-light-rgb:239,241,243}body{--btn-bg:var(--color-gray-50)}@media (prefers-color-scheme:dark){.dark-auto{--color-gray-50:#0b0f18;--color-gray-100:#30394a;--color-gray-200:#353d57;--color-gray-300:#3d4667;--color-gray-400:#4a577f;--color-gray-500:#64758b;--color-gray-600:#b2b9c5;--color-gray-700:#d2d6e5;--color-gray-800:#ebedf3;--color-gray-900:#eff1f3;--color-gray-950:#fcfdfe;--color-gray-50-rgb:11,15,24;--color-gray-100-rgb:48,57,74;--color-gray-200-rgb:53,61,87;--color-gray-300-rgb:61,70,103;--color-gray-400-rgb:74,87,127;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:178,185,197;--color-gray-700-rgb:210,214,229;--color-gray-800-rgb:235,237,243;--color-gray-900-rgb:239,241,243;--color-gray-950-rgb:252,253,254;--color-primary-50:#142457;--color-primary-100:#19388f;--color-primary-200:#173db6;--color-primary-300:#144ce1;--color-primary-400:#2b67e5;--color-primary-500:#3883fa;--color-primary-600:#59a5ff;--color-primary-700:#8ec6ff;--color-primary-800:#bcdcff;--color-primary-900:#d9eaff;--color-primary-950:#eef6ff;--color-primary-50-rgb:20,36,87;--color-primary-100-rgb:25,56,143;--color-primary-200-rgb:23,61,182;--color-primary-300-rgb:20,76,225;--color-primary-400-rgb:43,103,229;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:89,165,255;--color-primary-700-rgb:142,198,255;--color-primary-800-rgb:188,220,255;--color-primary-900-rgb:217,234,255;--color-primary-950-rgb:238,246,255;--color-secondary-50:#062a4b;--color-secondary-100:#046bab;--color-secondary-200:#078ada;--color-secondary-300:#1099ed;--color-secondary-400:#18a6fd;--color-secondary-500:#37b2fe;--color-secondary-600:#60c2ff;--color-secondary-700:#77cbff;--color-secondary-800:#9bd9ff;--color-secondary-900:#cdecff;--color-secondary-950:#e7f6ff;--color-secondary-50-rgb:6,42,75;--color-secondary-100-rgb:4,107,171;--color-secondary-200-rgb:7,138,218;--color-secondary-300-rgb:16,153,237;--color-secondary-400-rgb:24,166,253;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:96,194,255;--color-secondary-700-rgb:119,203,255;--color-secondary-800-rgb:155,217,255;--color-secondary-900-rgb:205,236,255;--color-secondary-950-rgb:231,246,255;--color-success-50:#0e3421;--color-success-100:#185e3b;--color-success-200:#21805a;--color-success-300:#28996c;--color-success-400:#2ba675;--color-success-500:#31bd85;--color-success-600:#5aca9d;--color-success-700:#83d7b6;--color-success-800:#ade5ce;--color-success-900:#d6f2e7;--color-success-950:#effaf6;--color-success-50-rgb:14,52,33;--color-success-100-rgb:24,94,59;--color-success-200-rgb:33,128,90;--color-success-300-rgb:40,153,108;--color-success-400-rgb:43,166,117;--color-success-500-rgb:49,189,133;--color-success-600-rgb:90,202,157;--color-success-700-rgb:131,215,182;--color-success-800-rgb:173,229,206;--color-success-900-rgb:214,242,231;--color-success-950-rgb:239,250,246;--color-warning-50:#441506;--color-warning-100:#af5f01;--color-warning-200:#d17100;--color-warning-300:#ed8307;--color-warning-400:#f38f19;--color-warning-500:#ff9f46;--color-warning-600:#ffaf65;--color-warning-700:#ffbc7e;--color-warning-800:#ffd2a9;--color-warning-900:#ffecdb;--color-warning-950:#fff4ea;--color-warning-50-rgb:68,21,6;--color-warning-100-rgb:175,95,1;--color-warning-200-rgb:209,113,0;--color-warning-300-rgb:237,131,7;--color-warning-400-rgb:243,143,25;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:255,175,101;--color-warning-700-rgb:255,188,126;--color-warning-800-rgb:255,210,169;--color-warning-900-rgb:255,236,219;--color-warning-950-rgb:255,244,234;--color-danger-50:#470808;--color-danger-100:#a20606;--color-danger-200:#ba1313;--color-danger-300:#d91b1b;--color-danger-400:#fb2b2b;--color-danger-500:#fc5959;--color-danger-600:#ff7c7c;--color-danger-700:#ff9292;--color-danger-800:#ffb1b1;--color-danger-900:#ffd5d5;--color-danger-950:#ffebeb;--color-danger-50-rgb:71,8,8;--color-danger-100-rgb:162,6,6;--color-danger-200-rgb:186,19,19;--color-danger-300-rgb:217,27,27;--color-danger-400-rgb:251,43,43;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:255,124,124;--color-danger-700-rgb:255,146,146;--color-danger-800-rgb:255,177,177;--color-danger-900-rgb:255,213,213;--color-danger-950-rgb:255,235,235;--color-important-50:#440609;--color-important-100:#611700;--color-important-200:#c83509;--color-important-300:#ff4912;--color-important-400:#ff6f42;--color-important-500:#ff8058;--color-important-600:#ff8c68;--color-important-700:#ffb29b;--color-important-800:#ffcebf;--color-important-900:#ffe2d9;--color-important-950:#fff8f5;--color-important-50-rgb:68,6,9;--color-important-100-rgb:97,23,0;--color-important-200-rgb:200,53,9;--color-important-300-rgb:255,73,18;--color-important-400-rgb:255,111,66;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,140,104;--color-important-700-rgb:255,178,155;--color-important-800-rgb:255,206,191;--color-important-900-rgb:255,226,217;--color-important-950-rgb:255,248,245;--color-special-50:#271560;--color-special-100:#30216e;--color-special-200:#452da5;--color-special-300:#513baa;--color-special-400:#7055df;--color-special-500:#8166ee;--color-special-600:#8a6ff5;--color-special-700:#a38cff;--color-special-800:#c4b6ff;--color-special-900:#e4dff7;--color-special-950:#efecfa;--color-special-50-rgb:39,21,96;--color-special-100-rgb:48,33,110;--color-special-200-rgb:69,45,165;--color-special-300-rgb:81,59,170;--color-special-400-rgb:112,85,223;--color-special-500-rgb:129,102,238;--color-special-600-rgb:138,111,245;--color-special-700-rgb:163,140,255;--color-special-800-rgb:196,182,255;--color-special-900-rgb:228,223,247;--color-special-950-rgb:239,236,250;--color-canvas:#0b0f18;--color-inverse:#fff;--color-surface:#353d57;--color-surface-light:#30394a;--color-surface-strong:#3d4667;--color-fore:#ebedf3;--color-focus:#173db6;--color-link:#59a5ff;--color-link-hover:#3883fa;--color-link-visited:#bcdcff;--color-link-active:#bcdcff;--color-placeholder:#4a577f;--color-border:#353d57;--color-border-strong:#3d4667;--color-border-light:#30394a;--color-canvas-rgb:11,15,24;--color-inverse-rgb:255,255,255;--color-surface-rgb:53,61,87;--color-surface-light-rgb:48,57,74;--color-surface-strong-rgb:61,70,103;--color-fore-rgb:235,237,243;--color-focus-rgb:23,61,182;--color-link-rgb:89,165,255;--color-link-hover-rgb:56,131,250;--color-link-visited-rgb:188,220,255;--color-link-active-rgb:188,220,255;--color-placeholder-rgb:74,87,127;--color-border-rgb:53,61,87;--color-border-strong-rgb:61,70,103;--color-border-light-rgb:48,57,74}}*,:after,:before{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}:focus-visible{outline-color:transparent}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }html{font-size:var(--font-size-root)}body{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));font-size:.8125rem;line-height:1.5384615385}.dark,body{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}:root{--font-h1-size:2.25rem;--article-p-space:0.5em;--article-heading-space:0.5em;--article-hr-space:1.5em;--article-cell-padding:0.25rem 0.75rem}a,a.disabled:hover{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}a:hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}a:focus-visible{outline-color:rgb(var(--color-focus-rgb));outline-offset:2px;outline-width:2px}.code,code{background-color:rgba(var(--color-important-500-rgb),.1);border-radius:var(--radius);padding-left:.25rem;padding-right:.25rem;--tw-text-opacity:1;color:rgba(var(--color-important-500-rgb),var(--tw-text-opacity))}pre{font-size:.75rem;line-height:1rem;overflow:auto;padding:.5rem}pre code{background-color:transparent;color:inherit;padding:0}samp,var{font-weight:700}.blockquote,blockquote{border-left-width:4px;font-size:.875rem;line-height:1.3rem;padding-left:.75rem;text-wrap:pretty}.blockquote figcaption,blockquote figcaption{font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.5;text-wrap:balance}.h1,h1{font-size:1.75rem}.h2,h2{font-size:1.5rem}.h3,h3{font-size:1.25rem}.h4,h4{font-size:1rem}.h5,h5{font-size:.875rem}.h6,h6{font-size:.75rem}ul{list-style-type:disc}ol,ul{padding-left:1.5em}ol{list-style-type:decimal}dt{font-weight:700}dd{padding-left:2em}.article{color:var(--font-size-article);-webkit-hyphens:auto;hyphens:auto;overflow-wrap:break-word;white-space:pre-wrap}.article h1,.article h2,.article h3,.article h4{margin-bottom:var(--article-heading-space);margin-top:var(--article-heading-space)}.article audio,.article blockquote,.article figure,.article img,.article ol,.article p,.article table,.article ul,.article video{margin-bottom:var(--article-p-space);margin-top:var(--article-p-space);text-wrap:pretty}.article p{min-height:1em}.article p:empty:before{content:" ";display:inline-block}.article hr{margin-bottom:var(--article-hr-space);margin-top:var(--article-hr-space)}.article table{border-width:1px}.article td,.article th{border-bottom-width:1px;padding:var(--article-cell-padding)}.article thead{background-color:var(--table-head-bg,var(--color-gray-100))}.article ol *,.article table *,.article ul *{margin-bottom:0;margin-top:0}.article pre{border-radius:var(--radius);border-width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity))}:root{--alert-bg:var(--color-surface)}.alert{align-items:center;background-color:var(--alert-bg);border-radius:var(--radius);display:flex;gap:.75rem;padding:.5rem .75rem}.alert-content{display:flex;flex:1 1 auto;flex-direction:column;gap:1rem}.alert-close{margin-bottom:-.375rem;margin-right:-.5rem;margin-top:-.375rem}.alert-link{color:inherit;font-weight:700}.alert-link:hover{color:inherit;text-decoration-line:underline}.alert-heading{font-weight:700;margin:0}.alert-text{flex:1 1 auto;white-space:pre-line}.alert-actions{align-items:center;display:flex;gap:.5rem}:root{--breadcrumb-divider:"/";--breadcrumb-divider-color:var(--color-gray-500);--breadcrumb-color-active:var(--color-gray-500)}.breadcrumb{display:flex;gap:1.25rem;list-style-type:none;padding-left:0}.breadcrumb>li{position:relative}.breadcrumb>li+li:before{color:var(--breadcrumb-divider-color);content:var(--breadcrumb-divider);display:block;left:-1.25rem;position:absolute;text-align:center;width:1.25rem}.breadcrumb>.active{color:var(--breadcrumb-color-active)}:root{--btn-radius:var(--radius);--btn-bg:var(--color-surface);--btn-border-color:var(--color-gray-300);--btn-height:2rem}.btn{align-items:center;background-color:var(--btn-bg);border-radius:var(--btn-radius);display:inline-flex;gap:.375rem;height:var(--btn-height);justify-content:center;padding-left:.75rem;padding-right:.75rem;white-space:nowrap;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--btn-border-color)}.btn,.btn-default:hover{color:inherit}.btn-link{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity));text-decoration-line:underline;text-underline-offset:2px;--tw-ring-color:transparent}.btn-link:visited{color:rgba(var(--color-link-visited-rgb),var(--tw-text-opacity))}.btn-link:hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}.btn-link{--btn-bg:transparent}.btn.size-xs,.size-xs>.btn{padding-left:.25rem;padding-right:.25rem;--btn-height:1.25rem}.btn.size-sm,.btn.size-xs,.size-sm>.btn,.size-xs>.btn{font-size:.75rem;line-height:1rem}.btn.size-sm,.size-sm>.btn{--btn-height:1.5rem}.btn.size-md,.btn.size-sm,.size-md>.btn,.size-sm>.btn{padding-left:.5rem;padding-right:.5rem}.btn.size-md,.size-md>.btn{--btn-height:1.75rem}.btn.size-lg,.size-lg>.btn{font-size:1rem;line-height:1.5rem;padding-left:1rem;padding-right:1rem;--btn-height:2.5rem}.btn.size-xl,.size-xl>.btn{font-size:1.125rem;line-height:1.75rem;padding-left:1.25rem;padding-right:1.25rem;--btn-height:3rem}.btn.square{aspect-ratio:1/1;gap:.125rem;padding-left:0;padding-right:0}@supports not (aspect-ratio:1/1){.btn.square{width:var(--btn-height)}}.btn.btn-caret{padding-left:.25rem;padding-right:.25rem}.btn.btn-wide{min-width:80px}:root{--checkbox-size:12px;--checkbox-color:var(--color-primary-500)}.checkbox,.radio{align-items:center;cursor:pointer;display:flex;gap:.375rem;min-height:20px}.checkbox>input[type=checkbox],.radio>input[type=radio]{accent-color:rgb(var(--color-primary-500-rgb));border-radius:var(--radius-lg)}.checkbox-primary,.radio-primary{display:flex;gap:.375rem;min-height:20px;position:relative}.checkbox-primary>input[type=checkbox],.radio-primary>input[type=radio]{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.checkbox-primary>label,.radio-primary>label{cursor:pointer;padding-left:calc(var(--checkbox-size) + 8px);position:relative}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{display:block;height:var(--checkbox-size);left:0;position:absolute;transition-duration:.15s;transition-property:transform,background-color,color,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--checkbox-size);--tw-content:"";content:var(--tw-content);top:calc((20px - var(--checkbox-size))/2)}.checkbox-primary>label:before{border-radius:var(--radius-sm);border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.checkbox-primary>label:after{--tw-scale-x:.9;--tw-scale-y:.9;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTkgMjAuNDItNi4yMS02LjIxIDIuODMtMi44M0w5IDE0Ljc3bDkuODgtOS44OSAyLjgzIDIuODN6Ii8+PC9zdmc+");transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.radio-primary>label:before{border-radius:var(--radius-full);border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.radio-primary>label:after{background-color:var(--checkbox-color);border-radius:var(--radius-full);opacity:0;--checkbox-radio-size:calc(var(--checkbox-size)*2/3);height:var(--checkbox-radio-size);left:calc((var(--checkbox-size) - var(--checkbox-radio-size))/2);top:calc((20px - var(--checkbox-radio-size))/2);width:var(--checkbox-radio-size)}.checkbox-primary>label:hover:before,.radio-primary>label:hover:before{border-color:var(--checkbox-color)}.checkbox-primary.focus>label:before,.checkbox-primary>input[type=checkbox]:focus+label:before,.radio-primary.focus>label:before,.radio-primary>input[type=radio]:focus+label:before{border-color:var(--checkbox-color);outline-color:rgb(var(--color-focus-rgb));outline-style:solid;outline-width:2px}.checkbox-primary.checked>label:before,.checkbox-primary>input[type=checkbox]:checked+label:before{background-color:var(--checkbox-color);border-color:var(--checkbox-color)}.radio-primary.checked>label:before,.radio-primary>input[type=radio]:checked+label:before{border-color:var(--checkbox-color)}.checkbox-primary.checked>label:after,.checkbox-primary>input[type=checkbox]:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input[type=radio]:checked+label:after{opacity:1}.checkbox-primary.disabled>label,.checkbox-primary>input[type=checkbox]:disabled+label,.radio-primary.disabled>label,.radio-primary>input[type=radio]:disabled+label{cursor:not-allowed;opacity:.7;pointer-events:none;--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.checkbox-primary.indeterminate>label:after,.checkbox-primary>input[type=checkbox]:indeterminate+label:after{--tw-border-opacity:1;background-color:var(--checkbox-color);background-image:none;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity));border-width:calc((var(--checkbox-size) - 2px)/2) 2px;opacity:1}.check-list{align-items:flex-start;flex-direction:column;gap:.5rem}.check-list,.check-list-inline{display:flex;padding-bottom:.375rem;padding-top:.375rem}.check-list-inline{align-items:center;-moz-column-gap:1rem;column-gap:1rem;flex-direction:row;flex-wrap:wrap;row-gap:.5rem}.switch{display:flex;gap:.375rem;min-height:20px;padding-left:2.5rem;position:relative}.switch>input{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.switch>label:after,.switch>label:before{border-radius:var(--radius-full);border-width:1px;height:1rem;left:0;position:absolute;top:.125rem;width:2rem;--tw-border-opacity:1;border-color:rgba(var(--color-border-strong-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:"";content:var(--tw-content)}.switch>label:before{cursor:pointer;--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.switch>label:hover:before{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}.switch>label:after{height:.75rem;left:.125rem;top:.25rem;width:.75rem;--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.switch>input:checked+label:before{background-color:var(--checkbox-color);border-color:rgba(var(--color-inverse-rgb),.2)}.switch>input:checked+label:after{color:var(--checkbox-color);left:18px}.switch.focus>label:before,.switch>input:focus+label:before{border-color:var(--checkbox-color);outline-color:rgb(var(--color-focus-rgb));outline-style:solid;outline-width:2px}.switch.disabled>label:before,.switch>input:disabled+label:before{cursor:not-allowed;opacity:.7;pointer-events:none;--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:root{--form-control-radius:var(--radius);--form-control-border:var(--color-border);--form-control-focus:var(--color-primary-500);--form-control-disabled:var(--color-surface);--form-control-readonly:var(--color-surface)}.dark{--form-control-border:var(--color-border-strong)}input::-moz-placeholder,textarea::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-placeholder-opacity))}input::placeholder,textarea::placeholder{--tw-placeholder-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-placeholder-opacity))}.form-control{border-radius:var(--form-control-radius);display:block;height:2rem;width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));outline-color:transparent;outline-style:solid;outline-width:1px;padding:.25rem .5rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--form-control-border);transition-duration:.15s;transition-property:outline,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.form-control.focus,.form-control:focus{outline-color:var(--form-control-focus);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-focus-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.3}.form-control.disabled,.form-control[disabled]{background-color:var(--form-control-disabled);opacity:1}.form-control.readonly,.form-control[readonly]{background-color:var(--form-control-readonly)}select{-webkit-appearance:none;background-image:url("data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==");background-position:right 8px top 50%;background-repeat:no-repeat;background-size:8px auto;padding-right:1rem}select.form-control[multiple]{background-image:none}textarea.form-control{height:auto;min-height:32px}input[type=file].form-control{padding:.125rem}input[type=file].form-control::-webkit-file-upload-button{-webkit-appearance:none;appearance:none;border-radius:inherit;border-style:none;cursor:pointer;height:1.75rem;padding-left:.5rem;padding-right:.5rem}input[type=file].form-control::-webkit-file-upload-button:hover{background-color:rgba(var(--color-black-rgb),.1)}.has-error .form-control,.has-error.form-control{--tw-ring-color:rgba(var(--color-danger-500-rgb),0.6)}.has-error .form-control.focus,.has-error .form-control:focus,.has-error.form-control.focus,.has-error.form-control:focus{outline-color:rgb(var(--color-danger-500-rgb));--tw-ring-color:rgba(var(--color-danger-500-rgb),0.1)}.has-warning .form-control,.has-warning.form-control{--tw-ring-color:rgba(var(--color-warning-500-rgb),0.6)}.has-warning .form-control.focus,.has-warning .form-control:focus,.has-warning.form-control.focus,.has-warning.form-control:focus{outline-color:rgb(var(--color-warning-500-rgb));--tw-ring-color:rgba(var(--color-warning-500-rgb),0.2)}.has-success .form-control,.has-success.form-control{--tw-ring-color:rgba(var(--color-success-500-rgb),0.6)}.has-success .form-control.focus,.has-success .form-control:focus,.has-success.form-control.focus,.has-success.form-control:focus{outline-color:rgb(var(--color-success-500-rgb));--tw-ring-color:rgba(var(--color-success-500-rgb),0.2)}.form-control.size-sm,.size-sm>.form-control{font-size:.75rem;height:1.5rem;line-height:1rem;padding-left:.5rem;padding-right:.5rem}.form-control.size-md,.size-md>.form-control{height:1.75rem;padding-left:.5rem;padding-right:.5rem}.form-control.size-lg,.size-lg>.form-control{font-size:1rem;height:2.5rem;line-height:1.5rem;padding-left:.75rem;padding-right:.75rem}:root{--input-group-addon-bg:var(--color-gray-50)}.input-group{align-items:stretch;display:flex}.input-group>.form-control,.input-group>.input-control{flex:1 1 auto;z-index:1}.input-group-addon{align-items:center;background-color:var(--input-group-addon-bg);border-radius:var(--form-control-radius);display:flex;flex:none;height:2rem;padding-left:.5rem;padding-right:.5rem;z-index:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--form-control-border)}.size-sm>.input-group-addon{font-size:.75rem;height:1.5rem;line-height:1rem;padding-left:.5rem;padding-right:.5rem}.size-lg>.input-group-addon{font-size:1rem;height:2.5rem;line-height:1.5rem;padding-left:.75rem;padding-right:.75rem}.input-group-control{flex:1 1 auto}.input-group>*+*,.input-group>*+* .form-control{border-bottom-left-radius:var(--radius-none);border-top-left-radius:var(--radius-none)}.input-group>:not(:last-child),.input-group>:not(:last-child) .form-control{border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none)}.input-group .btn:focus-visible,.input-group .form-control:focus{z-index:2}:root{--form-tip-color:var(--color-gray-400);--form-label-color:var(--color-gray-700);--form-horz-label-width:6rem;--form-grid-gap-x:1.25rem;--form-grid-gap-y:.75rem}.form{flex-direction:column;gap:1rem}.form,.form-label{display:flex}.form-label{align-items:center;color:var(--form-label-color);flex-direction:row;gap:.25rem;height:2rem;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.form-label.required:after{content:"*";display:inline-block;margin-left:.25rem;--tw-translate-y:0.125rem;--tw-scale-x:1.25;--tw-scale-y:1.25;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.no-required .form-label.required:after{display:none}.form-label-actions{flex:1 1 auto;justify-content:flex-end}.form-label>.checkbox-primary{margin-left:.75rem}.form-tip{color:var(--form-tip-color);display:block;margin-top:.25rem}.has-error .form-tip{--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.has-warning .form-tip{--tw-text-opacity:1;color:rgba(var(--color-warning-500-rgb),var(--tw-text-opacity))}.has-success .form-tip{--tw-text-opacity:1;color:rgba(var(--color-success-500-rgb),var(--tw-text-opacity))}.form-actions{display:flex;flex-direction:row;gap:1rem;justify-content:center}.form-grid{--form-grid-gap-x-half:calc(var(--form-grid-gap-x)/2);--form-grid-gap-y-half:calc(var(--form-grid-gap-y)/2);align-items:flex-start;flex-direction:row;flex-wrap:wrap;gap:0}.form-grid .form-group{padding:var(--form-grid-gap-y-half) var(--form-grid-gap-x-half)}.form-grid .form-label.required:after{margin-left:.25rem;order:-9999}.form-grid .form-label .checkbox{margin-left:.75rem;margin-right:.75rem}.form-grid .has-wrap-after:after{display:block;width:100%;--tw-content:"";content:var(--tw-content)}.form-grid-wrap{width:100%}.form-grid-row{display:flex;flex-direction:row;padding-bottom:var(--form-grid-gap-y-half);padding-top:var(--form-grid-gap-y-half);position:relative;width:100%}.form-grid-col{padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half)}.form-grid .form-actions{gap:1.5rem;justify-content:center;padding:var(--form-grid-gap-y) var(--form-grid-gap-x-half);width:100%}.form-grid .form-actions.is-pinned{border-top-width:1px}.form-horz .form-row{align-items:flex-start;display:flex;flex-direction:row}.form-horz .form-group{align-items:flex-start;display:flex;flex:none;flex-direction:row;flex-wrap:wrap;min-height:32px;min-width:0;padding-left:var(--form-horz-label-width);position:relative}.form-horz .form-row .form-group{flex:1 1 auto}.form-horz .form-group[class*=" w-"],.form-horz .form-group[class^=w-]{flex:none}.form-horz .form-group>*{min-width:0}.form-horz .form-group.no-label{padding-left:0}.form-horz .form-group.no-label>.check-list-inline{padding-left:1rem;padding-right:1rem}.form-horz .form-label{justify-content:flex-end;left:0;padding-left:1rem;padding-right:.5rem;position:absolute;top:0;width:var(--form-horz-label-width)}.form-horz .form-label.required:after{margin-left:0;order:-9999}.form-horz .form-tip{width:100%}.form-horz .form-tip,.form-horz .input-control,.form-horz .input-group{flex:1 1 auto}.form .form-group-wrapper,.form-horz .form-group-wrapper{flex:1 1 auto;min-width:0;width:100%;z-index:1}.form .form-group-wrapper.flex-none,.form-horz .form-group-wrapper.flex-none{flex:none}.form fieldset>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.form fieldset{padding-bottom:1rem;padding-left:1rem}.form-grid fieldset>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.form legend{border-bottom-width:1px;display:flex;justify-content:flex-start;margin-left:-1rem;width:100%;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-primary-100-rgb),var(--tw-border-opacity));width:calc(100% + 1rem)}.form-title{align-items:center;background-color:rgba(var(--color-primary-50-rgb),.5);display:flex;font-weight:700;height:1.75rem;padding-left:.75rem;padding-right:.75rem}:root{--input-control-fix-width-sm:2rem;--input-control-fix-width:4.375rem;--input-control-fix-width-lg:6.75rem}.input-control{position:relative;--input-control-prefix:8px;--input-control-suffix:8px}.input-control-prefix,.input-control-suffix{align-items:center;display:flex;height:100%;left:0;opacity:.5;padding-left:.5rem;padding-right:.5rem;position:absolute;top:0;white-space:nowrap;width:var(--input-control-prefix);z-index:1}.input-control-suffix{justify-content:flex-end;left:auto;right:0;width:var(--input-control-suffix)}.form-control:focus+.input-control-prefix,.form-control:focus+.input-control-suffix{opacity:1}.input-control>.form-control{padding-left:var(--input-control-prefix);padding-right:var(--input-control-suffix)}.input-control>select.form-control{background-position-x:calc(100% - var(--input-control-suffix) - 8px);padding-right:calc(var(--input-control-suffix) + 20px)}.has-prefix{--input-control-prefix:var(--input-control-fix-width)}.has-suffix{--input-control-suffix:var(--input-control-fix-width)}.has-prefix-sm{--input-control-prefix:var(--input-control-fix-width-sm)}.has-suffix-sm{--input-control-suffix:var(--input-control-fix-width-sm)}.has-prefix-lg{--input-control-prefix:var(--input-control-fix-width-lg)}.has-suffix-lg{--input-control-suffix:var(--input-control-fix-width-lg)}.has-prefix-icon{--input-control-prefix:32px}.has-suffix-icon{--input-control-suffix:32px}.input-control.has-prefix-icon{--input-control-prefix:32px}.input-control.has-suffix-icon{--input-control-suffix:32px}.input-control.has-prefix-icon>.input-control-prefix,.input-control.has-suffix-icon>.input-control-suffix{justify-content:center;padding:0}.input-control.size-sm>.form-control,.input-control.size-sm>.input-control-prefix,.input-control.size-sm>.input-control-suffix{font-size:.75rem;line-height:1rem}.input-control.size-lg>.form-control,.input-control.size-lg>.input-control-prefix,.input-control.size-lg>.input-control-suffix{font-size:1rem;line-height:1.5rem}:root{--label-bg:rgba(var(--color-canvas-rgb),.1);--label-border-color:var(--color-gray-300);--label-color:var(--color-gray-500);--label-radius:var(--radius)}.label{align-items:center;background-color:var(--label-bg);border-radius:var(--label-radius);color:var(--label-color);display:inline-flex;font-size:.75rem;height:1.25rem;justify-content:center;line-height:1rem;min-width:1.25rem;padding-left:.25rem;padding-right:.25rem;white-space:pre-line;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--label-border-color)}.label.size-lg{font-size:.8125rem;height:1.5rem;line-height:1.25rem;min-width:1.5rem;padding-left:.5rem;padding-right:.5rem}.label.size-sm{height:1rem;min-width:1rem}.label-dot{aspect-ratio:1/1;border-radius:var(--radius-full);height:.5rem;min-width:0;padding-left:0;padding-right:0}.caret,.caret-down,.caret-left,.caret-right,.caret-up{align-items:center;display:inline-flex;height:.75rem;justify-content:center;position:relative;width:.75rem}.caret-down:before,.caret-left:before,.caret-right:before,.caret-up:before,.caret:before{display:block;height:.35rem;transform-origin:center;width:.35rem;--tw-translate-y:-1px;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.caret-left:before{--tw-translate-x:0.125rem;--tw-translate-y:0px;--tw-rotate:135deg}.caret-left:before,.caret-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.caret-right:before{--tw-translate-x:-0.125rem;--tw-translate-y:0px;--tw-rotate:-45deg}.caret-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:focus>.caret,:hover>.caret{opacity:inherit}.disabled .caret,.readonly .caret{opacity:var(--caret-opacity,.5)}.listitem{align-items:center;border-radius:var(--radius);display:flex;flex-direction:row;flex-wrap:nowrap;gap:.5rem;padding:.25rem}.listitem.selected{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.listitem.active{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.item-actions,.item-avatar,.item-icon,.item-trailing,.item-trailing-icon{flex:none}.item-icon.icon-EMPTY{display:none}.item-subtitle{font-size:.75rem;line-height:1rem;opacity:.8}.item-content,.item-text{flex:1 1 auto;min-width:0}.item-leading,.item-trailing{align-items:center;display:flex;flex:none;gap:.5rem}.item-checkbox{margin-right:-.5rem}.item-content{align-items:center;display:flex;gap:.5rem}.multiline>.item-content{align-items:flex-start;flex-direction:column;gap:.25rem}.list{list-style-type:none;padding-left:0}.list-heading-inner .item-title{font-weight:700;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.with-hover-actions>.item{position:relative}.with-hover-actions>.item>.item-inner .item-actions{opacity:0;pointer-events:none;position:absolute;right:.25rem;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.with-hover-actions>.item>.item-inner:hover .item-actions{display:flex;margin-top:-.25rem;opacity:1;pointer-events:auto;position:static}.list.is-nested-sub{padding-left:var(--list-indent)}.is-nested-collapsed{display:none}.nested-toggle-icon{align-items:center;border-radius:var(--radius);display:flex;height:1rem;justify-content:center;margin-right:-.25rem;width:1rem}.magnifier{display:inline-block;height:1em;position:relative;width:1em}.magnifier:after,.magnifier:before{border-radius:var(--radius-full);content:"";display:block;position:absolute}.magnifier:before{border:1px solid;height:.75em;width:.75em}.magnifier:after{height:1px;left:.55em;top:.7em;width:.5em;--tw-rotate:45deg;background-color:currentColor;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.search-box.compact.has-prefix-icon{--input-control-prefix:24px}.search-box.compact.has-suffix-icon{--input-control-suffix:24px}:root{--menu-bg:var(--color-canvas);--menu-active-bg:var(--color-primary-500);--menu-active-color:var(--color-canvas);--menu-selected-bg:var(--color-primary-50);--menu-selected-color:var(--color-primary-500);--menu-icon-opacity:.5;--menu-icon-margin:1.75rem;--menu-min-width:3rem;--menu-heading-color:var(--color-gray-500)}.menu{background:var(--menu-bg);max-width:var(--menu-max-width);min-width:var(--menu-min-width);padding:.5rem}.menu-wrapper{display:flex;flex-direction:column;min-height:0}.menu-wrapper>.menu{flex:1 1 auto;min-height:0;overflow:auto}.menu-item>.item-inner,.menu-item>a{align-items:center;border-radius:var(--radius);color:inherit;cursor:pointer;display:flex;gap:.5rem;justify-content:space-between;overflow:hidden;padding:.25rem .5rem;position:relative;text-overflow:ellipsis;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);white-space:nowrap}.menu-item>.selected{background:var(--menu-selected-bg);color:var(--menu-selected-color)}.menu-item>.active,.menu-item>a.hover,.menu-item>a:hover{background:var(--menu-active-bg);color:var(--menu-active-color)}.menu-item>a.no-hover.hover,.menu-item>a.no-hover:hover{background:unset;color:unset}.menu-item.disabled>a:hover,.menu-item>a.disabled:hover{background-color:inherit;color:inherit}.menu-item .item-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:clip;white-space:nowrap}.menu>.divider{margin:.25rem}.menu-heading{align-items:center;color:var(--menu-heading-color);display:flex;font-size:.75rem;font-weight:700;height:2rem;line-height:1rem;padding-left:.25rem;padding-right:.25rem}.has-icons>.menu-item>a>.item-icon{align-items:center;display:flex;height:1rem;justify-content:center;opacity:var(--menu-icon-opacity);width:1rem}.menu-nested{--menu-indent:10px}.menu-nested .menu{background-color:transparent;margin-bottom:-.5rem;margin-left:var(--menu-indent);margin-top:-.5rem;padding-right:0}.menu-nested .menu-item>.item-inner{padding-left:0}.menu-nested .search-menu-footer,.menu-nested .search-menu-header{margin-bottom:.25rem;margin-left:var(--menu-indent);margin-top:-.125rem;padding-right:1px}.menu.compact .menu-item>a{padding-bottom:.125rem;padding-top:.125rem}.menu.compact .menu-heading{height:1.75rem}.search-menu-header{padding:.5rem .5rem .125rem}.search-menu-footer{padding:.125rem .5rem .5rem}.search-menu .item.is-not-match,.search-menu-footer:empty,.search-menu-header:empty{display:none}.search-menu .item.is-not-match.has-match-child{display:list-item}.search-menu .item.is-not-match.has-match-child>.item-inner{opacity:.5;pointer-events:none}.search-menu.no-toggle-on-search .nested-toggle-icon{pointer-events:none}.search-menu .is-match-keys{font-weight:700;text-decoration-line:underline}.search-menu-no-match-hint{display:none;font-size:.75rem;line-height:1rem;padding:.5rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.no-match-child .search-menu-no-match-hint{display:block}.no-match-child>.menu{display:none}.search-menu-exceed-limit-hint{font-size:.75rem;line-height:1rem;padding:.25rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}:root{--alert-bg:var(--color-surface)}.alert{align-items:center;background-color:var(--alert-bg);border-radius:var(--radius);display:flex;gap:.75rem;padding:.5rem .75rem}.alert-content{display:flex;flex:1 1 auto;flex-direction:column;gap:1rem}.alert-close{margin-bottom:-.375rem;margin-right:-.5rem;margin-top:-.375rem}.alert-link{color:inherit;font-weight:700}.alert-link:hover{color:inherit;text-decoration-line:underline}.alert-heading{font-weight:700;margin:0}.alert-text{flex:1 1 auto;white-space:pre-line}.alert-actions{align-items:center;display:flex;gap:.5rem}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.messagers{align-items:flex-end;bottom:0;display:flex;flex-direction:column;gap:.5rem;justify-content:flex-end;left:0;padding:1rem;pointer-events:none;position:fixed;right:0;top:0;z-index:1900}.messagers-top-left,.messagers-top-right{justify-content:flex-start}.messagers-bottom-left,.messagers-top-left{align-items:flex-start}.messagers-bottom,.messagers-center,.messagers-top{align-items:center}.messagers-top,.messagers-top-left,.messagers-top-right{justify-content:flex-start}.messagers-center{justify-content:center}.messager{background-color:rgba(var(--color-inverse-rgb),.8);pointer-events:auto;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);transition-duration:.3s}:root{--progress-radius:var(--radius);--progress-striped-size:40px;--progress-bg:var(--color-surface);--progress-bar-color:var(--color-primary-500)}.progress{background:var(--progress-bg);border-radius:var(--progress-radius);display:flex;height:1.25rem}.progress-bar{background:var(--progress-bar-color);height:100%;transition-duration:.5s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1)}.progress-striped>.progress-bar{background-image:linear-gradient(45deg,rgba(var(--color-canvas-rgb),.15) 25%,transparent 25%,transparent 50%,rgba(var(--color-canvas-rgb),.15) 50%,rgba(var(--color-canvas-rgb),.15) 75%,transparent 75%,transparent);background-size:var(--progress-striped-size) var(--progress-striped-size)}.progress>.progress-bar:first-child{border-bottom-left-radius:inherit;border-top-left-radius:inherit}.progress>.progress-bar:last-child{border-bottom-right-radius:inherit;border-top-right-radius:inherit}.progress.active .progress-bar{animation:progress-bar-stripes 2s linear infinite}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.scrollbar,:root{--scrollbar-size:10px;--scrollbar-opacity:.6;--scrollbar-bg:rgba(var(--color-inverse-rgb),.15);--scrollbar-inset:inset 0 0 0 1px rgba(var(--color-inverse-rgb),.05);--scrollbar-bar-bg:rgba(var(--color-inverse-rgb),.3);--scrollbar-hover-bg:rgba(var(--color-inverse-rgb),.4);--scrollbar-drag-bg:rgba(var(--color-inverse-rgb),.5);--scrollbar-radius:var(--radius-sm);--scrollbar-duration:.7s}::-webkit-scrollbar{height:var(--scrollbar-size);width:var(--scrollbar-size)}::-webkit-scrollbar-track{background:var(--scrollbar-bg);box-shadow:var(--scrollbar-shadow);-webkit-transition:background-color var(--scrollbar-duration);transition:background-color var(--scrollbar-duration)}::-webkit-scrollbar-track:hover,:hover::-webkit-scrollbar-track{background:var(--scrollbar-hover-bg)}::-webkit-scrollbar-thumb{background:var(--scrollbar-bar-bg);border-radius:var(--scrollbar-radius);min-height:var(--scrollbar-size);-webkit-transition:var(--scrollbar-duration);transition:var(--scrollbar-duration);-webkit-transition-property:background-color;transition-property:background-color}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-hover-bg)}::-webkit-scrollbar-thumb:active{background:var(--scrollbar-drag-bg)}@-moz-document url-prefix(){.scrollbar-thin{scrollbar-width:thin}}.scrollbar-thin::-webkit-scrollbar{height:calc(var(--scrollbar-size)/2);width:calc(var(--scrollbar-size)/2)}.scrollbar-hover::-webkit-scrollbar,.scrollbar-hover::-webkit-scrollbar-thumb,.scrollbar-hover::-webkit-scrollbar-track{visibility:hidden}.scrollbar-hover:hover::-webkit-scrollbar,.scrollbar-hover:hover::-webkit-scrollbar-thumb,.scrollbar-hover:hover::-webkit-scrollbar-track{visibility:visible}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(./icons/ZentaoIcon.eot?v=1.71);src:url(./icons/ZentaoIcon.woff?v=1.71) format("woff"),url(./icons/ZentaoIcon.ttf?v=1.71) format("truetype"),url(./icons/ZentaoIcon.svg?v=1.71#regular) format("svg")}.icon,[class*=" icon-"],[class^=icon-]{display:inline-block;font-display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}.icon-xs:before{font-size:.7em}.icon-sm:before{font-size:.8em}.icon-lg:before{font-size:1.25em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-run{position:relative}.icon-run:before{opacity:.5}.icon-run:after{bottom:0;content:"\ea07";display:block;left:0;position:absolute;right:0;text-align:center;top:0}.icon-docspace:before{content:"\ea1b"}.icon-doclib:before{content:"\ea1c"}.icon-guihua:before{content:"\ea02"}.icon-memory:before{content:"\e9fd"}.icon-cpu:before{content:"\e9fe"}.icon-pause-pure:before{content:"\e9ff"}.icon-exclamation-pure:before{content:"\ea00"}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-safe:before{content:"\ea06"}.icon-ai:before{content:"\e983"}.icon-kanban:before{content:"\e997"}.icon-college:before{content:"\e9c8"}.icon-home:before,.icon-menu-my:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before,.icon-product:before{content:"\e98f"}.icon-project:before,.icon-rocket:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-run-alt:before{content:"\ea07"}.icon-test:before{content:"\e956"}.icon-devops:before,.icon-infinite:before{content:"\e9a3"}.icon-doc:before,.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-group:before,.icon-menu-users:before,.icon-persons:before,.icon-team:before{content:"\e97e"}.icon-assets:before,.icon-diamond:before{content:"\e9ae"}.icon-flow:before{content:"\e994"}.icon-backend:before,.icon-cog-outline:before{content:"\ea05"}.icon-help:before{content:"\e968"}.icon-download:before,.icon-import:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-bar-chart:before,.icon-chart-bar:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before,.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-productplan:before{content:"\e9fc"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-board:before{content:"\ea15"}.icon-market:before{content:"\ea01"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-ops:before{content:"\e903"}.icon-menu-backend:before{content:"\e993"}.icon-feedback:before{content:"\e991"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before,.icon-info:before{content:"\e996"}.icon-exclamation:before{content:"\e9fa"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before,.icon-lang:before{content:"\f0ac"}.icon-template:before{content:"\e9fb"}.icon-seal:before{content:"\e9f8"}.icon-menu-arrow-left:before{content:"\e9f0"}.icon-menu-arrow-right:before{content:"\e9f1"}.icon-add-directory:before{content:"\e9ef"}.icon-design:before{content:"\e9ec"}.icon-download-alt:before{content:"\e9ea"}.icon-blame:before{content:"\e9e0"}.icon-draft-edit:before{content:"\e9dc"}.icon-sub-review-user:before{content:"\e9db"}.icon-sub-review:before{content:"\e9df"}.icon-ztf:before{content:"\e9dd"}.icon-save:before{content:"\e9d8"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-customer:before{content:"\e9d9"}.icon-alarm:before{content:"\ea16"}.icon-treeview:before{content:"\ea0d"}.icon-or:before{content:"\ea0b"}.icon-manager:before{content:"\ea0c"}.icon-target:before{content:"\ea0a"}.icon-ipd:before{content:"\e9f9"}.icon-wiki-lib:before{content:"\e9f5"}.icon-annex-lib:before{content:"\e9f6"}.icon-interface-lib:before{content:"\e9f7"}.icon-has-authority-pack:before{content:"\e9f3"}.icon-without-authority-pack:before{content:"\e9f4"}.icon-data-structure:before{content:"\e9f2"}.icon-waterfallplus:before{content:"\e9ed"}.icon-agileplus:before{content:"\e9ee"}.icon-horn:before{content:"\e9eb"}.icon-resume:before{content:"\e9e9"}.icon-mirror:before{content:"\e9e6"}.icon-remote:before{content:"\e9e7"}.icon-moon:before{content:"\e9e8"}.icon-ticket:before{content:"\e9e1"}.icon-gantt-alt:before{content:"\e9e2"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-lane:before{content:"\e9b1"}.icon-var-x:before{content:"\ea1d"}.icon-mobile:before{content:"\ea18"}.icon-clear:before{content:"\ea19"}.icon-db:before{content:"\ea17"}.icon-unpinned:before{content:"\ea08"}.icon-pinned:before{content:"\ea09"}.icon-support-ticket:before{content:"\ea04"}.icon-snap-house:before{content:"\e9e3"}.icon-wrench:before{content:"\e9e4"}.icon-desktop:before{content:"\e9e5"}.icon-back-circle:before{content:"\e9da"}.icon-back:before{content:"\e9d3"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before,.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-thumbs-up-solid:before{content:"\e9d6"}.icon-thumbs-down-solid:before{content:"\e9d7"}.icon-hash:before,.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-plus:before{content:"\e925"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-upload-file:before{content:"\ea03"}.icon-file-log:before{content:"\e9de"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file-empty:before,.icon-file:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-multi-input:before{content:"\ea1a"}.icon-cell-input:before{content:"\ea0e"}.icon-input:before{content:"\ea0f"}.icon-checkbox:before{content:"\ea10"}.icon-radio:before{content:"\ea11"}.icon-transition:before{content:"\ea12"}.icon-add-sub-chapter:before{content:"\ea13"}.icon-add-chapter:before{content:"\ea14"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-ban-circle:before,.icon-cancel:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before,.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-play:before,.icon-start:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-alter:before,.icon-change:before{content:"\e970"}.icon-glasses:before,.icon-review:before{content:"\e914"}.icon-sitemap:before,.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-active:before,.icon-magic:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-calendar:before,.icon-delay:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.status-active,.status-asked,.status-normal,.status-unconfirmed,.status-wait{color:var(--color-status-normal,#313c52)}.status-active.status-issue,.status-checking,.status-commenting,.status-confirmed,.status-doing{color:#ff6f42}.status-blocked,.status-hangup,.status-pause,.status-suspended{color:#b89664}.status-clarify,.status-draft{color:#8166ee}.status-noreview,.status-reviewing,.status-wait.status-testcase{color:#18a6fd}.status-active.status-risk,.status-changed,.status-changing,.status-fail{color:#fb2b2b}.status-checked,.status-done,.status-pass,.status-replied,.status-resolved,.status-success{color:#0dbb7d}.status-cancel,.status-canceled,.status-investigate{color:var(--color-status-cancel,#838a9d)}.status-closed,.status-testtask.status-done{color:var(--color-status-closed,#9ea3b0)}.dark{--color-status-normal:#eff1f3;--color-status-cancel:#9ea3b0;--color-status-closed:#838a9d}@media (prefers-color-scheme:dark){.dark-auto{--color-status-normal:#eff1f3;--color-status-cancel:#9ea3b0;--color-status-closed:#838a9d}}.pri,[class*=" pri-"],[class^=pri-]{border-color:currentColor;border-radius:var(--radius-full);border-width:1px;display:inline-block;font-size:.75rem;height:1rem;line-height:1rem;line-height:14px;max-width:54px;min-width:16px;overflow:hidden;padding-left:.125rem;padding-right:.125rem;text-align:center;white-space:nowrap;--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.pri-1{color:rgb(255 73 18/var(--tw-text-opacity))}.pri-1,.pri-2{--tw-text-opacity:1}.pri-2{color:rgba(var(--color-warning-600-rgb),var(--tw-text-opacity))}.pri-3{color:rgb(59 130 246/var(--tw-text-opacity))}.pri-3,.pri-4{--tw-text-opacity:1}.pri-4{color:rgb(149 211 224/var(--tw-text-opacity))}.severity{display:inline-block;font-size:.75rem;height:1rem;line-height:1rem;line-height:14px;max-width:54px;min-width:16px;overflow:hidden;padding-left:.125rem;padding-right:.125rem;position:relative;text-align:center;white-space:nowrap;--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.severity:before{background-color:currentColor;background-repeat:no-repeat;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;--tw-content:attr(data-severity);content:var(--tw-content);-webkit-mask:url('data:image/svg+xml;charset=utf-8,');mask:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-size:100% 100%;mask-size:100% 100%}.severity:after,.severity:before{display:inline-block}.severity:after{--tw-scale-x:.75;--tw-scale-y:.75;content:attr(data-severity);line-height:20px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.severity[data-severity="1"]{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.severity[data-severity="2"]{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.severity[data-severity="3"]{--tw-text-opacity:1;color:rgb(250 174 26/var(--tw-text-opacity))}.severity[data-severity="4"]{--tw-text-opacity:1;color:rgb(184 150 100/var(--tw-text-opacity))}.severity[data-severity="5"]{--tw-text-opacity:1;color:rgb(158 163 176/var(--tw-text-opacity))}.severity-label{background-color:transparent}.severity-label:after,.severity-label:before{--tw-content:none;content:var(--tw-content)}.risk-high{color:rgb(220 38 38/var(--tw-text-opacity))}.risk-high,.risk-middle{--tw-text-opacity:1}.risk-middle{color:rgb(234 179 8/var(--tw-text-opacity))}.label.label-id{border-radius:var(--radius-full);flex:none;--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-300-rgb),var(--tw-ring-opacity));--label-bg:rgba(var(--color-canvas-rgb),.1)}.nav-feature{--nav-active-bg:var(--color-primary-100);--nav-active-color:var(--color-fore)}.nav-feature .nav-checkbox>.checkbox,.nav-feature .nav-checkbox>.checkbox-primary,.nav-feature .nav-item>a{align-items:center;border-radius:var(--radius);height:2rem;padding-left:.625rem;padding-right:.625rem}.nav-feature .nav-item>a>.icon{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.sortable-list .listitem{cursor:move;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-left:.5rem;padding-right:.5rem}.sortable-list .sortable-ghost>.listitem{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-50-rgb),var(--tw-bg-opacity))}.sortable-empty-shadow{height:1px!important;left:0!important;opacity:0!important;pointer-events:none!important;position:absolute!important;top:0!important;width:1px!important}:root{--avatar-radius:12.5%;--avatar-bg:var(--color-surface)}.avatar{align-items:center;aspect-ratio:1/1;background:var(--avatar-bg);border-radius:var(--avatar-radius);display:inline-flex;justify-content:center;overflow:hidden;width:2rem}.avatar>img{height:100%;margin:0;-o-object-fit:cover;object-fit:cover;width:100%}.avatar.size-xs{width:1.25rem}.avatar.size-sm,.avatar.size-xs{font-size:.75rem;line-height:1rem}.avatar.size-sm{width:1.5rem}.avatar.size-lg{font-size:1.5rem;line-height:2rem;width:3rem}.avatar.size-xl{font-size:2.25rem;line-height:2.5rem;width:5rem}.avatar-group{display:flex;gap:.625rem}.avatar-group>.avatar{box-shadow:0 0 0 1px var(--color-canvas)}.avatar-group>*+*{margin-left:-1rem}.avatar-group.size-xs>*+*{margin-left:-.75rem}.avatar-group.size-sm>*+*{margin-left:-.875rem}.avatar-group.size-lg>*+*{margin-left:-1.25rem}.avatar-group.size-xl>*+*{margin-left:-1.5rem}.btn-group{display:flex;gap:1px}.btn-group>.btn.active{z-index:1}.btn-group>.btn:focus-within,.btn-group>.btn:hover{z-index:2}.btn-group>.btn.disabled,.btn-group>.btn:disabled{z-index:0}.btn-group>.btn:not(:first-child){border-bottom-left-radius:var(--radius-none);border-left-color:rgba(var(--color-canvas-rgb),.2);border-left-width:1px;border-top-left-radius:var(--radius-none)}.btn-group>.btn:not(:first-child):before{left:-1px}.btn-group>.btn:not(:last-child){border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none)}.color-picker-heading{align-items:center;font-weight:700;justify-content:space-between;margin-bottom:-.25rem;padding:.5rem}.color-picker-heading,.color-picker-row{display:flex;flex-direction:row}.color-picker-row{flex-wrap:wrap;gap:.5rem;padding:.75rem}.color-picker-item{align-items:center;border-radius:var(--radius-full);display:flex;height:1.25rem;justify-content:center;padding-left:.125rem;padding-right:.125rem;width:1.25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.pick-container{left:0;pointer-events:none;position:absolute;top:0;z-index:1600}.pick-pop{display:flex;flex-direction:column;opacity:0;pointer-events:auto;position:absolute;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);z-index:1200}.pick-pop.in{opacity:1}.date-picker-menu{--menu-bg:none}.date-picker-menu .mini-calendar{margin-top:-.75rem}.date-pick-menu-month,.date-pick-menu-years{display:flex;flex-direction:row;flex-wrap:wrap;gap:1px;max-height:237px;padding-bottom:.5rem;padding-left:.5rem;padding-right:.5rem}.date-pick-menu-years>.btn{width:2.5rem}.date-pick-menu-years>.btn.is-current{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.date-pick-menu-month>.btn.active,.date-pick-menu-years>.btn.active{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.date-pick-menu-month>.btn{width:3rem}.date-picker-menu-footer{border-top-width:1px;display:flex;flex-direction:row;padding:.25rem}.date-picker-menu-footer>.toolbar{flex:1 1 auto;justify-content:center}.date-picker-menu>.menu{border-right-width:1px}.date-picker-menu .menu-item{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.time-picker-menu{max-height:inherit}.time-picker-menu .menu-item>a{justify-content:center;padding-left:0;padding-right:0;text-align:center}.datetime-picker-menu{max-height:inherit}.mini-calendar{padding:.5rem}.mini-calendar>.row>.col{align-items:center;justify-content:center;width:14.2857%}.mini-calendar-day{height:2rem}.mini-calendar-day.disabled{pointer-events:none;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-200-rgb),var(--tw-bg-opacity));opacity:.5}.mini-calendar-day>.btn{width:2rem}.mini-calendar-day.is-weekend>.btn{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.mini-calendar-day.active>.btn,.mini-calendar-day.is-today>.btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.mini-calendar-day.selected>.btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.mini-calendar-day.is-out-month{opacity:.5}.i-time{border-color:currentColor;border-radius:50%;border-width:.08em;display:inline-block;height:1em;position:relative;width:1em}.i-time:after{border-color:currentColor;border-width:0 0 .08em .08em;height:.385em;left:.3846em;position:absolute;top:.08em;width:.385em;--tw-content:"";content:var(--tw-content)}.chevron-down,.chevron-left,.chevron-right,.chevron-up{align-items:center;display:inline-flex;height:1em;justify-content:center;position:relative;width:1em}.chevron-down:before,.chevron-left:before,.chevron-right:before,.chevron-up:before{display:block;height:.6923077em;transform-origin:center;width:.6923077em;--tw-translate-y:-0.125rem;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.chevron-left:before{--tw-translate-y:0px;--tw-translate-x:0.125rem;--tw-rotate:135deg}.chevron-left:before,.chevron-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-right:before{--tw-translate-y:0px;--tw-translate-x:-0.125rem;--tw-rotate:-45deg}.chevron-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.i-calendar{border-radius:2px;display:inline-block;height:.79em;margin-top:.16em;position:relative;width:1em}.i-calendar,.i-calendar:after,.i-calendar:before{border-color:currentColor;border-width:.08em}.i-calendar:after,.i-calendar:before{position:absolute;--tw-content:"";content:var(--tw-content)}.i-calendar:before{border-bottom-width:0;left:.15em;top:.307em;width:.6em}.i-calendar:after{border-bottom-width:0;border-top-width:0;height:.3077em;left:.17em;top:-.154em;width:.538em}:root{--modal-radius:var(--radius-lg);--modal-bg:rgba(var(--color-inverse-rgb),.4);--modal-sm:37.5rem;--modal-base:50rem;--modal-lg:75rem;--modal-xl:90rem}.modal{align-items:center;background-color:var(--modal-bg);bottom:0;display:none;justify-content:center;left:0;overflow:hidden;position:fixed;right:0;top:0;z-index:1500}.modal.load-indicator:before{background-color:transparent;transition-property:none}.modal.loading:after{--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.modal.loading .modal-dialog{opacity:0!important}.modal.show{display:flex}.modal-no-backdrop{background-color:transparent;pointer-events:none}.modal-hide{opacity:0!important}.modal-dialog{background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));pointer-events:auto;position:relative;--tw-bg-opacity:0.9;--tw-shadow:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--tw-shadow-colored:0 10px 50px -10px var(--tw-shadow-color),0 8px 20px -10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);border-radius:var(--modal-radius);width:var(--modal-base)}.modal-content,.modal-dialog{max-height:100vh}.modal-content{display:flex;flex-direction:column;height:100%}.loading>.modal-dialog>.modal-content{opacity:0;visibility:hidden}.modal-dialog.loading{background-color:transparent}.modal-dialog.loading>.modal-content{display:none}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.modal-header{align-items:center;display:flex;flex:none;flex-wrap:nowrap;gap:1rem;padding:1rem 1.25rem;position:relative}.modal-title{flex:1 1 auto;font-size:1rem;font-weight:700;line-height:1.5rem}.modal-actions{position:absolute;right:.75rem;top:.75rem;z-index:15}.modal-body{flex:1 1 auto;overflow:auto;padding:1rem 1.25rem}.modal-footer{align-items:center;display:flex;flex:none;gap:.75rem;padding:1.25rem}.modal-dialog.size-full,.modal-dialog[data-size=full]{border-radius:var(--radius-none);height:100vh;width:100vw}.modal-dialog.size-sm,.modal-dialog[data-size=sm]{width:var(--modal-sm)}.modal-dialog.size-lg,.modal-dialog[data-size=lg]{width:var(--modal-lg)}.modal-dialog.size-xl,.modal-dialog[data-size=xl]{width:var(--modal-xl)}.modal-iframe{flex:1 1 auto;width:100%}.modal-trans{opacity:0;transition-duration:.2s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.modal-trans.in{opacity:1}.modal-trans>.modal-dialog{transition-property:transform,opacity;--tw-scale-x:.95;--tw-scale-y:.95;opacity:0;transition-duration:.3s}.modal-trans.in>.modal-dialog,.modal-trans>.modal-dialog{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-trans.in>.modal-dialog{--tw-scale-x:1;--tw-scale-y:1;opacity:1}.modal-alert .modal-footer{justify-content:flex-end}.modal-alert .modal-header{margin-bottom:-1rem}.modal-alert .modal-body{overflow-wrap:break-word;white-space:pre-line}.modal-alert .modal-actions+.modal-body{padding-right:3rem}.modal-alert .modal-header+.modal-actions+.modal-body{padding-right:1.25rem}.file-selector{gap:.5rem;width:100%}.file-selector,.file-selector-box{display:flex;flex-direction:column}.file-selector-box{border-style:dashed;border-width:1px;gap:0;height:auto;justify-content:center;position:relative;--tw-border-opacity:1;background-color:rgba(var(--color-primary-50-rgb),.3);border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));padding:.5rem .75rem;--tw-ring-color:transparent;--state-color:rgba(var(--color-primary-500-rgb),.05)}.file-selector-box .text{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.is-dragging .file-selector-box{border-style:solid}.file-selector-btn{align-items:center;display:flex;gap:.5rem;position:relative}.is-dragging .file-selector-btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.file-selector-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;bottom:0;cursor:pointer;left:0;opacity:.1;position:absolute;right:0;top:0}.file-selector-tip{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.file-selector.is-mode-button{flex-direction:column-reverse}.file-selector-list.is-empty{display:none}.file-selector-item .item-avatar{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.file-selector-item .item-subtitle{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.file-selector-item .item-content{flex:none;margin-right:.25rem;max-width:100%}.file-selector-item>.listitem:hover{background-color:rgba(var(--color-gray-500-rgb),.05)}.file-selector-item.is-renaming .item-avatar+.item-content{max-width:calc(100% - 32px)}.file-selector-rename-text{max-width:100%;min-width:100px;position:relative}.file-selector-rename-text>div{overflow:hidden;pointer-events:none;visibility:hidden;white-space:nowrap}.file-selector-rename-input{bottom:0;left:0;position:absolute;right:0;top:0}.file-selector-grid{align-items:flex-start;border-color:transparent;border-radius:var(--radius);border-width:1px;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--file-selector-grid-gap);--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity));padding:.5rem}.file-selector-grid-item{height:var(--file-selector-grid-height)}.file-selector-grid-btn,.file-selector-grid-item{width:var(--file-selector-grid-width)}.file-selector-grid-btn{aspect-ratio:1/1;border-style:dashed;border-width:1px;display:flex;flex-direction:column;gap:0;height:auto;justify-content:center;--tw-border-opacity:1;background-color:rgba(var(--color-primary-50-rgb),.3);border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));padding:.5rem;--tw-ring-color:transparent;--state-color:rgba(var(--color-primary-500-rgb),.05)}.file-selector-grid-btn .text{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.file-selector-grid-item .listitem{flex-direction:column;height:100%;padding:0;position:relative;width:100%}.file-selector-grid-item .item-avatar{border-radius:var(--radius);border-width:1px;width:100%;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.file-selector-grid-item .item-avatar.has-icon>.icon{font-size:calc(var(--file-selector-grid-width)/2)}.file-selector-grid-item .item-content,.file-selector-grid-item .toolbar{aspect-ratio:1/1;left:0;position:absolute;right:0;top:0;width:100%}.file-selector-grid-item .item-title{bottom:-1.25rem;font-size:.75rem;left:0;line-height:1rem;overflow:hidden;position:absolute;right:1.5rem;white-space:nowrap}.file-selector-grid-item .item-subtitle{border-radius:var(--radius-full);bottom:.25rem;left:.25rem;position:absolute;--tw-bg-opacity:1;background-color:rgba(var(--color-fore-rgb),var(--tw-bg-opacity));font-size:.75rem;line-height:1rem;padding-left:.25rem;padding-right:.25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.file-selector-grid-item:hover .item-subtitle{opacity:1}.file-selector-grid-item .toolbar .btn[data-remove-file]{background-color:rgba(var(--color-inverse-rgb),.5);padding:.375rem;position:absolute;right:1px;top:1px;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.file-selector-grid-item .toolbar .btn[data-rename-file]{bottom:-1.5rem;padding:0;position:absolute;right:0}.file-selector-grid .file-selector-rename{bottom:0;height:1.5rem;position:absolute;top:auto}.file-selector-grid .file-selector-rename-text{width:100%}.is-dragging .file-selector-grid{border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}:root{--nav-radius:var(--radius);--nav-active-color:var(--color-primary-500);--nav-active-bg:var(--color-inherit);--nav-heading-color:var(--color-gray-500);--nav-gap:0.25rem;--nav-item-color:inherit;--nav-item-bg:transparent;--nav-item-padding:1rem;--nav-item-height:2rem;--nav-item-gap:0.75rem;--nav-divider-height:calc(var(--nav-item-height)/2);--nav-divider-margin:0.5rem}.nav{list-style-type:none;padding-left:0}.nav,.nav-item{align-items:center;display:flex;position:relative}.nav-item{gap:var(--nav-item-gap)}.nav-item>a{align-items:center;background-color:var(--nav-item-bg);color:var(--nav-item-color);cursor:pointer;display:flex;gap:var(--nav-gap);height:var(--nav-item-height);justify-content:center;padding-left:var(--nav-item-padding);padding-right:var(--nav-item-padding)}.nav-item>a>.text{white-space:nowrap}.nav-item>.active{font-weight:700;--nav-item-color:var(--nav-active-color);--nav-item-bg:var(--nav-active-bg)}.nav-item>.selected{--nav-item-color:var(--nav-selected-color);--nav-item-bg:var(--nav-selected-bg)}.nav-item>.disabled{--nav-item-color:var(--nav-disabled-color);--nav-item-bg:var(--nav-disabled-bg)}.nav-item>.disabled>*{opacity:var(--opacity-disabled)}.nav-divider,.nav>.divider{align-self:center;height:var(--nav-divider-height);margin-left:var(--nav-divider-margin);margin-right:var(--nav-divider-margin)}.nav-heading{align-items:center;color:var(--nav-heading-color);display:flex;font-weight:700;gap:.25rem;height:2rem;justify-content:center;padding-left:1rem;padding-right:1rem}.nav-space{flex:1 1 auto;width:1rem}.nav-compact{--nav-gap:0.25rem;--nav-item-gap:0.5rem;--nav-item-height:1.75rem;--nav-item-padding:0.5rem;--nav-divider-margin:0.25rem}.nav-primary>.nav-item{position:relative}.nav-primary>.nav-item:hover{z-index:10}.nav-primary>.nav-item+.nav-item{margin-left:-1px}.nav-primary>.nav-item>a{border-radius:var(--radius-none);border-width:1px}.nav-primary>.nav-item:first-child>a,.nav-primary>.nav-item:has(.nav-heading)+.nav-item>a{border-bottom-left-radius:var(--nav-radius);border-top-left-radius:var(--nav-radius)}.nav-primary>.nav-item:last-child>a{border-bottom-right-radius:var(--nav-radius);border-top-right-radius:var(--nav-radius)}.nav-primary>.nav-item>.active{--tw-text-opacity:1;background:var(--nav-active-color);border-color:var(--nav-active-color);color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.nav-primary>.nav-divider{display:none}.nav-secondary>.nav-item>a{border-radius:var(--radius-none);position:relative}.nav-secondary>.nav-item>a:after{bottom:-2px;display:block;height:2px;left:0;position:absolute;right:0;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}.nav-secondary>.nav-item>.active:after{background-color:currentColor}.nav-secondary>.nav-divider{margin:0 0 0 -1px}.nav-tabs>.nav-item>a{border-bottom-left-radius:var(--radius-none);border-bottom-right-radius:var(--radius-none);position:relative}.nav-tabs>.nav-item>a:after{border-color:transparent;border-width:1px;bottom:-1px;display:block;left:-1px;pointer-events:none;position:absolute;right:-1px;top:-1px;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-content:"";border-top-left-radius:inherit;border-top-right-radius:inherit;content:var(--tw-content)}.nav-tabs>.nav-item>.active:after{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-bottom-color:transparent}.nav-tabs>.nav-divider{margin:0 0 0 -1px}.nav-pills>.nav-item>a{border-radius:var(--radius-full)}.nav-pills>.nav-item>.active{--tw-text-opacity:1;background:var(--nav-active-color);border-color:var(--nav-active-color);color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.nav-steps{--nav-item-bg:var(--color-canvas);--nav-active-bg:var(--color-primary-500);--nav-active-color:var(--color-canvas);--nav-selected-bg:var(--color-secondary-500);--nav-selected-color:var(--color-canvas)}.nav-steps>.nav-item+.nav-item>a{padding-left:calc(var(--nav-item-padding) + var(--nav-item-height)/3)}.nav-steps>.nav-item>a:after,.nav-steps>.nav-item>a:before{border-style:solid;height:0;left:100%;position:absolute;width:0;z-index:2;--tw-content:"";border-color:transparent;border-left-color:var(--nav-item-bg,var(--color-canvas));border-width:calc(var(--nav-item-height)/2);border-left-width:calc(var(--nav-item-height)/3);border-right-width:0;content:var(--tw-content)}.nav-steps>.nav-item>a:before{background-color:transparent!important;border-left-color:var(--color-border);bottom:auto;left:calc(100% + 5.5px);opacity:1!important;right:auto;top:.4rem;transform:none;z-index:1;--nav-item-height:1.2rem}.nav-steps>.nav-item:has(+.nav-item>.active)>.selected:before,.nav-steps>.nav-item:has(+.nav-item>.active,+.nav-item>.selected)>a:not(.active,.selected):before,.nav-steps>.nav-item:has(+.nav-item>.selected)>.active:before,.nav-steps>.nav-item:last-child>a:after,.nav-steps>.nav-item:last-child>a:before{display:none}.nav-steps>.nav-item>a:hover{--nav-item-bg:var(--color-gray-100)}.nav-steps>.nav-item>.active:hover{--nav-item-bg:var(--color-primary-600)}.nav-steps>.nav-item>.selected:hover{--nav-item-bg:var(--color-secondary-600)}.nav-stacked{flex-direction:column}.nav-stacked>.nav-item{width:100%}.nav-stacked>.nav-heading,.nav-stacked>.nav-item>a{justify-content:flex-start;width:100%}.nav-stacked>.nav-divider{height:1px;margin:.5rem 0;width:100%}.nav-primary.nav-stacked>.nav-item>a{height:2.5rem}.nav-primary.nav-stacked>.nav-item+.nav-item{margin-left:0;margin-top:-1px}.nav-primary.nav-stacked>.nav-item:first-child>a{border-bottom-left-radius:0;border-top-left-radius:var(--nav-radius);border-top-right-radius:var(--nav-radius)}.nav-primary.nav-stacked>.nav-item:last-child>a{border-bottom-left-radius:var(--nav-radius);border-bottom-right-radius:var(--nav-radius);border-top-right-radius:0}.nav-secondary.nav-stacked>.nav-item>a:after{bottom:0;height:100%;left:auto;right:0;top:0;width:2px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity))}.nav-secondary.nav-stacked>.nav-item>.active:after{background-color:currentColor}.nav-secondary.nav-stacked>.nav-divider{margin:0}.nav-tabs.nav-stacked>.nav-item>a{border-bottom-left-radius:var(--nav-radius);border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none);position:relative}.nav-tabs.nav-stacked>.nav-item>a:after{--tw-border-opacity:1;border-bottom-color:transparent;border-bottom-left-radius:inherit;border-right-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-top-left-radius:inherit}.nav-tabs.nav-stacked>.nav-item>a.active:after{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-right-color:transparent}.nav-tabs.nav-stacked>.nav-divider{margin:0}.nav-pills.nav-stacked>.nav-item+.nav-item{margin-top:.25rem}.nav-justified>.nav-item:not(.flex-none,.nav-divider){flex:1 1 auto}.nav-justified>.nav-item>a{width:100%}.arrow,.arrow:before{background:inherit;height:calc(var(--arrow-size)*1.4142);position:absolute;width:calc(var(--arrow-size)*1.4142)}.arrow{visibility:hidden;--arrow-size:5px}.arrow:before{border:inherit;content:"";visibility:visible;--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.arrow-top,.arrow-up{border-bottom:inherit;border-right:inherit;border-width:1px 0 0 1px;top:calc(1px - var(--arrow-size))}.white>.arrow-top,.white>.arrow-up{top:calc(0px - var(--arrow-size))}.arrow-bottom,.arrow-down{border-left:inherit;border-top:inherit;border-width:0 1px 1px 0;bottom:calc(1px - var(--arrow-size))}.white>.arrow-bottom,.white>.arrow-down{bottom:calc(0px - var(--arrow-size))}.arrow-left{border-right:inherit;border-top:inherit;border-width:0 0 1px 1px;left:calc(1px - var(--arrow-size))}.white>.arrow-left{left:calc(0px - var(--arrow-size))}.arrow-right{border-bottom:inherit;border-left:inherit;border-width:1px 1px 0 0;right:calc(1px - var(--arrow-size))}.white>.arrow-right{right:calc(0px - var(--arrow-size))}.popover{display:none;left:0;position:absolute;top:0;width:-moz-max-content;width:max-content}.popover.show{display:block}.popover-heading{align-items:center;border-top-left-radius:inherit;border-top-right-radius:inherit;display:flex;gap:1rem;height:2.5rem;justify-content:space-between;position:relative;z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:.75rem;padding-right:.5rem}.popover-title{flex:1 1 auto;font-weight:700}.popover-content{padding:.75rem;position:relative;z-index:1}.popover-arrow{z-index:0}.has-heading>.popover-arrow.arrow-top,.has-heading>.popover-arrow.arrow-up{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.popover>.btn-close{position:absolute;right:.5rem;top:.625rem;z-index:2}.btn-close+.popover-content{padding-right:3rem}.btn.with-popover-show{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.with-popover-show[data-pop-placement=top]>.caret{--tw-rotate:180deg}.with-popover-show[data-pop-placement=left]>.caret,.with-popover-show[data-pop-placement=top]>.caret{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.with-popover-show[data-pop-placement=left]>.caret{--tw-rotate:90deg}.with-popover-show[data-pop-placement=right]>.caret{--tw-rotate:-90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pager{align-items:center;display:flex;gap:.25rem;white-space:nowrap}.menu.pager-size-menu{display:grid!important;grid-template-columns:repeat(3,minmax(0,1fr));text-align:center}.menu.pager-size-menu>.menu-item>a{margin:.125rem}.pager .pager-goto-group>.form-control{width:3rem}.pager .pager-goto-group>.input-group-addon{border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-300-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.pager>.pager-nav.active{--tw-text-opacity:1;box-shadow:0 0 0 1px var(--color-primary-500);color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.panel{border-radius:var(--radius);overflow:hidden;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05}.panel-heading{background-color:var(--panel-heading-bg);flex-wrap:nowrap;gap:1rem;justify-content:space-between;padding:.5rem 1rem}.panel-heading,.panel-title{align-items:center;display:flex}.panel-title{font-weight:700;gap:.5rem;margin:0}.panel-actions{align-items:center;display:flex;margin-right:-.5rem}.panel-body{padding:.75rem 1rem}.panel-footer{align-items:center;background-color:var(--panel-footer-bg);display:flex;gap:.5rem;padding:.5rem 1rem}.size-sm .panel-body,.size-sm .panel-footer,.size-sm .panel-heading{padding:.375rem .75rem}.size-lg .panel-body,.size-lg .panel-footer,.size-lg .panel-heading{padding:1rem 1.25rem}.picker{position:relative}.picker-select{align-items:center;gap:.25rem;justify-content:space-between}.picker-select,.picker-select.form-control{display:flex}.picker-select-placeholder{flex:1 1 auto;--tw-text-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-text-opacity))}.picker-select-multi .picker-select-placeholder{padding-left:.25rem;padding-right:.25rem}.picker-single-selection{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap}.picker-deselect-btn{border-radius:var(--radius-full);padding:.25rem}.picker-deselect-btn:not(:hover){opacity:.7}.picker-select-multi.form-control{height:auto;min-height:32px;padding-left:.25rem}.picker-multi-selections{display:flex;flex-wrap:wrap;gap:.25rem;min-width:0}.picker-multi-selection{align-items:center;border-radius:var(--radius-full);border-width:1px;display:flex;max-width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:.5rem}.readonly .picker-multi-selection{padding-right:.5rem}.picker-multi-selection>.text{max-width:180px;min-width:0;overflow:clip;white-space:nowrap}.picker-no-search{cursor:default}.picker-menu-list{border-style:none;flex:1 1 auto;min-height:0;overflow-y:auto;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.picker-menu-search+.picker-menu-list.menu{margin-top:-.125rem;padding-top:0}.picker-menu-list.tree{padding:.5rem}.picker-menu-list .tree-item>.selected .item-content{font-weight:400}.picker-menu .search-menu-footer{border-top-width:1px;padding-bottom:.25rem;padding-top:.25rem}.picker-search-input{border-color:transparent;height:1.75rem;outline-width:0!important;padding-left:0;padding-right:2rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.picker-search{flex:none;position:relative;width:100%}.picker-search>.magnifier{opacity:.5;position:absolute;right:0;top:.5rem}.picker-search-clear.btn{cursor:pointer;height:1.25rem;position:absolute;right:0;top:.25rem;width:1.25rem}.picker-search.is-inline{min-width:64px;width:4rem}.is-inline>.picker-search-input{height:1.25rem;min-width:64px;padding-left:.25rem;padding-right:.25rem}.picker-search-measure{height:0;left:0;overflow:hidden;position:absolute;top:0;white-space:nowrap}.split{display:flex;flex-direction:row}.split-vert{flex-direction:column}.split-cell{min-height:0;min-width:0}.has-animation>.split-cell{transition-duration:.15s;transition-property:width,height;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter{align-items:stretch;border-radius:var(--radius);cursor:col-resize;display:flex;flex:none;flex-direction:row;justify-content:center;position:relative}.gutter-vert{cursor:row-resize;flex-direction:column}.gutter:before{display:block;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:"";content:var(--tw-content)}.gutter-horz:before{width:1px}.gutter-vert:before{height:1px}.gutter-horz:hover:before{width:75%}.gutter-vert:hover:before{height:75%}.gutter-resize-handler,.gutter-toggle{align-items:center;border-radius:var(--radius-lg);border-width:1px;display:flex;height:1.75rem;justify-content:center;margin-top:-.875rem;position:absolute;top:50%;width:.75rem;--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity));transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter-toggle>span{--tw-scale-x:.75;--tw-scale-y:.75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter:hover .gutter-toggle{--tw-border-opacity:1;border-color:rgba(var(--color-gray-500-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.gutter .gutter-toggle:hover{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.is-last>.gutter-toggle{--tw-scale-x:-1}.is-first>.gutter-toggle,.is-last>.gutter-toggle{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.is-first>.gutter-toggle{--tw-scale-x:1}.gutter-vert .gutter-toggle{left:50%;margin-left:-.375rem;margin-top:0;top:auto;--tw-rotate:90deg}.gutter-vert .gutter-toggle,.gutter.is-next-collapsed>.gutter-toggle{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.gutter.is-next-collapsed>.gutter-toggle{--tw-scale-x:1}.gutter.is-prev-collapsed>.gutter-toggle{--tw-scale-x:-1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.gutter-horz.is-first.is-prev-collapsed{transform:translateX(calc(-1px - var(--split-gutter-size)/2))}.gutter-horz.is-last.is-next-collapsed{transform:translateX(calc(1px + var(--split-gutter-size)/2))}.gutter-vert.is-first.is-prev-collapsed{transform:translateY(calc(-1px - var(--split-gutter-size)/2))}.gutter-vert.is-last.is-next-collapsed{transform:translateY(calc(1px + var(--split-gutter-size)/2))}.gutter-resize-handler{background-color:transparent;border-width:0}.gutter-resize-handler:before{border-left-width:1px;border-right-width:1px;bottom:0;left:.25rem;position:absolute;right:.25rem;top:0;--tw-content:"";content:var(--tw-content)}.sidebar{flex:none!important;position:relative;--gutter-width:1px;--sidebar-duration:200ms}.has-sidebar-animation .sidebar{transition-duration:.15s;transition-duration:var(--sidebar-duration);transition-property:width,margin;transition-timing-function:cubic-bezier(.4,0,.2,1)}.sidebar-left.is-collapsed{margin-left:calc(var(--gutter-width)*-1)}.sidebar-right.is-collapsed{margin-right:calc(var(--gutter-width)*-1)}.sidebar.is-collapsed>*,.sidebar.is-expanded.is-animating>*{display:none}.sidebar.is-collapsed>.sidebar-gutter{display:flex!important}.sidebar-gutter{bottom:0;left:100%;position:absolute;top:0;width:var(--gutter-width);z-index:10}.sidebar-right>.sidebar-gutter{left:auto;right:100%}.is-collapsed>.gutter>.gutter-toggle>span{--tw-rotate:-180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sidebar-gutter:before{border-radius:var(--radius-full);opacity:0}.sidebar-gutter:hover:before{opacity:1;width:.5rem}.is-expanded .sidebar-gutter.gutter-border:before{opacity:1}.is-sidebar-resizing{cursor:col-resize}.table{--table-head-bg:var(--color-surface);--table-striped-color:var(--color-gray-50);--table-hover-color:rgba(var(--color-primary-500-rgb),.05);--table-border-color:var(--color-border)}.table{border-color:var(--table-border-color);width:100%}.table>thead{background-color:var(--table-head-bg)}.table>*>tr{border-bottom-width:1px}.table>*>tr>*{padding:.5rem 1rem}.table-striped>tbody>tr:nth-child(2n){background:var(--table-striped-color)}.table-hover>tbody>tr:hover>*{background:var(--table-hover-color)}.table.bordered>*>tr>*{border-width:1px}.table.borderless>*>tr,.table.borderless>*>tr>*{border-style:none}.condensed>*>tr>*{padding:.375rem .75rem}.table-fixed{table-layout:fixed}.table-fixed>*>tr>*{overflow:hidden;white-space:nowrap}.toolbar{align-items:center;display:flex;position:relative}.toolbar>.divider{margin:.5rem;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity))}.toolbar-space{flex:1 1 auto;height:1px;width:1px}.toolbar>.dropdown.show{align-items:center;display:flex;position:relative}:root{--tooltip-bg:var(--skin-color,var(--color-inverse));--tooltip-text:var(--skin-text,var(--color-canvas));--tooltip-arrow:6px;--tooltip-delay:0.5s}.hint,[class*=" hint-"],[class^=hint-]{position:relative}.hint:before,[class*=" hint-"]:before,[class^=hint-]:before{border-style:solid;height:0;position:absolute;width:0;--tw-content:"";border-color:var(--tooltip-bg) transparent transparent transparent;border-width:var(--tooltip-arrow) var(--tooltip-arrow) 0 var(--tooltip-arrow);content:var(--tw-content);margin-bottom:calc(0px - var(--tooltip-arrow))}.hint:after,[class*=" hint-"]:after,[class^=hint-]:after{background-color:var(--tooltip-bg);border-color:var(--tooltip-color);border-radius:var(--radius);color:var(--tooltip-text);font-size:.75rem;line-height:1rem;max-width:28rem;overflow:hidden;padding:.25rem .5rem;position:absolute;white-space:nowrap;--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-content:attr(data-hint);content:var(--tw-content);text-shadow:0 1px 0 var(--tooltip-bg)}.hint:after,.hint:before,[class*=" hint-"]:after,[class*=" hint-"]:before,[class^=hint-]:after,[class^=hint-]:before{bottom:100%;left:50%;opacity:0;pointer-events:none;transition-delay:0s;transition-duration:.15s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,1,1);visibility:hidden;z-index:1800;--tw-translate-x:-50%;--tw-translate-y:calc(var(--tooltip-arrow)*-1);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint:hover:after,.hint:hover:before,[class*=" hint-"]:hover:after,[class*=" hint-"]:hover:before,[class^=hint-]:hover:after,[class^=hint-]:hover:before{opacity:1;transition-delay:var(--tooltip-delay);visibility:visible}.hint-bottom:before{border-color:transparent transparent var(--tooltip-bg) transparent;border-width:0 var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow);margin-bottom:auto;margin-top:calc(0px - var(--tooltip-arrow))}.hint-bottom:after,.hint-bottom:before{bottom:auto;top:100%;--tw-translate-y:var(--tooltip-arrow);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-left:before{border-color:transparent transparent transparent var(--tooltip-bg);border-width:var(--tooltip-arrow) 0 var(--tooltip-arrow) var(--tooltip-arrow);margin-bottom:auto;margin-right:calc(0px - var(--tooltip-arrow))}.hint-left:after,.hint-left:before{bottom:50%;left:auto;right:100%;--tw-translate-x:calc(var(--tooltip-arrow)*-1);--tw-translate-y:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-right:before{border-color:transparent var(--tooltip-bg) transparent;border-width:var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow) 0;margin-bottom:auto;margin-left:calc(0px - var(--tooltip-arrow))}.hint-right:after,.hint-right:before{bottom:50%;left:100%;--tw-translate-x:var(--tooltip-arrow);--tw-translate-y:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-lg:after,.hint-sm -.hint-md:after:after,.hint-xl:after{white-space:normal;word-break:break-all}.hint-sm:after{width:4rem}.hint-md:after{width:8rem}.hint-lg:after{width:16rem}.hint-xl:after{width:24rem}.hint-primary{--tooltip-bg:var(--color-primary-500)}.hint-success{--tooltip-bg:var(--color-success-500)}.hint-danger{--tooltip-bg:var(--color-danger-500)}.hint-warning{--tooltip-bg:var(--color-warning-500)}.hint-important{--tooltip-bg:var(--color-important-500)}.hint-special{--tooltip-bg:var(--color-special-500)}.tooltip{background-color:var(--tooltip-bg);border-color:var(--tooltip-color);border-radius:var(--radius);color:var(--tooltip-text);font-size:.75rem;line-height:1rem;max-width:28rem;padding:.25rem .5rem;white-space:pre-wrap;z-index:1800}.tooltip:not(.white)>.arrow{border-width:0}.tooltip.white>.arrow{border-color:inherit}.tooltip-has-title{--tw-bg-opacity:0.8;padding:.5rem .75rem .75rem;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.tooltip-has-title>.arrow{opacity:.75}.tooltip-heading{align-items:center;display:flex;font-size:.8125rem;font-weight:700;gap:1rem;justify-content:space-between;line-height:1.25rem;padding:.25rem}.tooltip-heading>.btn-close{margin-right:-.25rem}.tooltip-content{padding:.25rem}.tree-item-inner{flex-direction:row;min-height:24px;padding-left:var(--list-nested-indent)}.tree-item-inner,.tree-toggle{align-items:center;display:flex}.tree-toggle{border-radius:var(--radius);flex:none;height:1rem;justify-content:center;margin-right:-.375rem;width:1rem;--caret-size:5px;--caret-opacity:.3}.tree-item-inner>.item-icon{opacity:.5;width:1rem}.tree-item-inner:hover>.item-icon{opacity:.8}.tree-item-inner.has-hover{border-radius:var(--radius)}.tree-item-inner .item-title:not(:hover),.tree-item-inner>a.item-title:not(:hover){color:inherit}.tree-item-inner>.toolbar{margin-left:1rem;opacity:.6}.tree-item-inner:hover>.toolbar{opacity:1}.tree-item>.active{background:var(--menu-active-bg);color:var(--menu-active-color)}.tree-item>.selected{background:var(--menu-selected-bg)}.tree-item>.selected .item-content{color:var(--menu-selected-color);font-weight:700}.tree.search-menu-on-top>.search-box{left:0;right:0}.tree-lines .tree{position:relative}.tree-lines .tree-item{--tree-line-indent:calc(var(--list-nested-indent) + 8px)}.tree-lines .tree:before{border-left-width:1px;bottom:.5rem;display:block;left:var(--tree-line-indent);position:absolute;top:-.5rem;--tw-content:"";content:var(--tw-content)}.upload .upload-tip{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.upload .draggable-area{background-color:rgba(var(--color-primary-50-rgb),.2);border:1px dashed var(--color-primary-300)}.upload .draggable-area.dragover{background-color:rgba(var(--color-primary-500-rgb),.1);border-style:solid}.upload .upload-tip{color:var(--color-slate-500)}.file-item>.img{height:120px;width:120px}.upload .file-item:hover .file-size{display:flex!important}.form-batch-container{overflow-y:auto}.form-batch-table{min-width:100%;table-layout:fixed;--table-head-bg:var(--color-canvas)}.form-batch-table>*>tr{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.form-batch-table>*>tr>*{padding-left:.375rem;padding-right:.375rem;vertical-align:top}.form-batch-table>*>tr>th{text-align:left;vertical-align:middle}.form-batch-head[data-name=ACTIONS]{width:5rem}.form-batch-head[data-name=ACTIONS][data-action-count="3"]{width:6rem}.form-batch-label{display:inline}.form-batch-control>textarea.form-control{height:2rem}.form-batch-btn+.btn{margin-left:.25rem}.form-batch-table>tbody[data-count="1"] .form-batch-btn[data-type=delete]{display:none}.form-batch-ditto{position:relative}.form-batch-ditto-btn{bottom:0;height:auto;opacity:.5;padding-left:.5rem;padding-right:.5rem;position:absolute!important;right:0;top:0}.form-batch-ditto-btn:after{bottom:.5rem;left:-1px;position:absolute;top:.5rem;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}[data-ditto=on] .form-batch-ditto-btn{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));opacity:1}td.form-batch-row-actions{padding-bottom:.75rem!important;padding-top:.75rem!important}.form-batch-ditto-wrapper{position:relative}.form-batch-ditto-control .form-control,.form-batch-ditto-control .pick-pri{padding-right:calc(var(--form-batch-ditto-width) + 8px)}.form-batch-ditto-control .input-control>.input-control-suffix{right:var(--form-batch-ditto-width)}.form-batch-ditto-control .input-control>.form-control{padding-right:calc(var(--form-batch-ditto-width) + var(--input-control-suffix))}.has-fixed-actions .form-batch-col-actions{position:sticky;right:0;z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.form-batch-col-actions.is-pinned:before{background-image:linear-gradient(-90deg,transparent,transparent),linear-gradient(-90deg,transparent,transparent 50%);border-right-width:1px;bottom:0;content:" ";display:block;left:-1rem;position:absolute;top:0;transition-duration:.15s;transition-property:background;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem;z-index:1}.form-batch:hover .form-batch-col-actions.is-pinned:before{background-image:linear-gradient(-90deg,rgba(0,0,0,.03),transparent),linear-gradient(-90deg,rgba(0,0,0,.03),transparent 50%)}.panel-form-batch .form-batch-container .form-batch-col-actions.is-pinned:after{bottom:0;display:block;position:absolute;right:-1rem;top:0;width:1rem;z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));content:" "}.datalist{--datalist-label-width:68px}.datalist-item{display:flex;gap:.5rem;padding-bottom:.375rem;padding-top:.375rem}.datalist-item-label{align-items:center;display:flex;flex:none;justify-content:flex-end;overflow:hidden;white-space:nowrap;width:var(--datalist-label-width);--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.datalist-item-content{align-items:center;display:flex;flex:1 1 0%;gap:.5rem}.scrollbar,:root{--scrollbar-size:10px;--scrollbar-opacity:.6;--scrollbar-bg:rgba(var(--color-inverse-rgb),.15);--scrollbar-inset:inset 0 0 0 1px rgba(var(--color-inverse-rgb),.05);--scrollbar-bar-bg:rgba(var(--color-inverse-rgb),.3);--scrollbar-hover-bg:rgba(var(--color-inverse-rgb),.4);--scrollbar-drag-bg:rgba(var(--color-inverse-rgb),.5);--scrollbar-radius:var(--radius-sm);--scrollbar-duration:.7s}.scrollbar{background:var(--scrollbar-bg);box-shadow:var(--scrollbar-shadow);opacity:var(--scrollbar-opacity);position:absolute;transition-duration:.15s;transition-duration:var(--scrollbar-duration);transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.scrollbar-hover .scrollbar{opacity:0}.scrollbar-hover:hover .scrollbar{opacity:var(--scrollbar-opacity)}.scrollbar.is-dragging,.scrollbar:hover{opacity:1!important}.scrollbar-bar{background:var(--scrollbar-bar-bg);border-radius:var(--scrollbar-radius);position:absolute}.scrollbar-bar:hover{background:var(--scrollbar-hover-bg)}.is-dragging>.scrollbar-bar{background:var(--scrollbar-drag-bg)}.is-horz>.scrollbar-bar{height:100%;z-index:20}.is-vert>.scrollbar-bar{width:100%;z-index:20}.affine-theme,.affine-theme [data-theme=dark],.affine-theme [data-theme=light]{--affine-brand-color:var(--color-primary-500);--affine-primary-color:var(--color-primary-500);--affine-text-primary-color:var(--color-fore);--affine-font-family:var(--font-family-sans);--affine-font-serif-family:var(--font-family-serif);--affine-font-mono-family:var(--font-family-mono)}.blocksuite-portal{position:absolute!important}.embed-card-modal-mask{z-index:12!important}.embed-card-modal-wrapper{z-index:13!important}.affine-code-block-container .line-number{opacity:.5}@-moz-document url-prefix(){.affine-code-block-container v-line{width:100%}}.affine-list-block__prefix{color:inherit!important}.embed-zui-iframe{border-radius:var(--radius-lg);border-width:1px}affine-bookmark .affine-block-component{border-width:0}.is-editor-empty.is-editing .affine-block-children-container>affine-paragraph:first-child .affine-paragraph-placeholder:not(.visible){display:block!important}database-datasource-note-renderer{display:none!important}.editor-is-exporting audio,.editor-is-exporting canvas,.editor-is-exporting embed,.editor-is-exporting iframe,.editor-is-exporting img,.editor-is-exporting object,.editor-is-exporting svg,.editor-is-exporting video{display:initial!important}body>.affine-modal{align-items:center;background-color:var(--modal-bg);bottom:0!important;display:flex;justify-content:center;left:0!important;position:fixed!important;right:0!important;top:0!important}body>.affine-modal>center-peek{left:auto;max-width:1200px;position:relative;top:auto;--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}body>.affine-modal affine-data-view-record-detail{border-radius:var(--radius);overflow:auto;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-height:calc(100vh - 40px)}body>.affine-modal>center-peek>.close-modal{height:2rem;right:.75rem;top:.75rem;width:2rem;z-index:10}body>.affine-modal>center-peek>.close-modal>svg{height:1rem;width:1rem}.affine-database-column-stats{margin-left:0}.editor.is-readonly .database-header-bar+uni-lit,.editor.is-readonly .unsupported-content{display:none}.form-control .affine-theme,.form-group .affine-theme{border-radius:var(--form-control-radius);--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));outline-color:transparent;outline-style:solid;outline-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--form-control-border);transition-duration:.15s;transition-property:outline,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);--affine-editor-width:initial;--affine-editor-bottom-padding:24px!important;--affine-editor-side-padding:16px!important;min-height:200px}.form-control .affine-page-viewport,.form-group .affine-page-viewport{overflow:visible}.dtable .toggle-icon{margin-top:0;opacity:.5;position:static!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.doc-app{--doc-view-max-width:800px;--doc-view-padding:24px;--doc-view-side-width:240px;--affine-editor-side-padding:0}.doc-app{align-items:stretch;display:flex;flex-direction:column;min-height:120px}.doc-space-picker-menu .menu-item>.item-inner{padding-right:.25rem}.doc-app-search .form-control{border-radius:var(--radius-full)}.doc-app-search .input-control-prefix{cursor:pointer;opacity:.75}.doc-app-search.empty:not(.focus){transition-duration:.15s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.doc-app-search.empty:not(.focus) .form-control{padding-left:.5rem;padding-right:.5rem;--tw-ring-color:transparent}.doc-app-search.empty:not(.focus) .form-control::-moz-placeholder{opacity:0}.doc-app-search.empty:not(.focus) .form-control::placeholder{opacity:0}.doc-app-search.empty:not(.focus) .form-control:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.doc-app-search:not(.empty) .form-control{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-300-rgb),var(--tw-ring-opacity))}.doc-app-header .divider{height:1rem!important;margin-left:.25rem!important;margin-right:.25rem!important}.doc-app .is-match-keys{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-100-rgb),var(--tw-bg-opacity));font-weight:700;text-decoration-line:underline;text-underline-offset:2px}.doc-main .dtable-footer{border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}.doc-main.show-view>.doc-list{pointer-events:none;visibility:hidden;z-index:-10}.has-doc-app-fullscreen .doc-app-header,.has-doc-app-fullscreen .doc-sidebar,.has-doc-app-fullscreen>#header{display:none}.has-doc-app-fullscreen #mainContainer{max-width:none!important;padding:0!important;width:100%!important}.has-doc-app-fullscreen #docApp{height:calc(100vh - 12px)!important}.doc-app doc-title,.editor-is-exporting .doc-editor-title{display:none}.editor-is-exporting doc-title{display:block}.doc-tree .item-inner{cursor:pointer;padding-right:0;position:relative}.doc-tree .item-inner>.item-icon{flex:none;opacity:1}.doc-tree .item-inner .item-title{overflow:hidden;text-overflow:clip;white-space:nowrap}.doc-tree .item-inner.selected .item-title{font-weight:700}.doc-tree .item-inner>.toolbar{top:.25rem!important}.doc-tree .item-inner>.toolbar>.btn.with-popover-show,.doc-tree .list-heading-inner>.toolbar{opacity:1!important}.doc-tree .item-inner:hover>.toolbar{margin-top:0!important}.doc-tree .with-hover-actions>.item>.item-inner .item-actions{right:0}.doc-sidebar .sortable-ghost{border-radius:var(--radius-sm);z-index:10;--tw-bg-opacity:1;background-color:rgba(var(--color-warning-100-rgb),var(--tw-bg-opacity));opacity:.3;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-warning-600-rgb),var(--tw-ring-opacity))}.doc-tree [z-key=project-files]{border-top:1px solid rgba(var(--color-border-rgb),var(--tw-border-opacity));margin-top:.25rem;padding-top:.25rem}.doc-list-item-title{overflow:hidden;text-overflow:clip}.doc-view{scroll-padding-top:16px;scrollbar-gutter:stable both-edges}.doc-view-content{max-width:var(--doc-view-max-width);padding:var(--doc-view-padding)}.doc-files .item-title{overflow:hidden;white-space:nowrap}.doc-files .file-list-item{border-radius:var(--radius-lg);transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.doc-files .file-list-item:hover{background-color:rgba(var(--color-inverse-rgb),.05)}.doc-files .file-list-item .item-actions,.doc-files .file-list-item:hover .item-actions{margin-left:1rem;margin-top:0;position:relative}.doc-files .file-list-item .item-actions .btn{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}.doc-editor .affine-page-viewport{overflow:visible!important}.doc-editor .affine-page-root-block-container{padding:0 0 2rem!important}.doc-editor-keywords,.doc-editor-title{flex:none;max-width:100%;min-width:0}.doc-editor-keywords:hover .form-control{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.doc-editor-keywords .form-control:focus{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.doc-editor-control{z-index:2}.doc-view-sidebar{display:flex;flex-direction:column;max-height:calc(100% - 24px);overflow:visible;width:var(--doc-view-side-width)}.doc-view-sidebar-nav{--nav-item-padding:6px;--nav-item-color:var(--color-gray-500);--nav-active-bg:var(--color-primary-100);--nav-active-color:var(--color-fore);--nav-item-height:26px;--nav-divider-margin:8px;background-color:rgba(var(--color-surface-rgb),.2)}.doc-view-sidebar .datalist{--datalist-label-width:56px}.is-closed.doc-view-sidebar .doc-view-sidebar-content,.is-sidebar-closed .doc-view-sidebar-content{display:none}.is-closed.doc-view-sidebar,.is-sidebar-closed .doc-view-sidebar{--doc-view-side-width:0;opacity:0;transition-delay:1s;transition-duration:1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.is-outline.doc-view-sidebar{--doc-view-side-width:260px}.doc-view:hover .doc-view-sidebar{opacity:1;transition-delay:0s}.is-closed>.doc-view-sidebar-container,.is-sidebar-closed .doc-view-sidebar-container{position:absolute;right:0;top:0}.doc-view-sidebar-container{background-color:rgba(var(--color-canvas-rgb),.8);min-height:0;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.doc-outline .listitem{position:relative}.doc-outline .tree-toggle.is-empty:before{border-radius:var(--radius-full);height:.25rem;position:absolute;width:.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-300-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}.doc-outline .is-nested-root.no-nested-items{padding-left:.375rem}.doc-view input{font-family:inherit}.doc-path-picker .picker-deselect-btn{display:none}.doc-path-picker-angle{margin-left:-.125rem;margin-right:-.125rem}.doc-path-picker,.doc-space-picker{outline:2px solid transparent!important;outline-offset:2px!important;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.dropmenu-btn{gap:.25rem;padding-left:.5rem;padding-right:.5rem}.dropmenu-btn>.text{max-width:180px;overflow:hidden}.dropmenu-btn>.is-leading{left:-.625rem;opacity:.6;position:absolute}.dropmenu-btn>.is-caret{align-items:center;background-color:rgba(var(--color-canvas-rgb),.2);border-radius:var(--radius);display:flex;height:1rem;justify-content:center;width:1rem}.dropmenu-nav{border-bottom-width:1px;margin-left:.75rem;margin-right:.75rem;margin-top:.25rem}.has-search .dropmenu-nav{margin-top:-.5rem}.dropmenu-nav>.nav-secondary{gap:.5rem}.dropmenu-nav>.nav-secondary>.nav-item>a{border-radius:var(--radius);padding-left:.5rem;padding-right:.5rem}.dropmenu-nav>.nav-secondary>.nav-item>a:after{bottom:-1px;left:1rem;opacity:0;right:1rem}.dropmenu-nav>.nav-secondary>.nav-item>.active:after{left:.5rem;opacity:1;right:.5rem;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dropmenu-title{font-size:.75rem;font-weight:700;line-height:1rem;margin-bottom:-.5rem;padding:.75rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.dropmenu-list{min-height:0;overflow-x:hidden;overflow-y:auto;padding:.5rem .75rem}.dropmenu.loading>*{opacity:0}.dropmenu-item .tree-item-inner{border-radius:var(--radius);cursor:pointer;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dropmenu-item.is-item.active>.tree-item-inner{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.tree-item-inner.is-link:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.tree-item-inner.is-link:hover .item-content,.tree-item-inner.is-link:hover .item-trailing-icon,.tree-item-inner.is-link:hover .label{color:inherit}.tree-item-inner.is-toggle:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.dropmenu-item+.tree-item{margin-top:.125rem}.dropmenu-item .is-match{font-weight:700;text-decoration-line:underline}.dropmenu-item .item-title,.dropmenu-item .label{overflow:hidden;white-space:nowrap}.dropmenu-item .item-content{padding-left:.375rem;padding-right:.375rem}.dropmenu-item *+.item-content{padding-left:0}.tree-item-inner.is-toggle .item-title{opacity:.6}.tree-item-inner.is-toggle:hover .item-title{opacity:1}.dropmenu-item-check{align-items:center;display:flex;flex:1 1 auto;justify-content:flex-end;padding-right:.5rem}.dropmenu-item .nested-toggle-icon.is-empty{width:.25rem}.dropmenu-item .item-icon{margin-right:-.25rem}.card-list{--list-gap:.625rem;--list-count-per-row:1}.card-list,.card-list-item{padding:calc(var(--list-gap)/2)}.card-list-item{width:calc(100%/var(--list-count-per-row))}.card-grid{display:flex;flex-wrap:wrap}.card-grid .card{height:100%}:root{--form-control-border:var(--color-border-strong)}.checkbox-primary.disabled,.checkbox-primary.disabled>label,.checkbox-primary>input[type=checkbox]:disabled,.checkbox-primary>input[type=checkbox]:disabled+label,.radio-primary.disabled,.radio-primary.disabled>label,.radio-primary>input[type=radio],.radio-primary>input[type=radio]:disabled+label{filter:none!important}.checkbox-primary.disabled>label,.radio-primary.disabled>label{opacity:1}.checkbox-primary.disabled>label:before,.radio-primary.disabled>label:before{background-color:rgba(var(--color-inverse-rgb),.05);opacity:.5}.form-actions{gap:1rem;justify-content:center}.form-actions .btn{min-width:96px}.form-control-static{min-height:32px;padding-bottom:.375rem;padding-top:.375rem}:root{--zt-panel-form-max-width:1000px}.size-sm{--zt-panel-form-max-width:800px}.size-lg{--zt-panel-form-max-width:1200px}.panel-body>.container,.panel-heading>.container{max-width:var(--panel-container-width);min-width:0;padding-left:var(--panel-container-padding);padding-right:var(--panel-container-padding)}.panel-heading>.container{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;gap:1rem;justify-content:space-between;min-height:48px}.panel-form{border-radius:var(--radius-md);margin-bottom:1rem;margin-left:auto;margin-right:auto;max-width:var(--zt-panel-form-max-width);min-width:var(--zt-panel-form-min-width);overflow:visible;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-bottom:1rem;padding-left:1rem;padding-right:1rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.panel-form .form-actions{background-color:rgba(var(--color-canvas-rgb),.8);bottom:0;padding-bottom:1rem;padding-top:1rem;position:sticky;z-index:3;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.panel-form .form-grid{margin-left:calc(0px - var(--form-grid-gap-y-half));margin-right:calc(0px - var(--form-grid-gap-y-half));padding-bottom:0}.panel-form-toolbar{padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half);width:100%}.panel-form-toolbar>.toolbar{gap:1rem;padding-bottom:.75rem;padding-top:.75rem}.panel-form-divider{margin-bottom:.75rem;margin-top:1rem;padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half);width:100%}.panel-form-divider:before{background-color:rgba(var(--color-border-rgb),.7);display:block;height:1px;--tw-content:"";content:var(--tw-content)}.is-full .btn-full-form,.is-lite .btn-lite-form{z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-300-rgb),var(--tw-ring-opacity))}.btn-toggle-fold:after{content:attr(data-expand-text)}.show-fold-items .btn-toggle-fold:after{content:attr(data-collapse-text)}.is-foldable,.is-full .full\:hidden,.is-full .lite\:visible,.is-full .panel-form-divider,.is-full .panel-form-toolbar,.is-lite .full\:visible,.is-lite .lite\:hidden,.no-foldable-items .btn-toggle-fold{display:none}.is-foldable.is-pinned,.is-full .full\:visible,.is-full .is-foldable,.is-full .lite\:hidden,.is-lite .full\:hidden,.is-lite .lite\:visible,.show-fold-items .is-foldable{display:block}.is-full .full\:w-1\/2,.is-lite .lite\:w-1\/2{width:50%}.is-full .full\:w-1\/3,.is-lite .lite\:w-1\/3{width:33.333333%}.is-full .full\:w-2\/3,.is-lite .lite\:w-2\/3{width:66.666667%}.is-full .full\:w-1\/4,.is-lite .lite\:w-1\/4{width:25%}.is-full .full\:w-2\/4,.is-lite .lite\:w-2\/4{width:50%}.is-full .full\:w-3\/4,.is-lite .lite\:w-3\/4{width:75%}.is-full .full\:w-1\/5,.is-lite .lite\:w-1\/5{width:20%}.is-full .full\:w-2\/5,.is-lite .lite\:w-2\/5{width:40%}.is-full .full\:w-3\/5,.is-lite .lite\:w-3\/5{width:60%}.is-full .full\:w-4\/5,.is-lite .lite\:w-4\/5{width:80%}.is-full .full\:w-1\/6,.is-lite .lite\:w-1\/6{width:16.666667%}.is-full .full\:w-2\/6,.is-lite .lite\:w-2\/6{width:33.333333%}.is-full .full\:w-3\/6,.is-lite .lite\:w-3\/6{width:50%}.is-full .full\:w-4\/6,.is-lite .lite\:w-4\/6{width:66.666667%}.is-full .full\:w-5\/6,.is-lite .lite\:w-5\/6{width:83.333333%}.is-full .full\:w-full,.is-lite .lite\:w-full{width:100%}.page-form{--panel-container-width:960px;--panel-container-padding:20px;--zt-panel-form-max-width:1200px;--zt-panel-form-min-width:1040px;padding-left:0;padding-right:0;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.page-form .panel-heading{border-bottom-width:1px;--tw-border-opacity:0.7;padding:0}.page-form .panel-title{font-size:1rem;line-height:1.5rem}@media (max-width:1240px){.page-form{--zt-panel-form-max-width:1100px}}@media (max-width:1110px){.page-form{--zt-panel-form-max-width:1040px}}.modal-body>.page-form{margin:-1.5rem -2rem!important;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-body>.page-form>.panel-heading{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);position:sticky;top:-1.25rem;z-index:2;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-bottom:.375rem;padding-top:.375rem}.modal-body>.panel-form .form-actions{bottom:-1.5rem!important;padding-bottom:1.5rem;padding-top:1.5rem}.dropdown.popover{display:flex;flex-direction:column;position:absolute;z-index:1200}.dropdown.show{display:flex}.dropdown-menu{display:none;--menu-min-width:7rem;--menu-max-width:20rem}.dropdown-menu.show,.menu-wrapper>.dropdown-menu,.show>.dropdown-menu{display:block}.dropdown>.dropdown-menu,.menu-wrapper .dropdown-menu{position:relative}.popup .popup.search-menu{background-color:var(--menu-bg)}.show>.menu-wrapper{display:flex}.dropdown>.menu-wrapper{height:100%}.dropdown>.menu-wrapper .menu-wrapper{position:absolute}.dropdown>.menu-wrapper.is-tree .menu-wrapper{position:relative}.is-contextmenu .is-nested-show>a:not(:hover){--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity))}.is-contextmenu .menu-item.is-nested>.item-inner>.nested-toggle-icon{position:absolute;right:.25rem;top:.375rem}.is-contextmenu .menu-nested .menu-item>.item-inner{padding-left:.5rem;padding-right:1.25rem}.is-contextmenu .menu-nested .menu-item>.item-inner>.item-content{overflow:hidden}.dropdown>.arrow{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.global-search-panel li:not(.order-first):hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.global-search-panel li a{width:100%}.global-search-panel li{cursor:pointer}.history-panel>.panel-heading+.panel-body{margin-top:-.75rem}.history-panel-action{position:relative}.history-panel-action:before{border-left-width:1px;bottom:-.375rem;left:.5rem;position:absolute;top:22px;--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-content:"";content:var(--tw-content)}.col-reverse>.history-panel-action:first-child:before,.col>.history-panel-action:last-child:before{display:none}.history-panel-action>.item-inner{padding-left:1.5rem}.history-panel-action>.item-inner>.avatar{left:0;position:absolute;top:.375rem}.history-panel-action .file-list-item .item-content{flex:none}.history-panel-action blockquote{margin-top:.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding:.25rem .25rem .25rem .5rem}.history-panel-action blockquote.original{display:none}.img-cutter{background:var(--color-gray-100);border:1px solid #ddd;margin-bottom:20px;padding:10px}.img-cutter .canvas{margin:0 auto;max-width:100%;min-width:50px;position:relative}.img-cutter .cover{bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.img-cutter .controller{background:none;border:1px dashed hsla(0,0%,100%,.7);cursor:move;position:absolute;z-index:5}.img-cutter .control{background:#000;background:rgba(0,0,0,.6);border:1px solid hsla(0,0%,100%,.6);height:6px;position:absolute;width:6px}.img-cutter .control[data-type=left]{cursor:w-resize;left:-4px;margin-top:-3px;top:50%}.img-cutter .control[data-type=top]{cursor:n-resize;left:50%;margin-left:-3px;top:-4px}.img-cutter .control[data-type=right]{cursor:e-resize;margin-top:-3px;right:-4px;top:50%}.img-cutter .control[data-type=bottom]{bottom:-4px;cursor:s-resize;left:50%;margin-left:-3px}.img-cutter .control[data-type=top-left]{cursor:nw-resize;left:-4px;top:-4px}.img-cutter .control[data-type=top-right]{cursor:ne-resize;right:-4px;top:-4px}.img-cutter .control[data-type=bottom-left]{bottom:-4px;cursor:sw-resize;left:-4px}.img-cutter .control[data-type=bottom-right]{bottom:-4px;cursor:se-resize;right:-4px}.img-cutter .cliper{bottom:0;left:0;position:absolute;right:0;top:0;z-index:2}.messager-lite{border-radius:var(--radius-lg);min-width:160px;--tw-bg-opacity:1!important;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))!important;padding:1rem 1.5rem;--tw-text-opacity:1!important;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))!important;--skin-ring:transparent!important;--skin-text:inherit!important;--skin-color:var(--color-gray-500)}.messager-lite .alert-icon{color:var(--skin-color);font-size:1.5rem;line-height:2rem}.messager-lite .alert-text{font-size:.875rem;font-weight:700;line-height:1.3rem}.messager-lite .toolbar{gap:.5rem;margin-left:2rem}.messager-lite .alert-content+.alert-close{margin-left:1.5rem}.messager-lite .toolbar .btn.ghost{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.modal-reconfirm .modal-body{font-size:14px;font-weight:700;padding:24px 32px}.modal-reconfirm .modal-footer{justify-content:center;padding:24px}.picker-deselect-btn{opacity:.6;transition-duration:.15s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.picker-multi-selection{cursor:pointer;padding-right:.5rem;position:relative}.picker-multi-selection .picker-deselect-btn{bottom:0;left:0;position:absolute;right:0;top:0;--tw-scale-x:0;--tw-scale-y:0;background-color:rgba(var(--color-surface-rgb),.8);opacity:0}.picker-deselect-btn:hover,.picker-multi-selection .picker-deselect-btn,.picker-multi-selection:hover .picker-deselect-btn{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.picker-deselect-btn:hover,.picker-multi-selection:hover .picker-deselect-btn{--tw-scale-x:1;--tw-scale-y:1;opacity:1;--state-color:rgba(var(--color-surface-rgb),.9)}.pick-pri{flex-direction:row;justify-content:flex-start;position:relative}.pick-pri,.pick-pri>.text{align-items:center;display:flex}.pick-pri>.text{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap}.pick-pri .placeholder{--tw-text-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-text-opacity))}.pick-pri-list>.btn{justify-content:flex-start}.disabled.pick-pri,.disabled.pick-pri>*{filter:none}.search-form{--gutter-width:12px;padding-bottom:.5rem}.search-form-container{border-radius:var(--radius);min-height:116px;position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.is-simple .search-form-container{min-height:56px}.search-form-field td{padding:.375rem}.search-form-field td.is-andOr,.search-form-field td.is-operator{width:5rem}.search-form-field td.is-condition{width:7rem}.search-form-field td.is-operator{width:5rem}[lang=en] .search-form-field td.is-operator{width:6rem}.search-form .sidebar-right.is-collapsed{margin-right:-.375rem}.is-simple .search-form-wrapper{display:flex}.is-simple .search-form-wrapper>.row{flex:1 1 auto}.is-simple .search-form-wrapper>.toolbar{flex:none;margin-top:0}.zinbar [data-hint]{position:relative}.zinbar [data-hint]:after{background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity));border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg);bottom:100%;display:block;pointer-events:none;position:absolute;right:0;white-space:nowrap;z-index:50;--tw-bg-opacity:0.9;font-size:.75rem;line-height:1rem;padding:.125rem .25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:attr(data-hint);content:var(--tw-content)}.zinbar [data-hint]:hover:after{opacity:1}.zin-perf-btn-list .text-danger{color:var(--color-danger-400)}.zinbar .state{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.zinbar .state:active{--tw-scale-x:1.05;--tw-scale-y:1.05}.zinbar .state:active,.zinbar.collapse{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.zinbar.collapse{--tw-translate-x:100%}.zinbar.collapse>div{pointer-events:none}.zinbar{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.7s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}body[z-perf=danger]:before,body[z-perf=warning]:before{bottom:0;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:9990;--tw-border-opacity:1;border-color:rgba(var(--color-warning-600-rgb),var(--tw-border-opacity));font-size:.75rem;line-height:1rem;--tw-content:"";border-style:inset;border-width:12px 8px 8px;content:var(--tw-content)}body[z-perf=danger]:before{--tw-border-opacity:1;border-color:rgba(var(--color-danger-600-rgb),var(--tw-border-opacity))}body[z-perf=danger]:after,body[z-perf=warning]:after{font-size:.75rem;font-weight:700;left:0;line-height:1rem;line-height:1;pointer-events:none;position:fixed;right:0;text-align:center;top:0;z-index:9991;--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity));--tw-content:attr(z-perf-message);content:var(--tw-content)}.card{border-radius:var(--radius);min-height:28px;position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;transition-duration:.15s;transition-property:box-shadow,border,color,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.card:hover{--tw-shadow:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--tw-shadow-colored:0 2px 6px -1px var(--tw-shadow-color),0 1px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.card-content,.card-footer,.card-header,.card-heading{padding:.25rem .5rem}.card-heading{align-items:center;display:flex;gap:.5rem}.card-icon{opacity:.5}.card-header{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.card-content{display:flex;flex-direction:column;gap:.25rem}.card-actions{position:absolute;right:.125rem;top:.125rem}.card-actions+.card-heading{padding-right:1.75rem}.card-subtitle{font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.card.selected{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-400-rgb),var(--tw-ring-opacity))}.card-list{--list-gap:.625rem;--list-count-per-row:1}.card-list,.card-list-item{padding:calc(var(--list-gap)/2)}.card-list-item{width:calc(100%/var(--list-count-per-row))}.card-grid{display:flex;flex-wrap:wrap}.card-grid .card{height:100%}.contextmenu{display:none}.contextmenu.show{display:block}.contextmenu .popup .popup,.contextmenu.popup{position:absolute}.more,.more-vert{margin:.5rem;position:relative}.more,.more-vert,.more-vert:after,.more-vert:before,.more:after,.more:before{background-color:currentColor;border-radius:var(--radius-full);height:.125rem;width:.125rem}.more-vert:after,.more-vert:before,.more:after,.more:before{display:block;left:-5px;position:absolute;top:0;--tw-content:"";content:var(--tw-content)}.more-vert:after,.more:after{left:5px}.more-vert{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dashboard-blocks{position:relative}.dashboard-block-cell{position:absolute;transition-duration:.15s;transition-property:left,top;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-block{border-radius:var(--radius);bottom:.5rem;left:.5rem;position:absolute;right:.5rem;top:.5rem;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-block.is-dragging{opacity:0;z-index:1600}.dashboard-block-header{align-items:center;border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);display:flex;flex-direction:row;justify-content:space-between;left:0;padding:.75rem;pointer-events:none;position:absolute;right:0;top:0;z-index:10}.dashboard-block-header>*{pointer-events:auto}.dashboard-block-title{font-size:.875rem;font-weight:700;line-height:1.3rem}.dashboard-block-body{bottom:0;left:0;position:absolute;right:0;top:0}.dashboard-block-body>.panel{display:flex;flex-direction:column;height:100%;width:100%;--tw-shadow:0px 6px 16px rgba(202,215,235,.25)}.dashboard-block-body .panel-heading{cursor:move;flex:none}.dashboard-block-body .panel-body{flex:1 1 auto;overflow-y:auto}.has-more-menu>.dashboard-block-body .panel-heading{padding-right:3rem}.dashboard-block-body .panel-title{font-size:.875rem;height:2rem;line-height:1.3rem}.dashboard-block-actions .btn{opacity:.6}.dashboard-block-actions .btn:hover{opacity:1}.dashboard-drop-shadow{position:absolute;transition-duration:.15s;transition-property:left,top;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-drop-shadow:before{background-color:rgba(var(--color-inverse-rgb),.05);border-radius:var(--radius);bottom:.5rem;left:.5rem;position:absolute;right:.5rem;top:.5rem;--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-content:"";content:var(--tw-content)}:root{--dtable-checked-bg:var(--color-warning-50);--dtable-checked-bg-hover:var(--color-warning-100);--dtable-checked-border:var(--color-border-strong)}.dtable-cell.is-checked,.dtable-striped .dtable-cell.is-odd-row.is-checked{background-color:var(--dtable-checked-bg)}.checkbox-primary.dtable-checkbox{margin-right:-.375rem}.dtable-checkbox{order:-5}.dtable-hover-col .dtable-cell.is-hover-col.is-checked,.dtable-hover-row .dtable-cell.is-hover-row.is-checked{background-color:var(--dtable-checked-bg-hover)}.dtable-cell.is-checked{--dtable-border-color:var(--dtable-checked-border)}.dtable-check-info{flex-shrink:1;margin-right:.5rem;overflow:hidden;white-space:nowrap}:root{--toggle-icon-size:calc(var(--font-size-root)*3/4 + 1px)}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-color:currentColor;border-width:1px;display:block;opacity:.5;position:relative}.toggle-icon-collapse:hover,.toggle-icon-expand:hover,.toggle-icon:hover{opacity:.9}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-radius:inherit;height:var(--toggle-icon-size);width:var(--toggle-icon-size)}.is-collapsed .toggle-icon:after,.is-collapsed .toggle-icon:before,.is-expanded .toggle-icon:before,.toggle-icon-collapse:after,.toggle-icon-collapse:before,.toggle-icon-expand:before{background-color:currentColor;content:" ";display:block;height:1px;left:2px;position:absolute;right:2px;top:calc((var(--toggle-icon-size) - 3px)/2)}.is-collapsed .toggle-icon:after,.toggle-icon-collapse:after{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:root{--dtable-nt-size:calc(var(--font-size-root)*3/4 + 1px)}.dtable-nested-indent{flex:none;margin-right:-.25rem;order:-100}.dtable-nested-toggle{align-items:center;border-radius:var(--radius-sm);display:flex;flex:none;height:1.25rem;justify-content:center;margin-left:-.25rem;order:-6;width:1.25rem}.dtable-nested-toggle.is-no-child{margin-right:-.25rem;opacity:0;pointer-events:none}.dtable-child-label{order:-5}.dtable-header-group{align-items:center;background:var(--dtable-header-bg);cursor:default;display:flex;justify-content:center;left:0;position:absolute;top:1px;z-index:30}.dtable-bordered .dtable-header-group{border-bottom:1px solid var(--dtable-border-color);border-left:1px solid var(--dtable-border-color)}.dtable-header-as-group{contain:style;content-visibility:visible;overflow:visible!important}.dtable-sorting{cursor:move}.dtable-cell.is-sorting-from{background-color:var(--dtable-bg);z-index:20}.dtable-cell.is-sorting-from:before{border-top-width:1px}.dtable-sorting .dtable-cell.is-sorting-after{--tw-translate-y:-100%}.dtable-sorting .dtable-cell.is-sorting-after,.dtable-sorting .dtable-cell.is-sorting-before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dtable-sorting .dtable-cell.is-sorting-before{--tw-translate-y:100%}.dtable-cell.is-sorting-before:before,.dtable-cell.is-sorting-from:before{border-bottom-width:1px;border-top-width:1px}.dtable{--dtable-bg:var(--color-canvas);--dtable-striped-bg:var(--color-gray-50);--dtable-hover-bg:rgba(var(--color-primary-500-rgb),.05);--dtable-header-bg:var(--color-surface);--dtable-footer-bg:var(--color-surface);--dtable-border-color:var(--color-border);--dtable-sorter-size:0.3125rem}.dtable{position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.dtable.no-animation *{transition-property:none!important}.dtable-block{overflow:hidden;position:absolute;width:100%}.dtable-header{background-color:var(--dtable-header-bg);border-top-left-radius:inherit;border-top-right-radius:inherit}.dtable-body{overflow:hidden}.dtable-cells{background-color:var(--dtable-bg);height:100%;position:absolute;z-index:0}.dtable-cells-container{height:100%;position:absolute;width:100%}.dtable-header .dtable-cells{background-color:var(--dtable-header-bg)}.dtable-cells.dtable-fixed-left,.dtable-cells.dtable-fixed-right{z-index:10}.dtable-cell{position:absolute;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-cell:after,.dtable-cell:before{bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:-1px;z-index:2}.dtable-cell:before{border-bottom-width:1px;border-color:var(--dtable-border-color);opacity:1}.dtable-header-cell{align-items:center;display:flex;font-weight:700}.dtable-header-cell:after,.dtable-header-cell:before{top:0}.dtable-cell-content{align-items:center;display:flex;gap:.25rem;height:100%;overflow:hidden;padding-left:.75rem;padding-right:.75rem;position:relative;white-space:nowrap;width:100%;z-index:5}.dtable-body .dtable-cell.is-last-row:before{border-bottom-width:0}.dtable-footer{align-items:center;background-color:var(--dtable-footer-bg);border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-color:var(--dtable-border-color);border-top-width:1px;display:flex;padding-left:.75rem;padding-right:.75rem;position:absolute;width:100%;z-index:10}.dtable-empty-tip{align-items:center;display:flex;height:100%;justify-content:center}.dtable .scrollbar{z-index:20}.dtable-header{transition-duration:1s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-scrolled-down .dtable-header{border-bottom-color:rgba(var(--color-inverse-rgb),.15);border-bottom-width:1px}.dtable-has-scroll-y:not(.dtable-scrolled-bottom) .dtable-footer{border-top-color:rgba(var(--color-inverse-rgb),.15);border-top-width:1px}.dtable-scroll-shadow{background-image:linear-gradient(90deg,rgba(0,0,0,.03),transparent),linear-gradient(90deg,rgba(0,0,0,.03),transparent 50%);opacity:0;pointer-events:none;position:absolute;top:0;transition-duration:1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:8px;z-index:20}.dtable:hover .dtable-scroll-shadow{opacity:1}.dtable-scroll-shadow.is-right{margin-left:-7px;--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dtable-scroll-shadow.is-left,.dtable-scrolled-end .dtable-scroll-shadow.is-right{visibility:hidden}.dtable-scroll-shadow.is-right,.dtable-scrolled-right .dtable-scroll-shadow.is-left{visibility:visible}.scrollbar-hover:hover .scrollbar{opacity:0}.scrollbar-hover .dtable-body:hover~.scrollbar{opacity:var(--scrollbar-opacity)}.dtable-sort{display:inline-flex;height:calc(var(--dtable-sorter-size)*12/5);margin-left:.25rem;opacity:.8;position:relative}.dtable-cell:hover .dtable-sort{opacity:1}.dtable-sort:after,.dtable-sort:before{border-color:transparent;border-style:solid;height:0;left:0;opacity:.4;position:absolute;width:0;--tw-content:"";border-width:var(--dtable-sorter-size);content:var(--tw-content)}.dtable-sort:before{border-bottom-color:currentColor;border-top-width:0;top:0}.dtable-sort:after{border-bottom-width:0;border-top-color:currentColor;bottom:0}.dtable-sort.dtable-sort-asc:before,.dtable-sort.dtable-sort-desc:after{opacity:.9}.dtable-sort-link{align-items:center;cursor:pointer;display:inline-flex}.dtable-cells.dtable-fixed-left:before,.dtable-cells.dtable-fixed-right:before{border-color:var(--dtable-border-color);content:"";height:100%;pointer-events:none;position:absolute;width:100%;z-index:5}.dtable-cells.dtable-fixed-left:before{border-right-width:1px;right:-1px}.dtable-cells.dtable-fixed-right:before{border-left-width:1px;left:0}.dtable-bordered:before{border-color:var(--dtable-border-color);border-radius:inherit;border-width:1px;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:15}.dtable-bordered .dtable-cell:before{border-width:1px;right:-1px}.dtable-cell.has-border-left:before{border-left-width:1px}.dtable-cell.has-border-right:before{border-right-width:1px;right:-1px}.dtable-striped .dtable-cell.is-odd-row{background-color:var(--dtable-striped-bg)}.dtable-hover-cell .dtable-cell:hover:after,.dtable-hover-col .dtable-cell.is-hover-col:before,.dtable-hover-row .dtable-body .dtable-cell.is-hover-row:before{background-color:var(--dtable-hover-bg)}.kanban,.kanban-list{--kanban-lane-name-width:20px;--kanban-col-width:280px;--kanban-cols-gap:8px;--kanban-lanes-gap:8px;--kanban-header-height:32px;--kanban-lane-height:auto;--kanban-lane-color:var(--color-primary-500);--kanban-link-color:var(--color-secondary-600)}.kanban{align-items:flex-start;display:flex;flex-direction:column;min-width:-moz-fit-content;min-width:fit-content;position:relative}.kanban-header{display:flex;flex-direction:row;height:var(--kanban-header-height)}.kanban.has-sub-cols .kanban-header{height:calc(var(--kanban-header-height)*2)}.kanban-header-lane-name{background-color:rgba(var(--color-fore-rgb),.05);flex:none;width:var(--kanban-lane-name-width)}.kanban-header-cols,.kanban-header-sub-cols{display:flex;flex:1 1 0%;flex-direction:row;gap:var(--kanban-cols-gap)}.kanban-header-sub-cols{border-top-width:2px;--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity))}.kanban-header-col{align-items:center;border-bottom-width:1px;display:flex;flex:1 1 0%;flex-direction:column;height:100%;width:var(--kanban-col-width)}.kanban-header-col.has-subs{width:auto}.kanban-header-col-wrapper{align-items:center;display:flex;flex:1 1 0%;flex-direction:row;position:relative;width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:3.5rem;padding-right:3.5rem}.kanban-header-col-wrapper.is-align-left{justify-content:flex-start;padding-left:.5rem}.kanban-header-col-wrapper.is-align-left>.kanban-header-title{justify-content:flex-start}.kanban-header-title{align-items:center;display:flex;flex:1 1 auto;flex-direction:row;justify-content:center;overflow:hidden}.kanban-header-title>.as-title{color:var(--kanban-col-color);font-weight:700;overflow:hidden;white-space:nowrap}.kanban-header-col-actions{bottom:.25rem;position:absolute;right:.25rem;top:.25rem}.kanban-header-col-actions>.btn{opacity:.6}.kanban-header-col-actions>.btn:hover{opacity:1}.kanban-body{display:flex;flex-direction:column;gap:var(--kanban-lanes-gap)}.kanban-lane{display:flex;flex-direction:row;height:var(--kanban-lane-height);min-height:96px}.kanban-lane-name{align-items:center;background-color:var(--kanban-lane-color);display:flex;justify-content:center;width:var(--kanban-lane-name-width);--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity));writing-mode:vertical-rl}.kanban-lane-actions,.kanban-lane-name{flex:none;position:relative}.kanban-lane.is-first .kanban-lane-actions{margin-top:calc(4px - var(--kanban-header-height))}.has-sub-cols .kanban-lane.is-first .kanban-lane-actions{margin-top:calc(4px - var(--kanban-header-height)*2)}.kanban-lane-actions>.btn.square{width:var(--kanban-lane-name-width)}.kanban-lane-title{align-items:center;display:flex;flex:1 1 auto;justify-content:center;overflow:hidden;white-space:nowrap}.kanban-lane-cols{display:flex;flex-direction:row;gap:var(--kanban-cols-gap)}.kanban-lane-col{background-color:rgba(var(--color-inverse-rgb),.05);display:flex;flex-direction:column;height:100%;width:var(--kanban-col-width)}.kanban-header-col,.kanban-lane-col{margin-left:calc(var(--kanban-col-gap-left) - var(--kanban-cols-gap));margin-right:calc(var(--kanban-col-gap-right) - var(--kanban-cols-gap))}.kanban-col-content{position:relative;z-index:5}.kanban-lane.is-first>.kanban-lane-name:before{background-color:var(--kanban-lane-color);bottom:100%;display:block;height:var(--kanban-header-height);left:0;position:absolute;right:0;--tw-content:"";content:var(--tw-content)}.kanban.has-sub-cols .kanban-lane.is-first>.kanban-lane-name:before{height:calc(var(--kanban-header-height)*2)}.kanban-lane{margin-bottom:calc(var(--kanban-col-gap-bottom) - var(--kanban-lanes-gap));margin-top:calc(var(--kanban-col-gap-top) - var(--kanban-lanes-gap))}.kanban-items{flex:1 1 auto;overflow:auto;scrollbar-gutter:both-edges stable}.kanban-lane.is-auto-height .kanban-items{scrollbar-gutter:auto}.kanban-item{cursor:default}.kanban-item .card-actions{z-index:5}.kanban-heading{width:100%}.kanban-heading .listitem{height:2.25rem}.kanban-heading .item-title{font-weight:700}.kanban.has-dragging{cursor:move}.kanban-item.is-dragging{cursor:move;opacity:.1}.kanban-sticky .kanban-header{position:sticky;top:0;z-index:10;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.kanban-sticky .kanban-header.is-pinned{border-bottom-color:rgba(var(--color-inverse-rgb),.15);border-bottom-width:1px;z-index:20;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.kanban-sticky .kanban-lane-name{left:0;position:sticky;z-index:21}.kanban-region{border-radius:var(--radius);min-width:-moz-fit-content;min-width:fit-content;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding:.75rem;--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.kanban-region>.kanban+.kanban{margin-top:.75rem}.kanban-region.has-heading{padding-top:0}.kanban-heading>.listitem{left:.75rem;position:sticky;width:calc(var(--kanban-list-width) - 24px)}.kanban-list{display:flex;flex-direction:column;gap:.75rem;height:100vh;overflow:auto;position:relative;scrollbar-gutter:stable}.kanban-list.is-moving{cursor:grabbing}.kanban-items.is-dropping{position:relative}.kanban-item.is-dropping{position:relative;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.kanban-item.is-dropping:after,.kanban-items.is-dropping>.card-list:after{background-color:rgba(var(--color-warning-500-rgb),.5);border-radius:var(--radius-full);display:block;height:.25rem;--tw-content:"";content:var(--tw-content)}.kanban-item.is-dropping:after{left:.25rem;position:absolute;right:.25rem;top:-.25rem}.kanban-item.is-dropping[z-drop-side=before]{--tw-translate-y:0.25rem}.kanban-item.is-dropping[z-drop-side=after],.kanban-item.is-dropping[z-drop-side=before]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-item.is-dropping[z-drop-side=after]{--tw-translate-y:-0.25rem}.kanban-item.is-dropping[z-drop-side=after]:after{bottom:-.25rem;top:auto}.kanban-links{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:5}.kanban-list>.kanban-links{overflow:visible;z-index:11}.kanban-link{align-items:center;color:var(--kanban-link-color);display:flex;justify-content:center;position:absolute}.kanban-link>svg{position:absolute}.kanban-link-text{border-radius:var(--radius);height:1em;line-height:1;padding-left:.125rem;padding-right:.125rem;pointer-events:auto;position:relative;text-align:center;white-space:nowrap}.kanban-link-start-point{height:.5rem;width:.5rem;--tw-translate-x:-0.25rem;--tw-translate-y:-0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-start-point,.kanban-link-start-point:before{background-color:currentColor;border-radius:var(--radius-full);position:absolute}.kanban-link-start-point:before{bottom:-.25rem;display:block;left:-.25rem;opacity:.2;right:-.25rem;top:-.25rem;--tw-content:"";content:var(--tw-content)}.kanban-link path{pointer-events:auto}.kanban-link path+path{opacity:.6}.kanban-link.is-hover path+path{opacity:1;stroke-width:calc(var(--kanban-link-weight)*1.5)}.kanban-link-delete-btn{pointer-events:auto;--tw-scale-x:.75;--tw-scale-y:.75;opacity:0;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.is-hover .kanban-link-delete-btn,.kanban-link-delete-btn{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.is-hover .kanban-link-delete-btn{--tw-scale-x:1;--tw-scale-y:1;opacity:1}.is-adding-link{cursor:crosshair;-webkit-user-select:none;-moz-user-select:none;user-select:none}.kanban-link-editor{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:20}.kanban-link-editor-from,.kanban-link-editor-to{border-radius:var(--radius);--tw-shadow-color:rgb(var(--color-primary-500-rgb));--tw-shadow:var(--tw-shadow-colored);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-500-rgb),var(--tw-ring-opacity))}.kanban-link-editor-from,.kanban-link-editor-point,.kanban-link-editor-to{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);position:absolute}.kanban-link-editor-point{height:.5rem;pointer-events:auto;width:.5rem;--tw-translate-x:-0.25rem;--tw-translate-y:-0.25rem;border-radius:var(--radius-full);cursor:move;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));opacity:.5;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--color-primary-500-rgb),0.1);transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.kanban-link-editor-point.is-left{left:0;top:50%}.kanban-link-editor-point.is-right{right:0;top:50%;--tw-translate-x:0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-editor-point.is-top{left:50%;top:0}.kanban-link-editor-point.is-bottom{bottom:0;left:50%;--tw-translate-y:0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-editor-point:hover{opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-primary-500-rgb),0.5)}.tab-pane{display:none}.tab-pane.active{display:block}.has-sorting-col{cursor:move;--dtable-sorting-col-color:var(--color-primary-300);--dtable-hover-bg:transparent}.has-sorting-col .dtable-col-splitter{display:none}.dtable-cell.is-sorting-col-move{transition-duration:.15s;transition-property:left;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-cell.is-sorting-from-col{transition-duration:.1s}.dtable-cell.is-sorting-from-col:after{background-color:var(--dtable-sorting-col-color)!important;opacity:.1!important}.dtable-cell.is-sorting-from-col:before{border-left:1px solid var(--dtable-sorting-col-color);border-right:1px solid var(--dtable-sorting-col-color)}.dtable-header-cell.is-sortable-col{cursor:move}.has-sorting-col .scrollbar.is-horz{opacity:var(--scrollbar-opacity)!important}.has-sorting-col .dtable-scroll-shadow{visibility:visible}:root{--dtable-col-splitter-width:7px;--dtable-col-splitter-color:var(--color-primary-500)}.dtable-cell.has-col-resizing:after,.dtable-cell.has-col-splitter:hover:after{background:var(--dtable-col-splitter-color);opacity:.05}.dtable-col-splitter{background:var(--dtable-col-splitter-color);border-radius:var(--radius-full);bottom:0;cursor:ew-resize;opacity:0;position:absolute;right:calc(var(--dtable-col-splitter-width)/-2);top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--dtable-col-splitter-width);z-index:20}.dtable-cell.has-col-splitter:hover .dtable-col-splitter{opacity:.3}.dtable-cell.has-col-resizing .dtable-col-splitter,.dtable-cell.has-col-splitter .dtable-col-splitter:hover{opacity:.5}.dtable.has-col-resizing .dtable-cell.has-col-splitter:not(.has-col-resizing) .dtable-col-splitter,.dtable.has-col-resizing .dtable-cell.has-col-splitter:not(.has-col-resizing):after{opacity:0}.dtable-col-splitter:after,.dtable-col-splitter:before{content:" ";display:block;height:.5rem;left:50%;margin-top:-.25rem;position:absolute;top:50%;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity))}.dtable-col-splitter:before{margin-left:-1px}.dtable-col-splitter:after{margin-left:1px}.dtable.has-col-resizing{--dtable-hover-bg:transparent}.dtable.has-col-resizing,.has-col-resizing .dtable-header-cell{cursor:ew-resize!important}.dtable-cell.is-col-resizing:before{border-right:1px solid var(--dtable-col-splitter-color)}.dtable-cell.is-col-resizing:after{background:var(--dtable-col-splitter-color);opacity:.05}.has-col-resizing .scrollbar.is-horz{opacity:var(--scrollbar-opacity)!important}.dtable-cell.has-contextmenu-show:after{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));opacity:.1}.dtable{--dtable-header-bg:var(--color-surface-light);--dtable-footer-bg:var(--color-surface-light);--dtable-border-color:var(--color-border-light);--dtable-checked-border:var(--color-border);--dtable-checked-bg:var(--color-primary-50);--dtable-checked-bg-hover:var(--color-primary-100);--dtable-hover-bg:rgba(var(--color-gray-500-rgb),.05);--dtable-link-color:var(--color-link);--dtable-link-hover-color:var(--color-link-hover);--dtable-link-visited-color:var(--color-link-visited)}.dtable-cell-content[style*="--color-link"]{--dtable-link-hover-color:var(--color-link);--dtable-link-visited-color:var(--color-link)}.dtable-body .dtable-cell a{--dtable-link-color:var(--color-link)}.dtable-body .dtable-cell a:not(.btn){color:var(--dtable-link-color)}.dtable-body .dtable-cell a:not(.btn):visited{color:var(--dtable-link-visited-color)}.dtable-body .dtable-cell a:not(.btn):hover{color:var(--dtable-link-hover-color)}.dtable .btn-avatar{border-radius:var(--radius-full);gap:.25rem;height:1.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity));padding-left:0;padding-right:.5rem;--tw-ring-color:transparent}.dtable .btn-avatar:hover{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dtable-nested-toggle{width:1rem}.dtable .toggle-icon{--toggle-icon-size:11px;border-radius:var(--radius);--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.dtable .toggle-icon:after,.dtable .toggle-icon:before{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-700-rgb),var(--tw-bg-opacity))}.dtable-footer>.toolbar{margin-right:.5rem}.dtable-header .dtable-cell[data-sort]>.dtable-cell-content>a:not(:hover){color:inherit}.dtable-assign-btn{align-items:center;border-radius:var(--radius-full);display:flex;flex-direction:row;height:1.25rem;padding-left:.375rem;padding-right:.375rem;--dtable-link-color:var(--color-fore)}.dtable-assign-btn:not(:hover){color:inherit}.dtable-assign-btn.is-me{--dtable-link-color:var(--color-warning-500)!important}.dtable-assign-btn:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.dtable-assign-btn>span{border-radius:var(--radius-full);line-height:20px;padding-left:.375rem;padding-right:.375rem}.dtable-assign-btn.is-unassigned>span{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.dtable-assign-btn.is-unassigned:hover>span{background-color:inherit;color:inherit;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.dtable-assign-btn>.icon{opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-assign-btn:not(.disabled):hover>.icon{opacity:1}.dtable-header .dtable-cell[data-type=assign]{padding-left:1.5rem}.dtable-cell-icon{order:-5}.dtable-custom-cell[data-type=control]{align-items:center;display:flex;justify-content:center;padding-left:.125rem;padding-right:.125rem;z-index:1}:root{--dtable-editing-color:var(--color-success-600)}.dtable-cell.is-editing:after{border-color:var(--dtable-editing-color);border-width:2px!important;opacity:1;z-index:20}.dtable-editing-input{height:100%;outline:2px solid transparent;outline-offset:2px;padding-left:.75rem;padding-right:.75rem;width:100%}:root{--dtable-selected-color:var(--color-success-500);--dtable-selected-bg:var(--color-success-50);--dtable-selecting-bg:var(--color-success-100);--dtable-highlight-color:var(--color-success-700)}.dtable-selectable{-webkit-user-select:none;-moz-user-select:none;user-select:none}.dtable-cell.is-select:after{border-color:var(--dtable-selected-color);border-width:1px;opacity:1;z-index:10}.dtable-cell.is-selecting{background:var(--dtable-selecting-bg)}.dtable-cell.is-selected{background:var(--dtable-selected-bg)}.dtable-cell.is-col-selected:after,.dtable-cell.is-row-selected[data-col=INDEX]:after{background-color:rgba(var(--color-inverse-rgb),.05);opacity:1}.dtable-cell.has-cell-selected{color:var(--dtable-highlight-color)}.dtable-cell.is-first-row.is-select:after{top:0}.dtable-cell.is-last-row.is-select:after{bottom:1px}.dtable-cell.is-first-in-row.is-select:after{left:1px}.dtable-cell.is-last-in-row.is-select:after{right:1px}.dtable-datagrid .dtable-cell[data-col=INDEX]{background:var(--dtable-header-bg)}.dtable-empty-tip{min-height:212px}.dtable-cell[data-type=actions] .btn>.icon{font-size:1rem;line-height:1.5rem}.menu.menu-dtable-actions.has-icons{align-items:center;display:flex;gap:.25rem;min-width:auto;--menu-icon-opacity:1}.menu.menu-dtable-actions.has-icons>.menu-item>a{padding-left:.25rem;padding-right:.25rem}.menu.menu-dtable-actions.has-icons>.menu-item>a>.icon-EMPTY,.menu.menu-dtable-actions.has-icons>.menu-item>a>.item-content{display:none}.menu.menu-dtable-actions.has-icons>.menu-item>a>.icon-EMPTY+.item-content,.menu.menu-dtable-actions.has-icons>.menu-item>a>.item-content:first-child{display:block}:root{--state-color:rgba(0,0,0,.03);--zt-page-bg:#f8f9fa;--zt-header-height:3rem;--zt-header-bg:var(--color-canvas);--zt-header-color:var(--color-fore);--zt-sidebar-width:160px;--zt-navbar-active-color:var(--color-primary-500)}body{background-color:var(--zt-page-bg)}.page-app{overflow:overlay}.container{min-width:1200px}#header{height:var(--zt-header-height);--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background:var(--zt-header-bg);border-bottom:1px solid var(--zt-header-border,rgba(var(--color-inverse-rgb),.05));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--zt-header-color)}#header>.container{height:100%;position:relative}#heading{align-items:center;bottom:0;display:flex;gap:.25rem;left:1rem;position:absolute;top:0}#heading>.toolbar{margin-left:-.75rem}#heading .dropmenu-btn>.text{max-width:142px}#heading>[data-zui-dropmenu]+div .dropmenu-btn>.text,#heading>[data-zui-dropmenu]+div+div .dropmenu-btn>.text{max-width:78px}#navbar{align-items:center;display:flex;font-size:.875rem;height:100%;justify-content:center;line-height:1.3rem;--state-color:rgba(var(--color-primary-500-rgb),.05);--state-active-opacity:1;--state-active-color:rgba(var(--color-primary-500-rgb),.08)}#navbar>.nav{--nav-active-color:var(--zt-navbar-active-color,var(--color-current));--nav-item-padding:12px;--nav-divider-margin:8px;margin-left:var(--nav-offset-left)}#navbar>.nav>.nav-item>a{height:3rem;padding-left:var(--nav-item-padding);padding-right:var(--nav-item-padding)}#navbar>.nav>.nav-item>a:before{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}#navbar>.nav>.nav-item>a.active:before{background:var(--state-active-color)!important;opacity:1!important}#navbar>.nav>.divider{align-self:center;height:1.25rem;margin-left:var(--nav-divider-margin);margin-right:var(--nav-divider-margin);opacity:.2}#navbar>.nav.compact{font-size:.8125rem;line-height:1.25rem}#navbar>.nav.compact-extra{font-size:.75rem;line-height:1rem}#toolbar{align-items:center;bottom:0;display:flex;gap:.25rem;position:absolute;right:1rem;top:0}#main{min-height:100vh}#header+#main{min-height:calc(100vh - 3rem)}#main>.container{padding-left:1rem;padding-right:1rem;position:relative}@media (min-width:1400px){#header>.container,#main>.container,#mainNavbar>.container{padding-left:2.5rem;padding-right:2.5rem}#heading{left:2.5rem}#toolbar{right:2.5rem}}#mainNavbar{height:2.75rem;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}#mainNavbar>.container{position:relative}#mainNavbar .nav{bottom:0;height:2.75rem;justify-content:center;left:0;position:absolute;right:0;top:0}#mainNavbar .nav-item{font-size:.875rem;line-height:1.3rem}#mainNavbar .nav-item>a{border-radius:var(--radius)}#mainMenu{gap:1rem;justify-content:space-between;padding-bottom:.75rem;padding-top:.75rem}#featureBar,#mainMenu{align-items:center;display:flex}#featureBar{flex:1 1 auto;gap:.5rem}#actionBar{gap:.5rem}#actionBar>.nav-divider{margin-left:-.25rem;margin-right:-.25rem}#mainContent{padding-top:.75rem}#mainMenu+#mainContent{padding-top:0}#mainContent.row{align-items:stretch;display:flex;gap:1rem;justify-content:space-between}#mainContent.row>*{flex:1 1 auto;min-width:0}#mainContainer.has-sidebar-left{--gutter-left-size:16px}#mainContainer.is-sidebar-left-collapsed{--gutter-left-size:0}.has-sidebar-animation.has-sidebar-left #mainMenu{transition-duration:.15s;transition-property:padding-left;transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--modal-radius:var(--radius);--avatar-bg:var(--color-gray-200)}.modal-alert .modal-footer{justify-content:center}.modal-dialog{--tw-bg-opacity:1}.modal-content,.modal-dialog{max-height:calc(100vh - 4rem)}.modal-body,.modal-footer,.modal-header{padding:1.5rem 2rem}.modal-header{padding-right:3rem}.modal-body+.modal-footer,.modal-header+.modal-actions+.modal-body,.modal-header+.modal-body{padding-top:1px}.modal-condensed .modal-body,.modal-condensed .modal-header{padding:1rem 1.25rem}.modal-condensed .modal-actions{top:.75rem}:root{--label-bg:var(--color-gray-100);--label-color:var(--color-gray-800)}.label[class$=-pale],.label[class*="-pale "]{--tw-bg-opacity:0.4;--tw-ring-opacity:0.4}.body-modal .panel-form,.modal-body>.panel-form{margin:0;padding:0}.modal-body>.panel-form>.panel-heading{padding-left:1px;padding-right:1px;padding-top:1px}.modal-body>.panel-form>.panel-body{padding:1px}.modal-body>.form{padding-top:1px}.modal .history,.modal .panel-body>.form{padding:0}:root{--article-p-space:0}.lane-col-join-with-above{position:relative}.lane-col-join-with-above:before{background-color:inherit;left:0;position:absolute;right:0;--tw-content:"";content:var(--tw-content);height:var(--kanban-col-gap-top,var(--kanban-lanes-gap));top:calc(0px - var(--kanban-col-gap-top, var(--kanban-lanes-gap)))}.arrow,.arrow:before{background:inherit;height:calc(var(--arrow-size)*1.4142);position:absolute;width:calc(var(--arrow-size)*1.4142)}.arrow{visibility:hidden;--arrow-size:5px}.arrow:before{border:inherit;content:"";visibility:visible;--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.arrow-top,.arrow-up{border-bottom:inherit;border-right:inherit;border-width:1px 0 0 1px;top:calc(1px - var(--arrow-size))}.white>.arrow-top,.white>.arrow-up{top:calc(0px - var(--arrow-size))}.arrow-bottom,.arrow-down{border-left:inherit;border-top:inherit;border-width:0 1px 1px 0;bottom:calc(1px - var(--arrow-size))}.white>.arrow-bottom,.white>.arrow-down{bottom:calc(0px - var(--arrow-size))}.arrow-left{border-right:inherit;border-top:inherit;border-width:0 0 1px 1px;left:calc(1px - var(--arrow-size))}.white>.arrow-left{left:calc(0px - var(--arrow-size))}.arrow-right{border-bottom:inherit;border-left:inherit;border-width:1px 1px 0 0;right:calc(1px - var(--arrow-size))}.white>.arrow-right{right:calc(0px - var(--arrow-size))}.caret,.caret-down,.caret-left,.caret-right,.caret-up{align-items:center;display:inline-flex;height:.75rem;justify-content:center;position:relative;width:.75rem}.caret-down:before,.caret-left:before,.caret-right:before,.caret-up:before,.caret:before{display:block;height:.35rem;transform-origin:center;width:.35rem;--tw-translate-y:-1px;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.caret-left:before{--tw-translate-x:0.125rem;--tw-translate-y:0px;--tw-rotate:135deg}.caret-left:before,.caret-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.caret-right:before{--tw-translate-x:-0.125rem;--tw-translate-y:0px;--tw-rotate:-45deg}.caret-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:focus>.caret,:hover>.caret{opacity:inherit}.disabled .caret,.readonly .caret{opacity:var(--caret-opacity,.5)}:root{--toggle-icon-size:calc(var(--font-size-root)*3/4 + 1px)}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-color:currentColor;border-width:1px;display:block;opacity:.5;position:relative}.toggle-icon-collapse:hover,.toggle-icon-expand:hover,.toggle-icon:hover{opacity:.9}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-radius:inherit;height:var(--toggle-icon-size);width:var(--toggle-icon-size)}.is-collapsed .toggle-icon:after,.is-collapsed .toggle-icon:before,.is-expanded .toggle-icon:before,.toggle-icon-collapse:after,.toggle-icon-collapse:before,.toggle-icon-expand:before{background-color:currentColor;content:" ";display:block;height:1px;left:2px;position:absolute;right:2px;top:calc((var(--toggle-icon-size) - 3px)/2)}.is-collapsed .toggle-icon:after,.toggle-icon-collapse:after{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.spinner,.spinner:after,.spinner:before{display:block;height:1em;position:relative;width:1em}.spinner:after,.spinner:before{border-radius:var(--radius-full);content:" ";position:absolute}.spinner:before{animation:-spin 1s cubic-bezier(.6,0,.4,1) infinite;border:.16667em solid transparent;border-top-color:currentcolor}.spinner:after{border:.16667em solid;opacity:.2}.magnifier{display:inline-block;height:1em;position:relative;width:1em}.magnifier:after,.magnifier:before{border-radius:var(--radius-full);content:"";display:block;position:absolute}.magnifier:before{border:1px solid;height:.75em;width:.75em}.magnifier:after{height:1px;left:.55em;top:.7em;width:.5em;--tw-rotate:45deg;background-color:currentColor;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.more,.more-vert{margin:.5rem;position:relative}.more,.more-vert,.more-vert:after,.more-vert:before,.more:after,.more:before{background-color:currentColor;border-radius:var(--radius-full);height:.125rem;width:.125rem}.more-vert:after,.more-vert:before,.more:after,.more:before{display:block;left:-5px;position:absolute;top:0;--tw-content:"";content:var(--tw-content)}.more-vert:after,.more:after{left:5px}.more-vert{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-down,.chevron-left,.chevron-right,.chevron-up{align-items:center;display:inline-flex;height:1em;justify-content:center;position:relative;width:1em}.chevron-down:before,.chevron-left:before,.chevron-right:before,.chevron-up:before{display:block;height:.6923077em;transform-origin:center;width:.6923077em;--tw-translate-y:-0.125rem;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.chevron-left:before{--tw-translate-y:0px;--tw-translate-x:0.125rem;--tw-rotate:135deg}.chevron-left:before,.chevron-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-right:before{--tw-translate-y:0px;--tw-translate-x:-0.125rem;--tw-rotate:-45deg}.chevron-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.i-time{border-color:currentColor;border-radius:50%;border-width:.08em;display:inline-block;height:1em;position:relative;width:1em}.i-time:after{border-color:currentColor;border-width:0 0 .08em .08em;height:.385em;left:.3846em;position:absolute;top:.08em;width:.385em;--tw-content:"";content:var(--tw-content)}.i-calendar{border-color:currentColor;border-radius:2px;border-width:.08em;display:inline-block;height:.79em;margin-top:.16em;position:relative;width:1em}.i-calendar:after,.i-calendar:before{border-color:currentColor;border-width:.08em;position:absolute;--tw-content:"";content:var(--tw-content)}.i-calendar:before{border-bottom-width:0;left:.15em;top:.307em;width:.6em}.i-calendar:after{border-bottom-width:0;border-top-width:0;height:.3077em;left:.17em;top:-.154em;width:.538em}:root{--state-color:rgba(0,0,0,.05);--state-scale:.9;--opacity-disabled:.7;--opacity-muted:.5;--load-indicator-duration:300ms;--load-indicator-delay:.5s}.btn,.item>a,.state{cursor:pointer;position:relative}.btn:before,.item>a:before,.state:before{background:var(--state-color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transform:scale(var(--state-scale));transition-duration:.2s;transition-property:opacity,transform,box-shadow,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn.active:not(:hover,:focus-visible,:focus-within,:active):before,.item>a.active:not(:hover,:focus-visible,:focus-within,:active):before,.state.active:not(:hover,:focus-visible,:focus-within,:active):before{background:var(--state-active-color,var(--state-color));opacity:var(--state-active-opacity,0);--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-duration:.7s}.btn.selected:not(:hover,:focus-visible,:focus-within,:active):before,.item>a.selected:not(:hover,:focus-visible,:focus-within,:active):before,.state.selected:not(:hover,:focus-visible,:focus-within,:active):before{background:var(--state-selected-color,var(--state-scale));opacity:var(--state-selected-opacity,.1);--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:focus-visible,.item>a:focus-visible,.state:focus-visible{outline:2px solid transparent;outline-offset:2px}.btn:active:before,.btn:focus-visible:before,.btn:hover:before,.item>a:active:before,.item>a:focus-visible:before,.item>a:hover:before,.state:active:before,.state:focus-visible:before,.state:hover:before{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:hover:before,.item>a:hover:before,.state:hover:before{opacity:var(--state-hover-opacity,1)}.btn:active:before,.item>a:active:before,.state:active:before{background:var(--state-pressed-color,var(--state-color));opacity:var(--state-pressed-opacity,.6);--tw-ring-color:var(--state-ring-color,currentColor);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);transition-duration:.7s}.btn:focus-visible:before,.item>a:focus-visible:before,.state:focus-visible:before{background:var(--state-focus-color,var(--state-color));opacity:var(--state-focus-opacity,1);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-focus-rgb),var(--tw-ring-opacity))}.btn.disabled:before,.btn[disabled]:before,.item>a.disabled:before,.item>a[disabled]:before,.state.disabled:before,.state[disabled]:before{display:none}.btn{--state-active-opacity:1}@-moz-document url-prefix(){.btn,:root{--state-active-opacity:0;--state-focus-opacity:0}}.disabled,.disabled *,[disabled],[disabled] *{cursor:not-allowed!important;opacity:var(--opacity-disabled);--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.load-indicator:after,.load-indicator:before{display:block;opacity:0;position:absolute;transition-delay:0s;transition-duration:.15s;transition-duration:var(--load-indicator-duration);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden}.load-indicator:before{align-items:center;background-color:rgba(var(--color-canvas-rgb),.7);border-radius:inherit;bottom:0;display:flex;font-size:.75rem;justify-content:center;left:0;line-height:1rem;right:0;top:0;z-index:99;--tw-content:attr(data-loading);content:var(--tw-content)}.load-indicator[data-loading]:before{padding-top:3.5rem}.load-indicator:after{border-color:transparent currentcolor currentcolor;border-radius:var(--radius-full);border-style:dotted;border-width:4px 3px 4px 4px;height:2rem;left:50%;margin-left:-1rem;margin-top:-1rem;top:50%;width:2rem;z-index:100;--tw-content:"";content:var(--tw-content)}.load-indicator.loading:after,.load-indicator.loading:before{opacity:1;transition-delay:var(--load-indicator-delay);visibility:visible}@keyframes -spin{to{transform:rotate(1turn)}}.load-indicator.loading:after{animation:-spin 1s linear infinite;opacity:.5}.events-none,.pointer-events-none{pointer-events:none}.events-auto,.pointer-events-auto{pointer-events:auto}.scroll-auto{scroll-behavior:auto}.scroll-smooth{scroll-behavior:smooth}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;-moz-user-select:auto;user-select:auto}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.active\:opacity-100.active,.active\:opacity-100:active,.group.active .group-active\:opacity-100,.group:active .group-active\:opacity-100,.group:hover .group-hover\:opacity-100,.hover\:opacity-100:hover{opacity:1}.active\:opacity-0.active,.active\:opacity-0:active,.group.active .group-active\:opacity-0,.group:active .group-active\:opacity-0,.group:hover .group-hover\:opacity-0,.hover\:opacity-0:hover{opacity:0}.active\:text-primary.active,.active\:text-primary:active,.group.active .group-active\:text-primary,.group:active .group-active\:text-primary,.group:hover .group-hover\:text-primary,.hover\:text-primary:hover{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.active\:border-primary.active,.active\:border-primary:active,.group.active .group-active\:border-primary,.group:active .group-active\:border-primary,.group:hover .group-hover\:border-primary,.hover\:border-primary:hover{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity))}.active\:primary-pale.active,.active\:primary-pale:active,.group.active .group-active\:primary-pale,.group:active .group-active\:primary-pale,.group:hover .group-hover\:primary-pale,.hover\:primary-pale:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.active\:primary.active,.active\:primary:active,.group.active .group-active\:primary,.group:active .group-active\:primary,.group:hover .group-hover\:primary,.hover\:primary:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.active\:canvas.active,.active\:canvas:active,.group.active .group-active\:canvas,.group:active .group-active\:canvas,.group:hover .group-hover\:canvas,.hover\:canvas:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.active\:font-bold.active,.active\:font-bold:active,.group.active .group-active\:font-bold,.group:active .group-active\:font-bold,.group:hover .group-hover\:font-bold,.hover\:font-bold:hover{font-weight:700}.active\:shadow.active,.active\:shadow:active,.group.active .group-active\:shadow,.group:active .group-active\:shadow,.group:hover .group-hover\:shadow,.hover\:shadow:hover{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.active\:shadow-lg.active,.active\:shadow-lg:active,.group.active .group-active\:shadow-lg,.group:active .group-active\:shadow-lg,.group:hover .group-hover\:shadow-lg,.hover\:shadow-lg:hover{--tw-shadow:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--tw-shadow-colored:0 5px 15px -3px var(--tw-shadow-color),0 2px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:block,.hover\:block:hover{display:block!important}.group:hover .group-hover\:flex,.hover\:flex:hover{display:flex!important}.group:hover .group-hover\:inline-flex,.hover\:inline-flex:hover{display:inline-flex!important}.group:hover .group-hover\:scale-110,.hover\:scale-110:hover{--tw-scale-x:1.1!important;--tw-scale-y:1.1!important}.group:hover .group-hover\:scale-110,.group:hover .group-hover\:scale-125,.hover\:scale-110:hover,.hover\:scale-125:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.group:hover .group-hover\:scale-125,.hover\:scale-125:hover{--tw-scale-x:1.25!important;--tw-scale-y:1.25!important}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.container{width:100%}@media (min-width:1720px){.container{max-width:1720px}}.container{margin-left:auto;margin-right:auto}.popup{background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));border-radius:var(--radius);--tw-bg-opacity:0.85;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;--tw-backdrop-blur:blur(16px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.hidden{display:none!important}.pull-right{float:right}.pull-left{float:left}.clearfix:after{clear:both;content:"";display:block}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.object-none{-o-object-fit:none;object-fit:none}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.object-bottom{-o-object-position:bottom;object-position:bottom}.object-center{-o-object-position:center;object-position:center}.object-left{-o-object-position:left;object-position:left}.object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.object-left-top{-o-object-position:left top;object-position:left top}.object-right{-o-object-position:right;object-position:right}.object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.object-right-top{-o-object-position:right top;object-position:right top}.object-top{-o-object-position:top;object-position:top}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-clip{overflow:clip}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-clip{overflow-x:clip}.overflow-y-clip{overflow-y:clip}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.overflow-overlay{overflow:overlay}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{bottom:0;left:0;right:0;top:0}.inset-auto{bottom:auto;left:auto;right:auto;top:auto}.inset-x-0{left:0;right:0}.inset-y-0{bottom:0;top:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-full{top:100%}.right-full{right:100%}.bottom-full{bottom:100%}.left-full{left:100%}.top-auto{top:auto}.right-auto{right:auto}.bottom-auto{bottom:auto}.left-auto{left:auto}.top-px{top:1px}.right-px{right:1px}.bottom-px{bottom:1px}.left-px{left:1px}.top-0\.5{top:.125rem}.right-0\.5{right:.125rem}.bottom-0\.5{bottom:.125rem}.left-0\.5{left:.125rem}.top-1{top:.25rem}.right-1{right:.25rem}.bottom-1{bottom:.25rem}.left-1{left:.25rem}.top-1\.5{top:.375rem}.right-1\.5{right:.375rem}.bottom-1\.5{bottom:.375rem}.left-1\.5{left:.375rem}.top-2{top:.5rem}.right-2{right:.5rem}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.top-2\.5{top:.625rem}.right-2\.5{right:.625rem}.bottom-2\.5{bottom:.625rem}.left-2\.5{left:.625rem}.top-3{top:.75rem}.right-3{right:.75rem}.bottom-3{bottom:.75rem}.left-3{left:.75rem}.top-3\.5{top:.875rem}.right-3\.5{right:.875rem}.bottom-3\.5{bottom:.875rem}.left-3\.5{left:.875rem}.top-4{top:1rem}.right-4{right:1rem}.bottom-4{bottom:1rem}.left-4{left:1rem}.top-5{top:1.25rem}.right-5{right:1.25rem}.bottom-5{bottom:1.25rem}.left-5{left:1.25rem}.top-6{top:1.5rem}.right-6{right:1.5rem}.bottom-6{bottom:1.5rem}.left-6{left:1.5rem}.top-7{top:1.75rem}.right-7{right:1.75rem}.bottom-7{bottom:1.75rem}.left-7{left:1.75rem}.top-8{top:2rem}.right-8{right:2rem}.bottom-8{bottom:2rem}.left-8{left:2rem}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-0{z-index:0}.z-1{z-index:1}.z-5{z-index:5}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.z-base{z-index:1100}.z-above{z-index:50}.z-below{z-index:-50}.z-dropdown{z-index:1200}.z-sticky{z-index:1300}.z-fixed{z-index:1400}.z-modal{z-index:1500}.z-overlay{z-index:1600}.z-popover{z-index:1700}.z-tooltip{z-index:1800}.z-messager{z-index:1900}.m-0{margin:0}.m-auto{margin:auto}.m-px{margin:1px}.m-0\.5{margin:.125rem}.m-1{margin:.25rem}.m-1\.5{margin:.375rem}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.m-3{margin:.75rem}.m-3\.5{margin:.875rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-7{margin:1.75rem}.m-8{margin:2rem}.m-9{margin:2.25rem}.m-10{margin:2.5rem}.mx-0{margin-left:0;margin-right:0}.my-0{margin-bottom:0}.mt-0,.my-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mx-auto{margin-left:auto;margin-right:auto}.my-auto{margin-bottom:auto}.mt-auto,.my-auto{margin-top:auto}.mr-auto{margin-right:auto}.mb-auto{margin-bottom:auto}.ml-auto{margin-left:auto}.mx-px{margin-left:1px;margin-right:1px}.my-px{margin-bottom:1px}.mt-px,.my-px{margin-top:1px}.mr-px{margin-right:1px}.mb-px{margin-bottom:1px}.ml-px{margin-left:1px}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.my-0\.5{margin-bottom:.125rem}.mt-0\.5,.my-0\.5{margin-top:.125rem}.mr-0\.5{margin-right:.125rem}.mb-0\.5{margin-bottom:.125rem}.ml-0\.5{margin-left:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-1{margin-bottom:.25rem}.mt-1,.my-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.my-1\.5{margin-bottom:.375rem}.mt-1\.5,.my-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mb-1\.5{margin-bottom:.375rem}.ml-1\.5{margin-left:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-2{margin-bottom:.5rem}.mt-2,.my-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.my-2\.5{margin-bottom:.625rem}.mt-2\.5,.my-2\.5{margin-top:.625rem}.mr-2\.5{margin-right:.625rem}.mb-2\.5{margin-bottom:.625rem}.ml-2\.5{margin-left:.625rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-3{margin-bottom:.75rem}.mt-3,.my-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.my-3\.5{margin-bottom:.875rem}.mt-3\.5,.my-3\.5{margin-top:.875rem}.mr-3\.5{margin-right:.875rem}.mb-3\.5{margin-bottom:.875rem}.ml-3\.5{margin-left:.875rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-4{margin-bottom:1rem}.mt-4,.my-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.my-5{margin-bottom:1.25rem}.mt-5,.my-5{margin-top:1.25rem}.mr-5{margin-right:1.25rem}.mb-5{margin-bottom:1.25rem}.ml-5{margin-left:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-6{margin-bottom:1.5rem}.mt-6,.my-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mx-7{margin-left:1.75rem;margin-right:1.75rem}.my-7{margin-bottom:1.75rem}.mt-7,.my-7{margin-top:1.75rem}.mr-7{margin-right:1.75rem}.mb-7{margin-bottom:1.75rem}.ml-7{margin-left:1.75rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-8{margin-bottom:2rem}.mt-8,.my-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.ml-8{margin-left:2rem}.mx-9{margin-left:2.25rem;margin-right:2.25rem}.my-9{margin-bottom:2.25rem}.mt-9,.my-9{margin-top:2.25rem}.mr-9{margin-right:2.25rem}.mb-9{margin-bottom:2.25rem}.ml-9{margin-left:2.25rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.my-10{margin-bottom:2.5rem}.mt-10,.my-10{margin-top:2.5rem}.mr-10{margin-right:2.5rem}.mb-10{margin-bottom:2.5rem}.ml-10{margin-left:2.5rem}.p-0{padding:0}.p-px{padding:1px}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.p-9{padding:2.25rem}.p-10{padding:2.5rem}.px-0{padding-left:0;padding-right:0}.py-0{padding-bottom:0}.pt-0,.py-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.px-px{padding-left:1px;padding-right:1px}.py-px{padding-bottom:1px}.pt-px,.py-px{padding-top:1px}.pr-px{padding-right:1px}.pb-px{padding-bottom:1px}.pl-px{padding-left:1px}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.py-0\.5{padding-bottom:.125rem}.pt-0\.5,.py-0\.5{padding-top:.125rem}.pr-0\.5{padding-right:.125rem}.pb-0\.5{padding-bottom:.125rem}.pl-0\.5{padding-left:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-1{padding-bottom:.25rem}.pt-1,.py-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.py-1\.5{padding-bottom:.375rem}.pt-1\.5,.py-1\.5{padding-top:.375rem}.pr-1\.5{padding-right:.375rem}.pb-1\.5{padding-bottom:.375rem}.pl-1\.5{padding-left:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-2{padding-bottom:.5rem}.pt-2,.py-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.py-2\.5{padding-bottom:.625rem}.pt-2\.5,.py-2\.5{padding-top:.625rem}.pr-2\.5{padding-right:.625rem}.pb-2\.5{padding-bottom:.625rem}.pl-2\.5{padding-left:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-3{padding-bottom:.75rem}.pt-3,.py-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.py-3\.5{padding-bottom:.875rem}.pt-3\.5,.py-3\.5{padding-top:.875rem}.pr-3\.5{padding-right:.875rem}.pb-3\.5{padding-bottom:.875rem}.pl-3\.5{padding-left:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.py-4{padding-bottom:1rem}.pt-4,.py-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-5{padding-bottom:1.25rem}.pt-5,.py-5{padding-top:1.25rem}.pr-5{padding-right:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-6{padding-bottom:1.5rem}.pt-6,.py-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-7{padding-bottom:1.75rem}.pt-7,.py-7{padding-top:1.75rem}.pr-7{padding-right:1.75rem}.pb-7{padding-bottom:1.75rem}.pl-7{padding-left:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-8{padding-bottom:2rem}.pt-8,.py-8{padding-top:2rem}.pr-8{padding-right:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.py-9{padding-bottom:2.25rem}.pt-9,.py-9{padding-top:2.25rem}.pr-9{padding-right:2.25rem}.pb-9{padding-bottom:2.25rem}.pl-9{padding-left:2.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-10{padding-bottom:2.5rem}.pt-10,.py-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(0px*(1 - var(--tw-space-x-reverse)));margin-right:calc(0px*var(--tw-space-x-reverse))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.125rem*var(--tw-space-x-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.375rem*var(--tw-space-x-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.625rem*var(--tw-space-x-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.625rem*var(--tw-space-y-reverse));margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.875rem*var(--tw-space-x-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.875rem*var(--tw-space-y-reverse));margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.75rem*var(--tw-space-x-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.75rem*var(--tw-space-y-reverse));margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.25rem*var(--tw-space-x-reverse))}.space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2.25rem*var(--tw-space-y-reverse));margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.5rem*var(--tw-space-x-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2.5rem*var(--tw-space-y-reverse));margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(1px*var(--tw-space-x-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1px*var(--tw-space-y-reverse));margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))}.w-0{width:0}.w-px{width:1px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-32{width:8rem}.w-36{width:9rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-52{width:13rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-72{width:18rem}.w-80{width:20rem}.w-96{width:24rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-1\/6{width:16.666667%}.w-2\/6{width:33.333333%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.w-min{width:-moz-min-content;width:min-content}.w-max{width:-moz-max-content;width:max-content}.w-fit{width:-moz-fit-content;width:fit-content}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-min{min-width:-moz-min-content;min-width:min-content}.min-w-max{min-width:-moz-max-content;min-width:max-content}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.max-w-0{max-width:0}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.h-0{height:0}.h-px{height:1px}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-32{height:8rem}.h-36{height:9rem}.h-40{height:10rem}.h-44{height:11rem}.h-48{height:12rem}.h-52{height:13rem}.h-56{height:14rem}.h-60{height:15rem}.h-64{height:16rem}.h-72{height:18rem}.h-80{height:20rem}.h-96{height:24rem}.h-1\/2{height:50%}.h-1\/3{height:33.333333%}.h-2\/3{height:66.666667%}.h-1\/4{height:25%}.h-2\/4{height:50%}.h-3\/4{height:75%}.h-1\/5{height:20%}.h-2\/5{height:40%}.h-3\/5{height:60%}.h-4\/5{height:80%}.h-1\/6{height:16.666667%}.h-2\/6{height:33.333333%}.h-3\/6{height:50%}.h-4\/6{height:66.666667%}.h-5\/6{height:83.333333%}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.h-min{height:-moz-min-content;height:min-content}.h-max{height:-moz-max-content;height:max-content}.h-fit{height:-moz-fit-content;height:fit-content}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-min{min-height:-moz-min-content;min-height:min-content}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-fit{min-height:-moz-fit-content;min-height:fit-content}.max-h-0{max-height:0}.max-h-px{max-height:1px}.max-h-none{max-height:none}.max-h-full{max-height:100%}.max-h-min{max-height:-moz-min-content;max-height:min-content}.max-h-screen{max-height:100vh}.max-h-max{max-height:-moz-max-content;max-height:max-content}.max-h-fit{max-height:-moz-fit-content;max-height:fit-content}.canvas,.surface,.surface-light,.surface-strong{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}.canvas{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.surface-light{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-light-rgb),var(--tw-ring-opacity))}.surface{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-rgb),var(--tw-ring-opacity))}.surface-strong{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-strong-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-strong-rgb),var(--tw-ring-opacity))}.inverse{background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity));color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.inverse,.white{--tw-bg-opacity:1;--tw-text-opacity:1}.white{background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity));color:rgba(var(--color-fore-in-light-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-white-rgb),var(--tw-ring-opacity))}.black{--tw-bg-opacity:1;background-color:rgba(var(--color-black-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-black-rgb),var(--tw-ring-opacity))}.transparent{background-color:transparent;--tw-ring-color:transparent}.skin{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.skin:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger,.darken,.darker,.darkest,.gray,.gray-100,.gray-200,.gray-300,.gray-400,.gray-50,.gray-500,.gray-600,.gray-700,.gray-800,.gray-900,.gray-950,.important,.lighten,.lighter,.lightest,.primary,.secondary,.special,.success,.warning{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger:hover,.darken:hover,.darker:hover,.darkest:hover,.gray-100:hover,.gray-200:hover,.gray-300:hover,.gray-400:hover,.gray-500:hover,.gray-50:hover,.gray-600:hover,.gray-700:hover,.gray-800:hover,.gray-900:hover,.gray-950:hover,.gray:hover,.important:hover,.lighten:hover,.lighter:hover,.lightest:hover,.primary:hover,.secondary:hover,.special:hover,.success:hover,.warning:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger,.darken,.darker,.darkest,.gray,.gray-100,.gray-200,.gray-300,.gray-400,.gray-50,.gray-500,.gray-600,.gray-700,.gray-800,.gray-900,.gray-950,.important,.lighten,.lighter,.lightest,.primary,.secondary,.special,.success,.warning{--skin-text:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity));--skin-color:rgba(var(--skin-solid-rgb),1);--state-ring-color:var(--skin-color);--state-active-color:rgba(0,0,0,.1);--state-pressed-color:rgba(0,0,0,.1);--state-color:hsla(0,0%,100%,.1);--state-focus-color:rgba(0,0,0,.1)}.primary{--skin-solid-rgb:var(--color-primary-500-rgb)}.secondary{--skin-solid-rgb:var(--color-secondary-500-rgb)}.success{--skin-solid-rgb:var(--color-success-500-rgb)}.warning{--skin-solid-rgb:var(--color-warning-500-rgb)}.danger{--skin-solid-rgb:var(--color-danger-500-rgb)}.important{--skin-solid-rgb:var(--color-important-500-rgb)}.special{--skin-solid-rgb:var(--color-special-500-rgb)}.gray-50{--skin-bg:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity));--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-100{--skin-solid-rgb:var(--color-gray-100-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-200,.lightest{--skin-solid-rgb:var(--color-gray-200-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-300,.lighter{--skin-solid-rgb:var(--color-gray-300-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-400,.lighten{--skin-solid-rgb:var(--color-gray-400-rgb)}.gray,.gray-500{--skin-solid-rgb:var(--color-gray-500-rgb)}.darken,.gray-600{--skin-solid-rgb:var(--color-gray-600-rgb)}.darker,.gray-700{--skin-solid-rgb:var(--color-gray-700-rgb)}.darkest,.gray-800{--skin-solid-rgb:var(--color-gray-800-rgb)}.gray-900{--skin-solid-rgb:var(--color-gray-900-rgb)}.gray-950{--skin-solid-rgb:var(--color-gray-950-rgb)}.danger-pale,.gray-100-pale,.gray-200-pale,.gray-300-pale,.gray-400-pale,.gray-50-pale,.gray-500-pale,.gray-600-pale,.gray-700-pale,.gray-800-pale,.gray-900-pale,.gray-950-pale,.gray-pale,.important-pale,.pale,.primary-pale,.secondary-pale,.special-pale,.success-pale,.warning-pale{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-pale:hover,.gray-100-pale:hover,.gray-200-pale:hover,.gray-300-pale:hover,.gray-400-pale:hover,.gray-50-pale:hover,.gray-500-pale:hover,.gray-600-pale:hover,.gray-700-pale:hover,.gray-800-pale:hover,.gray-900-pale:hover,.gray-950-pale:hover,.gray-pale:hover,.important-pale:hover,.pale:hover,.primary-pale:hover,.secondary-pale:hover,.special-pale:hover,.success-pale:hover,.warning-pale:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-pale,.gray-100-pale,.gray-200-pale,.gray-300-pale,.gray-400-pale,.gray-50-pale,.gray-500-pale,.gray-600-pale,.gray-700-pale,.gray-800-pale,.gray-900-pale,.gray-950-pale,.gray-pale,.important-pale,.pale,.primary-pale,.secondary-pale,.special-pale,.success-pale,.warning-pale{--skin-color:rgba(var(--skin-pale-rgb),.1);--skin-text:rgba(var(--skin-pale-rgb),1);--state-color:rgba(var(--skin-pale-rgb),.1)}.pale{--skin-pale-rgb:var(--color-gray-500-rgb)}.primary-pale{--skin-pale-rgb:var(--color-primary-500-rgb)}.secondary-pale{--skin-pale-rgb:var(--color-secondary-500-rgb)}.success-pale{--skin-pale-rgb:var(--color-success-500-rgb)}.warning-pale{--skin-pale-rgb:var(--color-warning-500-rgb)}.danger-pale{--skin-pale-rgb:var(--color-danger-500-rgb)}.important-pale{--skin-pale-rgb:var(--color-important-500-rgb)}.special-pale{--skin-pale-rgb:var(--color-special-500-rgb)}.gray-50-pale{--skin-pale-rgb:var(--color-gray-50-rgb);--skin-text:var(--color-gray-400)}.gray-100-pale{--skin-pale-rgb:var(--color-gray-100-rgb);--skin-text:var(--color-gray-400)}.gray-200-pale{--skin-pale-rgb:var(--color-gray-200-rgb);--skin-text:var(--color-gray-400)}.gray-300-pale{--skin-pale-rgb:var(--color-gray-300-rgb);--skin-text:var(--color-gray-500)}.gray-400-pale{--skin-pale-rgb:var(--color-gray-400-rgb);--skin-text:var(--color-gray-500)}.gray-500-pale,.gray-pale{--skin-pale-rgb:var(--color-gray-500-rgb)}.gray-600-pale{--skin-pale-rgb:var(--color-gray-600-rgb)}.gray-700-pale{--skin-pale-rgb:var(--color-gray-700-rgb)}.gray-800-pale{--skin-pale-rgb:var(--color-gray-800-rgb)}.gray-900-pale{--skin-pale-rgb:var(--color-gray-900-rgb)}.gray-950-pale{--skin-pale-rgb:var(--color-gray-950-rgb)}.danger-outline,.dark-outline,.gray-300-outline,.gray-400-outline,.gray-600-outline,.gray-outline,.important-outline,.light-outline,.outline,.primary-outline,.secondary-outline,.special-outline,.success-outline,.warning-outline{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-outline:hover,.dark-outline:hover,.gray-300-outline:hover,.gray-400-outline:hover,.gray-600-outline:hover,.gray-outline:hover,.important-outline:hover,.light-outline:hover,.outline:hover,.primary-outline:hover,.secondary-outline:hover,.special-outline:hover,.success-outline:hover,.warning-outline:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-outline,.dark-outline,.gray-300-outline,.gray-400-outline,.gray-600-outline,.gray-outline,.important-outline,.light-outline,.outline,.primary-outline,.secondary-outline,.special-outline,.success-outline,.warning-outline{--skin-text:var(--skin-color,inherit);--skin-bg:transparent;--skin-color:rgba(var(--skin-outline-rgb),1);--state-color:rgba(var(--skin-outline-rgb),.1)}.outline{--skin-outline-rgb:var(--color-fore-rgb)}.primary-outline{--skin-outline-rgb:var(--color-primary-500-rgb)}.secondary-outline{--skin-outline-rgb:var(--color-secondary-500-rgb)}.success-outline{--skin-outline-rgb:var(--color-success-500-rgb)}.warning-outline{--skin-outline-rgb:var(--color-warning-500-rgb)}.danger-outline{--skin-outline-rgb:var(--color-danger-500-rgb)}.important-outline{--skin-outline-rgb:var(--color-important-500-rgb)}.special-outline{--skin-outline-rgb:var(--color-special-500-rgb)}.gray-300-outline{--skin-text:var(--color-gray-500);--skin-outline-rgb:var(--color-gray-300-rgb)}.gray-400-outline{--skin-text:var(--color-gray-500);--skin-outline-rgb:var(--color-gray-400-rgb)}.gray-outline{--skin-outline-rgb:var(--color-gray-500-rgb)}.gray-600-outline{--skin-outline-rgb:var(--color-gray-600-rgb)}.dark-outline{--skin-outline-rgb:var(--color-inverse-rgb)}.light-outline{--skin-outline-rgb:var(--color-canvas-rgb)}.danger-ghost,.ghost,.important-ghost,.primary-ghost,.secondary-ghost,.special-ghost,.success-ghost,.warning-ghost{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-ghost:hover,.ghost:hover,.important-ghost:hover,.primary-ghost:hover,.secondary-ghost:hover,.special-ghost:hover,.success-ghost:hover,.warning-ghost:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-ghost,.ghost,.important-ghost,.primary-ghost,.secondary-ghost,.special-ghost,.success-ghost,.warning-ghost{--tw-ring-opacity:0;--tw-bg-opacity:0;--skin-text:var(--skin-color,inherit);--skin-bg:transparent;--skin-ring:transparent;--skin-color:rgba(var(--skin-ghost-rgb),1);--state-color:rgba(var(--skin-ghost-rgb),.1)}.ghost{--skin-ghost-rgb:var(--color-fore-rgb);--skin-text:inherit}.primary-ghost{--skin-ghost-rgb:var(--color-primary-500-rgb)}.secondary-ghost{--skin-ghost-rgb:var(--color-secondary-500-rgb)}.success-ghost{--skin-ghost-rgb:var(--color-success-500-rgb)}.warning-ghost{--skin-ghost-rgb:var(--color-warning-500-rgb)}.danger-ghost{--skin-ghost-rgb:var(--color-danger-500-rgb)}.important-ghost{--skin-ghost-rgb:var(--color-important-500-rgb)}.special-ghost{--skin-ghost-rgb:var(--color-special-500-rgb)}.font-sans{font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif}.font-serif{font-family:Nimbus Roman No9 L,Songti SC,Noto Serif CJK SC,Source Han Serif SC,Source Han Serif CN,STSong,AR PL New Sung,AR PL SungtiL GB,NSimSun,SimSun,TW-Sung,WenQuanYi Bitmap Song,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,PMingLiU,MingLiU,serif}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-root{font-size:16px}.text-sm{font-size:.75rem;line-height:1rem}.text-base{font-size:.8125rem;line-height:1.25rem}.text-md{font-size:.875rem;line-height:1.3rem}.text-lg{font-size:1rem;line-height:1.5rem}.text-xl{font-size:1.125rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.font-thin{font-weight:100}.font-light{font-weight:300}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-black{font-weight:900}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{-webkit-line-clamp:3}.line-clamp-3,.line-clamp-4{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-4{-webkit-line-clamp:4}.line-clamp-5{-webkit-line-clamp:5}.line-clamp-5,.line-clamp-6{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-6{-webkit-line-clamp:6}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.align-bottom{vertical-align:bottom}.align-sub{vertical-align:sub}.align-super{vertical-align:super}.text-primary{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.text-secondary{--tw-text-opacity:1;color:rgba(var(--color-secondary-500-rgb),var(--tw-text-opacity))}.text-success{--tw-text-opacity:1;color:rgba(var(--color-success-500-rgb),var(--tw-text-opacity))}.text-warning{--tw-text-opacity:1;color:rgba(var(--color-warning-500-rgb),var(--tw-text-opacity))}.text-danger{--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.text-important{--tw-text-opacity:1;color:rgba(var(--color-important-500-rgb),var(--tw-text-opacity))}.text-special{--tw-text-opacity:1;color:rgba(var(--color-special-500-rgb),var(--tw-text-opacity))}.text-primary-50{--tw-text-opacity:1;color:rgba(var(--color-primary-50-rgb),var(--tw-text-opacity))}.text-primary-100{--tw-text-opacity:1;color:rgba(var(--color-primary-100-rgb),var(--tw-text-opacity))}.text-primary-200{--tw-text-opacity:1;color:rgba(var(--color-primary-200-rgb),var(--tw-text-opacity))}.text-primary-300{--tw-text-opacity:1;color:rgba(var(--color-primary-300-rgb),var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(var(--color-primary-400-rgb),var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.text-primary-600{--tw-text-opacity:1;color:rgba(var(--color-primary-600-rgb),var(--tw-text-opacity))}.text-primary-700{--tw-text-opacity:1;color:rgba(var(--color-primary-700-rgb),var(--tw-text-opacity))}.text-primary-800{--tw-text-opacity:1;color:rgba(var(--color-primary-800-rgb),var(--tw-text-opacity))}.text-primary-900{--tw-text-opacity:1;color:rgba(var(--color-primary-900-rgb),var(--tw-text-opacity))}.text-primary-950{--tw-text-opacity:1;color:rgba(var(--color-primary-950-rgb),var(--tw-text-opacity))}.text-secondary-50{--tw-text-opacity:1;color:rgba(var(--color-secondary-50-rgb),var(--tw-text-opacity))}.text-secondary-100{--tw-text-opacity:1;color:rgba(var(--color-secondary-100-rgb),var(--tw-text-opacity))}.text-secondary-200{--tw-text-opacity:1;color:rgba(var(--color-secondary-200-rgb),var(--tw-text-opacity))}.text-secondary-300{--tw-text-opacity:1;color:rgba(var(--color-secondary-300-rgb),var(--tw-text-opacity))}.text-secondary-400{--tw-text-opacity:1;color:rgba(var(--color-secondary-400-rgb),var(--tw-text-opacity))}.text-secondary-500{--tw-text-opacity:1;color:rgba(var(--color-secondary-500-rgb),var(--tw-text-opacity))}.text-secondary-600{--tw-text-opacity:1;color:rgba(var(--color-secondary-600-rgb),var(--tw-text-opacity))}.text-secondary-700{--tw-text-opacity:1;color:rgba(var(--color-secondary-700-rgb),var(--tw-text-opacity))}.text-secondary-800{--tw-text-opacity:1;color:rgba(var(--color-secondary-800-rgb),var(--tw-text-opacity))}.text-secondary-900{--tw-text-opacity:1;color:rgba(var(--color-secondary-900-rgb),var(--tw-text-opacity))}.text-secondary-950{--tw-text-opacity:1;color:rgba(var(--color-secondary-950-rgb),var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgba(var(--color-gray-50-rgb),var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(var(--color-gray-100-rgb),var(--tw-text-opacity))}.text-gray-200,.text-lightest{--tw-text-opacity:1;color:rgba(var(--color-gray-200-rgb),var(--tw-text-opacity))}.text-gray-300,.text-lighter{--tw-text-opacity:1;color:rgba(var(--color-gray-300-rgb),var(--tw-text-opacity))}.text-gray-400,.text-lighten{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.text-gray,.text-gray-500{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.text-darken,.text-gray-600{--tw-text-opacity:1;color:rgba(var(--color-gray-600-rgb),var(--tw-text-opacity))}.text-darker,.text-gray-700{--tw-text-opacity:1;color:rgba(var(--color-gray-700-rgb),var(--tw-text-opacity))}.text-darkest,.text-gray-800{--tw-text-opacity:1;color:rgba(var(--color-gray-800-rgb),var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(var(--color-gray-900-rgb),var(--tw-text-opacity))}.text-gray-950{--tw-text-opacity:1;color:rgba(var(--color-gray-950-rgb),var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgba(var(--color-black-rgb),var(--tw-text-opacity))}.text-transparent{color:transparent}.text-canvas{--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.text-surface-light{--tw-text-opacity:1;color:rgba(var(--color-surface-light-rgb),var(--tw-text-opacity))}.text-surface{--tw-text-opacity:1;color:rgba(var(--color-surface-rgb),var(--tw-text-opacity))}.text-surface-strong{--tw-text-opacity:1;color:rgba(var(--color-surface-strong-rgb),var(--tw-text-opacity))}.text-inverse{--tw-text-opacity:1;color:rgba(var(--color-inverse-rgb),var(--tw-text-opacity))}.text-fore-in-light{--tw-text-opacity:1;color:rgba(var(--color-fore-in-light-rgb),var(--tw-text-opacity))}.text-fore-in-dark{--tw-text-opacity:1;color:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity))}.text-fore{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}.text-focus{--tw-text-opacity:1;color:rgba(var(--color-focus-rgb),var(--tw-text-opacity))}.text-link{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}.text-link-hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}.text-current{color:currentColor}.text-inherit{color:inherit}.clip,.ellipsis,.text-clip,.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.clip,.text-clip{text-overflow:clip}.whitespace-normal{white-space:normal}.nowrap,.whitespace-nowrap{white-space:nowrap}.pre,.whitespace-pre{white-space:pre}.pre-line,.whitespace-pre-line{white-space:pre-line}.pre-wrap,.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-opacity-0{--tw-text-opacity:0}.text-opacity-5{--tw-text-opacity:.05}.text-opacity-10{--tw-text-opacity:.1}.text-opacity-20{--tw-text-opacity:.2}.text-opacity-25{--tw-text-opacity:.25}.text-opacity-30{--tw-text-opacity:.3}.text-opacity-40{--tw-text-opacity:.4}.text-opacity-50{--tw-text-opacity:.5}.text-opacity-60{--tw-text-opacity:.6}.text-opacity-70{--tw-text-opacity:.7}.text-opacity-80{--tw-text-opacity:.8}.text-opacity-90{--tw-text-opacity:.9}.text-opacity-95{--tw-text-opacity:.95}.text-opacity-100{--tw-text-opacity:1}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.list-unstyled{list-style-type:none;padding-left:0}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.bg-primary{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity))}.bg-secondary{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-500-rgb),var(--tw-bg-opacity))}.bg-success{--tw-bg-opacity:1;background-color:rgba(var(--color-success-500-rgb),var(--tw-bg-opacity))}.bg-warning{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-500-rgb),var(--tw-bg-opacity))}.bg-danger{--tw-bg-opacity:1;background-color:rgba(var(--color-danger-500-rgb),var(--tw-bg-opacity))}.bg-important{--tw-bg-opacity:1;background-color:rgba(var(--color-important-500-rgb),var(--tw-bg-opacity))}.bg-special{--tw-bg-opacity:1;background-color:rgba(var(--color-special-500-rgb),var(--tw-bg-opacity))}.bg-primary-50{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity))}.bg-primary-200{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-200-rgb),var(--tw-bg-opacity))}.bg-primary-300{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-300-rgb),var(--tw-bg-opacity))}.bg-primary-400{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-400-rgb),var(--tw-bg-opacity))}.bg-primary-500{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-600-rgb),var(--tw-bg-opacity))}.bg-primary-700{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-700-rgb),var(--tw-bg-opacity))}.bg-primary-800{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-800-rgb),var(--tw-bg-opacity))}.bg-primary-900{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-900-rgb),var(--tw-bg-opacity))}.bg-primary-950{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-950-rgb),var(--tw-bg-opacity))}.bg-secondary-50{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-50-rgb),var(--tw-bg-opacity))}.bg-secondary-100{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-100-rgb),var(--tw-bg-opacity))}.bg-secondary-200{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-200-rgb),var(--tw-bg-opacity))}.bg-secondary-300{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-300-rgb),var(--tw-bg-opacity))}.bg-secondary-400{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-400-rgb),var(--tw-bg-opacity))}.bg-secondary-500{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-500-rgb),var(--tw-bg-opacity))}.bg-secondary-600{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-600-rgb),var(--tw-bg-opacity))}.bg-secondary-700{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-700-rgb),var(--tw-bg-opacity))}.bg-secondary-800{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-800-rgb),var(--tw-bg-opacity))}.bg-secondary-900{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-900-rgb),var(--tw-bg-opacity))}.bg-secondary-950{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-950-rgb),var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.bg-gray-200,.bg-lightest{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-200-rgb),var(--tw-bg-opacity))}.bg-gray-300,.bg-lighter{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-300-rgb),var(--tw-bg-opacity))}.bg-gray-400,.bg-light{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-400-rgb),var(--tw-bg-opacity))}.bg-gray,.bg-gray-500{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-500-rgb),var(--tw-bg-opacity))}.bg-darken,.bg-gray-600{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-600-rgb),var(--tw-bg-opacity))}.bg-darker,.bg-gray-700{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-700-rgb),var(--tw-bg-opacity))}.bg-darkest,.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-800-rgb),var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-900-rgb),var(--tw-bg-opacity))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-950-rgb),var(--tw-bg-opacity))}.bg-canvas{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.bg-surface-light{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity))}.bg-surface{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.bg-surface-strong{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-strong-rgb),var(--tw-bg-opacity))}.bg-inverse{--tw-bg-opacity:1;background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity))}.bg-fore-in-light{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-in-light-rgb),var(--tw-bg-opacity))}.bg-fore-in-dark{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-in-dark-rgb),var(--tw-bg-opacity))}.bg-fore{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-rgb),var(--tw-bg-opacity))}.bg-focus{--tw-bg-opacity:1;background-color:rgba(var(--color-focus-rgb),var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgba(var(--color-black-rgb),var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-current{background-color:currentColor}.bg-inherit{background-color:inherit}.bg-none{background-image:none}.bg-opacity-0{--tw-bg-opacity:0}.bg-opacity-5{--tw-bg-opacity:.05}.bg-opacity-10{--tw-bg-opacity:.1}.bg-opacity-20{--tw-bg-opacity:.2}.bg-opacity-25{--tw-bg-opacity:.25}.bg-opacity-30{--tw-bg-opacity:.3}.bg-opacity-40{--tw-bg-opacity:.4}.bg-opacity-50{--tw-bg-opacity:.5}.bg-opacity-60{--tw-bg-opacity:.6}.bg-opacity-70{--tw-bg-opacity:.7}.bg-opacity-80{--tw-bg-opacity:.8}.bg-opacity-90{--tw-bg-opacity:.9}.bg-opacity-100{--tw-bg-opacity:1}.bg-auto{background-size:auto}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.bg-repeat{background-repeat:repeat}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat-x{background-repeat:repeat-x}.bg-repeat-y{background-repeat:repeat-y}.bg-repeat-round{background-repeat:round}.bg-repeat-space{background-repeat:space}.bg-bottom{background-position:bottom}.bg-center{background-position:50%}.bg-left{background-position:0}.bg-left-bottom{background-position:0 100%}.bg-left-top{background-position:0 0}.bg-right{background-position:100%}.bg-right-bottom{background-position:100% 100%}.bg-right-top{background-position:100% 0}.bg-top{background-position:top}.bg-fixed{background-attachment:fixed}.bg-local{background-attachment:local}.bg-scroll{background-attachment:scroll}.divider{align-self:stretch;border-color:currentColor;border-left-width:1px;border-top-width:1px;opacity:.1}.border-0{border-width:0}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-t{border-top-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.border-t-0{border-top-width:0}.border-r-0{border-right-width:0}.border-b-0{border-bottom-width:0}.border-l-0{border-left-width:0}.border-t-2{border-top-width:2px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-b-2{border-bottom-width:2px}.border-t-4{border-top-width:4px}.border-l-4{border-left-width:4px}.border-r-4{border-right-width:4px}.border-b-4{border-bottom-width:4px}.border-light{--tw-border-opacity:1;border-color:rgba(var(--color-border-light-rgb),var(--tw-border-opacity))}.border-strong{--tw-border-opacity:1;border-color:rgba(var(--color-border-strong-rgb),var(--tw-border-opacity))}.border-primary{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity))}.border-secondary{--tw-border-opacity:1;border-color:rgba(var(--color-secondary-500-rgb),var(--tw-border-opacity))}.border-success{--tw-border-opacity:1;border-color:rgba(var(--color-success-500-rgb),var(--tw-border-opacity))}.border-warning{--tw-border-opacity:1;border-color:rgba(var(--color-warning-500-rgb),var(--tw-border-opacity))}.border-danger{--tw-border-opacity:1;border-color:rgba(var(--color-danger-500-rgb),var(--tw-border-opacity))}.border-important{--tw-border-opacity:1;border-color:rgba(var(--color-important-500-rgb),var(--tw-border-opacity))}.border-special{--tw-border-opacity:1;border-color:rgba(var(--color-special-500-rgb),var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgba(var(--color-gray-50-rgb),var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgba(var(--color-gray-100-rgb),var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(var(--color-gray-200-rgb),var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(var(--color-gray-300-rgb),var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.border-gray,.border-gray-500{--tw-border-opacity:1;border-color:rgba(var(--color-gray-500-rgb),var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(var(--color-gray-600-rgb),var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgba(var(--color-gray-700-rgb),var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgba(var(--color-gray-800-rgb),var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgba(var(--color-gray-900-rgb),var(--tw-border-opacity))}.border-gray-950{--tw-border-opacity:1;border-color:rgba(var(--color-gray-950-rgb),var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgba(var(--color-white-rgb),var(--tw-border-opacity))}.border-black{--tw-border-opacity:1;border-color:rgba(var(--color-black-rgb),var(--tw-border-opacity))}.border-canvas{--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity))}.border-surface-light{--tw-border-opacity:1;border-color:rgba(var(--color-surface-light-rgb),var(--tw-border-opacity))}.border-surface{--tw-border-opacity:1;border-color:rgba(var(--color-surface-rgb),var(--tw-border-opacity))}.border-surface-strong{--tw-border-opacity:1;border-color:rgba(var(--color-surface-strong-rgb),var(--tw-border-opacity))}.border-inverse{--tw-border-opacity:1;border-color:rgba(var(--color-inverse-rgb),var(--tw-border-opacity))}.border-fore-in-light{--tw-border-opacity:1;border-color:rgba(var(--color-fore-in-light-rgb),var(--tw-border-opacity))}.border-fore-in-dark{--tw-border-opacity:1;border-color:rgba(var(--color-fore-in-dark-rgb),var(--tw-border-opacity))}.border-fore{--tw-border-opacity:1;border-color:rgba(var(--color-fore-rgb),var(--tw-border-opacity))}.border-focus{--tw-border-opacity:1;border-color:rgba(var(--color-focus-rgb),var(--tw-border-opacity))}.border-link{--tw-border-opacity:1;border-color:rgba(var(--color-link-rgb),var(--tw-border-opacity))}.border-link-hover{--tw-border-opacity:1;border-color:rgba(var(--color-link-hover-rgb),var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-current{border-color:currentColor}.border-inherit{border-color:inherit}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-double{border-style:double}.border-hidden{border-style:hidden}.border-none{border-style:none}.border-opacity-0{--tw-border-opacity:0}.border-opacity-5{--tw-border-opacity:.05}.border-opacity-10{--tw-border-opacity:.1}.border-opacity-20{--tw-border-opacity:.2}.border-opacity-25{--tw-border-opacity:.25}.border-opacity-30{--tw-border-opacity:.3}.border-opacity-40{--tw-border-opacity:.4}.border-opacity-50{--tw-border-opacity:.5}.border-opacity-60{--tw-border-opacity:.6}.border-opacity-70{--tw-border-opacity:.7}.border-opacity-80{--tw-border-opacity:.8}.border-opacity-90{--tw-border-opacity:.9}.border-opacity-95{--tw-border-opacity:.95}.border-opacity-100{--tw-border-opacity:1}.rounded-none{border-radius:var(--radius-none)}.rounded-sm{border-radius:var(--radius-sm)}.rounded{border-radius:var(--radius)}.rounded-md{border-radius:var(--radius-md)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.circle,.rounded-full{border-radius:var(--radius-full)}.rounded-l-none{border-bottom-left-radius:var(--radius-none);border-top-left-radius:var(--radius-none)}.rounded-t-none{border-top-left-radius:var(--radius-none)}.rounded-r-none,.rounded-t-none{border-top-right-radius:var(--radius-none)}.rounded-b-none,.rounded-r-none{border-bottom-right-radius:var(--radius-none)}.rounded-b-none{border-bottom-left-radius:var(--radius-none)}.rounded-br-none{border-bottom-right-radius:var(--radius-none)}.rounded-bl-none{border-bottom-left-radius:var(--radius-none)}.rounded-tr-none{border-top-right-radius:var(--radius-none)}.rounded-tl-none{border-top-left-radius:var(--radius-none)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.ring-border-light{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-light-rgb),var(--tw-ring-opacity))}.ring-border{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.ring-border-strong{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.ring-light{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05}.ring-gray{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.1}.ring-dark{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.2}.ring-darker{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.3}.ring-darkest{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.5}.ring-primary{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-500-rgb),var(--tw-ring-opacity))}.ring-secondary{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-secondary-500-rgb),var(--tw-ring-opacity))}.ring-warning{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-warning-500-rgb),var(--tw-ring-opacity))}.ring-success{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-success-500-rgb),var(--tw-ring-opacity))}.ring-danger{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-danger-500-rgb),var(--tw-ring-opacity))}.ring-important{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-important-500-rgb),var(--tw-ring-opacity))}.ring-special{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-special-500-rgb),var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-50-rgb),var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-100-rgb),var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-200-rgb),var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-300-rgb),var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-400-rgb),var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-500-rgb),var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-600-rgb),var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-700-rgb),var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-800-rgb),var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-900-rgb),var(--tw-ring-opacity))}.ring-gray-950{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-950-rgb),var(--tw-ring-opacity))}.ring-inverse{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity))}.ring-canvas{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-canvas-rgb),var(--tw-ring-opacity))}.ring-surface{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-rgb),var(--tw-ring-opacity))}.ring-fore{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-fore-rgb),var(--tw-ring-opacity))}.ring-transparent{--tw-ring-color:transparent}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-black-rgb),var(--tw-ring-opacity))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-white-rgb),var(--tw-ring-opacity))}.ring-inherit{--tw-ring-color:inherit}.ring-current{--tw-ring-color:currentColor}.ring-opacity-0{--tw-ring-opacity:0}.ring-opacity-5{--tw-ring-opacity:.05}.ring-opacity-10{--tw-ring-opacity:.1}.ring-opacity-20{--tw-ring-opacity:.2}.ring-opacity-30{--tw-ring-opacity:.3}.ring-opacity-40{--tw-ring-opacity:.4}.ring-opacity-50{--tw-ring-opacity:.5}.ring-opacity-60{--tw-ring-opacity:.6}.ring-opacity-70{--tw-ring-opacity:.7}.ring-opacity-80{--tw-ring-opacity:.8}.ring-opacity-90{--tw-ring-opacity:.9}.ring-opacity-100{--tw-ring-opacity:1}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-3{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-3,.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-offset-0{--tw-ring-offset-width:0px}.ring-offset-1{--tw-ring-offset-width:1px}.ring-offset-2{--tw-ring-offset-width:2px}.ring-offset-4{--tw-ring-offset-width:4px}.ring-offset-8{--tw-ring-offset-width:8px}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--tw-shadow-colored:0 2px 6px -1px var(--tw-shadow-color),0 1px 4px -2px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--tw-shadow-colored:0 5px 15px -3px var(--tw-shadow-color),0 2px 6px -4px var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color)}.shadow-2xl,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--tw-shadow-colored:0 10px 50px -10px var(--tw-shadow-color),0 8px 20px -10px var(--tw-shadow-color)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.muted{opacity:var(--opacity-muted)}.opacity-0{opacity:0}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.blur-none{--tw-blur:blur(0)}.blur-none,.blur-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-sm{--tw-blur:blur(4px)}.blur{--tw-blur:blur(8px)}.blur,.blur-md{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-md{--tw-blur:blur(12px)}.blur-lg{--tw-blur:blur(16px)}.blur-lg,.blur-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-xl{--tw-blur:blur(24px)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.filter-none{filter:none!important}.drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.drop-shadow-none,.drop-shadow-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}.drop-shadow,.drop-shadow-md{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,.07)) drop-shadow(0 2px 2px rgba(0,0,0,.06))}.drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,.04)) drop-shadow(0 4px 3px rgba(0,0,0,.1))}.drop-shadow-lg,.drop-shadow-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,.03)) drop-shadow(0 8px 5px rgba(0,0,0,.08))}.drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,.15));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-none{--tw-backdrop-blur:blur(0)}.backdrop-blur-none,.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-blur-md{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.backdrop-blur-lg,.backdrop-blur-xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.backdrop-blur-2xl,.backdrop-blur-3xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-none{transition-property:none}.fade,.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{opacity:0;transition-duration:.15s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{--tw-scale-x:.9;--tw-scale-y:.9}.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-bottom{--tw-translate-y:25%}.fade-from-top{--tw-translate-y:-25%}.fade-from-left,.fade-from-top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-left{--tw-translate-x:-25%}.fade-from-right{--tw-translate-x:25%}.fade-from-bottom.in,.fade-from-center.in,.fade-from-left.in,.fade-from-right,.fade-from-right.in,.fade-from-top.in,.fade.in{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-bottom.in,.fade-from-center.in,.fade-from-left.in,.fade-from-right.in,.fade-from-top.in,.fade.in{--tw-translate-x:0px;--tw-translate-y:0px;--tw-scale-x:1;--tw-scale-y:1;opacity:1}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-1000{transition-duration:1s}@keyframes -spin{to{transform:rotate(1turn)}}.animate-spin,.spin{animation:-spin 1s linear infinite}@keyframes -ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping,.ping{animation:-ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes -pulse{50%{opacity:.5}}.animate-pulse,.pulse{animation:-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes -bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.animate-bounce,.bounce{animation:-bounce 1s infinite}.animate-highlight,.highlight{animation:-highlight 2s ease-in-out infinite;outline-color:#fde047;outline-offset:-1px;outline-style:solid;outline-width:1px}@keyframes -highlight{50%{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity));outline-offset:-4px;outline-width:4px}}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.scale-0,.scale-50{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-75,.scale-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-100,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.scale-105,.scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.scale-125,.scale-150{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.flip-x{--tw-scale-x:-1}.flip-x,.flip-y{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.flip-y{--tw-scale-y:-1}.rotate-0{--tw-rotate:0deg}.rotate-0,.rotate-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-1{--tw-rotate:1deg}.rotate-2{--tw-rotate:2deg}.rotate-2,.rotate-3{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-3{--tw-rotate:3deg}.rotate-6{--tw-rotate:6deg}.rotate-12,.rotate-6{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-12{--tw-rotate:12deg}.rotate-45{--tw-rotate:45deg}.rotate-45,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg}.rotate-135{--tw-rotate:135deg}.rotate-135,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-270{--tw-rotate:270deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.basis-0{flex-basis:0px}.basis-1{flex-basis:0.25rem}.basis-2{flex-basis:0.5rem}.basis-3{flex-basis:0.75rem}.basis-4{flex-basis:1rem}.basis-5{flex-basis:1.25rem}.basis-6{flex-basis:1.5rem}.basis-7{flex-basis:1.75rem}.basis-8{flex-basis:2rem}.basis-9{flex-basis:2.25rem}.basis-10{flex-basis:2.5rem}.basis-11{flex-basis:2.75rem}.basis-12{flex-basis:3rem}.basis-14{flex-basis:3.5rem}.basis-16{flex-basis:4rem}.basis-20{flex-basis:5rem}.basis-24{flex-basis:6rem}.basis-28{flex-basis:7rem}.basis-32{flex-basis:8rem}.basis-36{flex-basis:9rem}.basis-40{flex-basis:10rem}.basis-44{flex-basis:11rem}.basis-48{flex-basis:12rem}.basis-52{flex-basis:13rem}.basis-56{flex-basis:14rem}.basis-60{flex-basis:15rem}.basis-64{flex-basis:16rem}.basis-72{flex-basis:18rem}.basis-80{flex-basis:20rem}.basis-96{flex-basis:24rem}.basis-auto{flex-basis:auto}.basis-px{flex-basis:1px}.basis-0\.5{flex-basis:0.125rem}.basis-1\.5{flex-basis:0.375rem}.basis-2\.5{flex-basis:0.625rem}.basis-3\.5{flex-basis:0.875rem}.basis-1\/2{flex-basis:50%}.basis-1\/3{flex-basis:33.333333%}.basis-2\/3{flex-basis:66.666667%}.basis-1\/4{flex-basis:25%}.basis-2\/4{flex-basis:50%}.basis-3\/4{flex-basis:75%}.basis-1\/5{flex-basis:20%}.basis-2\/5{flex-basis:40%}.basis-3\/5{flex-basis:60%}.basis-4\/5{flex-basis:80%}.basis-1\/6{flex-basis:16.666667%}.basis-2\/6{flex-basis:33.333333%}.basis-3\/6{flex-basis:50%}.basis-4\/6{flex-basis:66.666667%}.basis-5\/6{flex-basis:83.333333%}.basis-1\/12{flex-basis:8.333333%}.basis-2\/12{flex-basis:16.666667%}.basis-3\/12{flex-basis:25%}.basis-4\/12{flex-basis:33.333333%}.basis-5\/12{flex-basis:41.666667%}.basis-6\/12{flex-basis:50%}.basis-7\/12{flex-basis:58.333333%}.basis-8\/12{flex-basis:66.666667%}.basis-9\/12{flex-basis:75%}.basis-10\/12{flex-basis:83.333333%}.basis-11\/12{flex-basis:91.666667%}.basis-full{flex-basis:100%}.row{display:flex;flex-direction:row}.center,.col{display:flex;flex-direction:column}.center,.center-row{align-items:center;justify-content:center}.center-row{display:flex;flex-direction:row}.center-x,.center-y{align-items:center;display:flex}.center-y{flex-direction:column}.row-reverse{display:flex;flex-direction:row-reverse}.col-reverse{display:flex;flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.grow{flex-grow:1!important}.grow-0{flex-grow:0!important}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.gap-0{gap:0}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-y-0{row-gap:0}.gap-px{gap:1px}.gap-x-px{-moz-column-gap:1px;column-gap:1px}.gap-y-px{row-gap:1px}.gap-0\.5{gap:.125rem}.gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.gap-y-0\.5{row-gap:.125rem}.gap-3px{gap:3px}.gap-1{gap:.25rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-y-1{row-gap:.25rem}.gap-1\.5{gap:.375rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-y-1\.5{row-gap:.375rem}.gap-2{gap:.5rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-2{row-gap:.5rem}.gap-2\.5{gap:.625rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-y-2\.5{row-gap:.625rem}.gap-3{gap:.75rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-3{row-gap:.75rem}.gap-3\.5{gap:.875rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-y-3\.5{row-gap:.875rem}.gap-4{gap:1rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-4{row-gap:1rem}.gap-5{gap:1.25rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-5{row-gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-6{row-gap:1.5rem}.gap-7{gap:1.75rem}.gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.gap-y-7{row-gap:1.75rem}.gap-8{gap:2rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-8{row-gap:2rem}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.self-baseline{align-self:baseline}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}@font-face{font-display:fallback;font-family:D-DIN-PRO;font-weight:400;src:url(./fonts/D-DIN-PRO-400-Regular.otf)}@font-face{font-display:fallback;font-family:D-DIN-PRO;font-weight:500;src:url(./fonts/D-DIN-PRO-700-Bold.otf)}.num{font-family:D-DIN-PRO}@font-face{font-display:fallback;font-family:Nunito;font-weight:400;src:url(./fonts/Nunito-Regular.ttf)}@font-face{font-display:fallback;font-family:Nunito;font-weight:700;src:url(./fonts/Nunito-Bold.ttf)}@font-face{font-display:fallback;font-family:Nunito;font-weight:300;src:url(./fonts/Nunito-Light.ttf)}.font-brand{font-family:Nunito;font-weight:400}@supports not (gap:4px){.gap-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(1px*var(--tw-space-x-reverse))}.gap-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2px*(1 - var(--tw-space-x-reverse)));margin-right:calc(2px*var(--tw-space-x-reverse))}.gap-3px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(3px*(1 - var(--tw-space-x-reverse)));margin-right:calc(3px*var(--tw-space-x-reverse))}.gap-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.gap-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(6px*(1 - var(--tw-space-x-reverse)));margin-right:calc(6px*var(--tw-space-x-reverse))}.gap-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.gap-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(10px*(1 - var(--tw-space-x-reverse)));margin-right:calc(10px*var(--tw-space-x-reverse))}.gap-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.gap-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(14px*(1 - var(--tw-space-x-reverse)));margin-right:calc(14px*var(--tw-space-x-reverse))}.gap-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.gap-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.gap-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.gap-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.75rem*var(--tw-space-x-reverse))}.gap-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.col.gap-px>:not([hidden])~:not([hidden]),.gap-px.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1px*var(--tw-space-y-reverse));margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))}.col.gap-0\.5>:not([hidden])~:not([hidden]),.gap-0\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2px*var(--tw-space-y-reverse));margin-top:calc(2px*(1 - var(--tw-space-y-reverse)))}.col.gap-3px>:not([hidden])~:not([hidden]),.gap-3px.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(3px*var(--tw-space-y-reverse));margin-top:calc(3px*(1 - var(--tw-space-y-reverse)))}.col.gap-1>:not([hidden])~:not([hidden]),.gap-1.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.col.gap-1\.5>:not([hidden])~:not([hidden]),.gap-1\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(6px*var(--tw-space-y-reverse));margin-top:calc(6px*(1 - var(--tw-space-y-reverse)))}.col.gap-2>:not([hidden])~:not([hidden]),.gap-2.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.col.gap-2\.5>:not([hidden])~:not([hidden]),.gap-2\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(10px*var(--tw-space-y-reverse));margin-top:calc(10px*(1 - var(--tw-space-y-reverse)))}.col.gap-3>:not([hidden])~:not([hidden]),.gap-3.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.col.gap-3\.5>:not([hidden])~:not([hidden]),.gap-3\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(14px*var(--tw-space-y-reverse));margin-top:calc(14px*(1 - var(--tw-space-y-reverse)))}.col.gap-4>:not([hidden])~:not([hidden]),.gap-4.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.col.gap-5>:not([hidden])~:not([hidden]),.gap-5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.col.gap-6>:not([hidden])~:not([hidden]),.gap-6.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.col.gap-7>:not([hidden])~:not([hidden]),.gap-7.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.75rem*var(--tw-space-y-reverse));margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)))}.col.gap-8>:not([hidden])~:not([hidden]),.gap-8.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.nav-item>a>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}} \ No newline at end of file +/*! tailwindcss v3.4.4 | MIT License | https://tailwindcss.com*/*,:after,:before{border-color:rgb(var(--color-gray-200-rgb));border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:rgb(var(--color-gray-400-rgb));opacity:1}input::placeholder,textarea::placeholder{color:rgb(var(--color-gray-400-rgb));opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}:root{--screen-2xl:1720px;--color-gray-50:#fcfdfe;--color-gray-100:#eff1f3;--color-gray-200:#ebedf3;--color-gray-300:#d2d6e5;--color-gray-400:#b2b9c5;--color-gray-500:#64758b;--color-gray-600:#4a577f;--color-gray-700:#3d4667;--color-gray-800:#353d57;--color-gray-900:#30394a;--color-gray-950:#0b0f18;--color-gray-50-rgb:252,253,254;--color-gray-100-rgb:239,241,243;--color-gray-200-rgb:235,237,243;--color-gray-300-rgb:210,214,229;--color-gray-400-rgb:178,185,197;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:74,87,127;--color-gray-700-rgb:61,70,103;--color-gray-800-rgb:53,61,87;--color-gray-900-rgb:48,57,74;--color-gray-950-rgb:11,15,24;--color-primary-50:#eef6ff;--color-primary-100:#d9eaff;--color-primary-200:#bcdcff;--color-primary-300:#8ec6ff;--color-primary-400:#59a5ff;--color-primary-500:#3883fa;--color-primary-600:#2b67e5;--color-primary-700:#144ce1;--color-primary-800:#173db6;--color-primary-900:#19388f;--color-primary-950:#142457;--color-primary-50-rgb:238,246,255;--color-primary-100-rgb:217,234,255;--color-primary-200-rgb:188,220,255;--color-primary-300-rgb:142,198,255;--color-primary-400-rgb:89,165,255;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:43,103,229;--color-primary-700-rgb:20,76,225;--color-primary-800-rgb:23,61,182;--color-primary-900-rgb:25,56,143;--color-primary-950-rgb:20,36,87;--color-secondary-50:#e7f6ff;--color-secondary-100:#cdecff;--color-secondary-200:#9bd9ff;--color-secondary-300:#77cbff;--color-secondary-400:#60c2ff;--color-secondary-500:#37b2fe;--color-secondary-600:#18a6fd;--color-secondary-700:#1099ed;--color-secondary-800:#078ada;--color-secondary-900:#046bab;--color-secondary-950:#062a4b;--color-secondary-50-rgb:231,246,255;--color-secondary-100-rgb:205,236,255;--color-secondary-200-rgb:155,217,255;--color-secondary-300-rgb:119,203,255;--color-secondary-400-rgb:96,194,255;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:24,166,253;--color-secondary-700-rgb:16,153,237;--color-secondary-800-rgb:7,138,218;--color-secondary-900-rgb:4,107,171;--color-secondary-950-rgb:6,42,75;--color-success-50:#effaf6;--color-success-100:#d6f2e7;--color-success-200:#ade5ce;--color-success-300:#83d7b6;--color-success-400:#5aca9d;--color-success-500:#31bd85;--color-success-600:#2ba675;--color-success-700:#28996c;--color-success-800:#21805a;--color-success-900:#185e3b;--color-success-950:#0e3421;--color-success-50-rgb:239,250,246;--color-success-100-rgb:214,242,231;--color-success-200-rgb:173,229,206;--color-success-300-rgb:131,215,182;--color-success-400-rgb:90,202,157;--color-success-500-rgb:49,189,133;--color-success-600-rgb:43,166,117;--color-success-700-rgb:40,153,108;--color-success-800-rgb:33,128,90;--color-success-900-rgb:24,94,59;--color-success-950-rgb:14,52,33;--color-warning-50:#fff4ea;--color-warning-100:#ffecdb;--color-warning-200:#ffd2a9;--color-warning-300:#ffbc7e;--color-warning-400:#ffaf65;--color-warning-500:#ff9f46;--color-warning-600:#f38f19;--color-warning-700:#ed8307;--color-warning-800:#d17100;--color-warning-900:#af5f01;--color-warning-950:#441506;--color-warning-50-rgb:255,244,234;--color-warning-100-rgb:255,236,219;--color-warning-200-rgb:255,210,169;--color-warning-300-rgb:255,188,126;--color-warning-400-rgb:255,175,101;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:243,143,25;--color-warning-700-rgb:237,131,7;--color-warning-800-rgb:209,113,0;--color-warning-900-rgb:175,95,1;--color-warning-950-rgb:68,21,6;--color-danger-50:#ffebeb;--color-danger-100:#ffd5d5;--color-danger-200:#ffb1b1;--color-danger-300:#ff9292;--color-danger-400:#ff7c7c;--color-danger-500:#fc5959;--color-danger-600:#fb2b2b;--color-danger-700:#d91b1b;--color-danger-800:#ba1313;--color-danger-900:#a20606;--color-danger-950:#470808;--color-danger-50-rgb:255,235,235;--color-danger-100-rgb:255,213,213;--color-danger-200-rgb:255,177,177;--color-danger-300-rgb:255,146,146;--color-danger-400-rgb:255,124,124;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:251,43,43;--color-danger-700-rgb:217,27,27;--color-danger-800-rgb:186,19,19;--color-danger-900-rgb:162,6,6;--color-danger-950-rgb:71,8,8;--color-important-50:#fff8f5;--color-important-100:#ffe2d9;--color-important-200:#ffcebf;--color-important-300:#ffb29b;--color-important-400:#ff8c68;--color-important-500:#ff8058;--color-important-600:#ff6f42;--color-important-700:#ff4912;--color-important-800:#c83509;--color-important-900:#611700;--color-important-950:#440609;--color-important-50-rgb:255,248,245;--color-important-100-rgb:255,226,217;--color-important-200-rgb:255,206,191;--color-important-300-rgb:255,178,155;--color-important-400-rgb:255,140,104;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,111,66;--color-important-700-rgb:255,73,18;--color-important-800-rgb:200,53,9;--color-important-900-rgb:97,23,0;--color-important-950-rgb:68,6,9;--color-special-50:#efecfa;--color-special-100:#e4dff7;--color-special-200:#c4b6ff;--color-special-300:#a38cff;--color-special-400:#8a6ff5;--color-special-500:#8166ee;--color-special-600:#7055df;--color-special-700:#513baa;--color-special-800:#452da5;--color-special-900:#30216e;--color-special-950:#271560;--color-special-50-rgb:239,236,250;--color-special-100-rgb:228,223,247;--color-special-200-rgb:196,182,255;--color-special-300-rgb:163,140,255;--color-special-400-rgb:138,111,245;--color-special-500-rgb:129,102,238;--color-special-600-rgb:112,85,223;--color-special-700-rgb:81,59,170;--color-special-800-rgb:69,45,165;--color-special-900-rgb:48,33,110;--color-special-950-rgb:39,21,96;--color-inherit:inherit;--color-transparent:transparent;--color-current:currentColor;--color-black:#000;--color-white:#fff;--color-canvas:#fff;--color-canvas-light:#fff;--color-canvas-dark:#fcfdfe;--color-inverse:#000;--color-surface:#eff1f3;--color-surface-light:#fcfdfe;--color-surface-strong:#ebedf3;--color-fore:#30394a;--color-fore-in-light:#30394a;--color-fore-in-dark:#fff;--color-focus:#bcdcff;--color-link:#2b47a2;--color-link-hover:#144ce1;--color-link-visited:#6328a4;--color-link-active:#144ce1;--color-placeholder:#64758b;--color-border:#ebedf3;--color-border-strong:#d2d6e5;--color-border-light:#eff1f3;--color-black-rgb:0,0,0;--color-white-rgb:255,255,255;--color-canvas-rgb:255,255,255;--color-canvas-light-rgb:255,255,255;--color-canvas-dark-rgb:252,253,254;--color-inverse-rgb:0,0,0;--color-surface-rgb:239,241,243;--color-surface-light-rgb:252,253,254;--color-surface-strong-rgb:235,237,243;--color-fore-rgb:48,57,74;--color-fore-in-light-rgb:48,57,74;--color-fore-in-dark-rgb:255,255,255;--color-focus-rgb:188,220,255;--color-link-rgb:43,71,162;--color-link-hover-rgb:20,76,225;--color-link-visited-rgb:99,40,164;--color-link-active-rgb:20,76,225;--color-placeholder-rgb:100,117,139;--color-border-rgb:235,237,243;--color-border-strong-rgb:210,214,229;--color-border-light-rgb:239,241,243;--radius-none:0px;--radius-sm:0.0625rem;--radius:0.125rem;--radius-md:0.25rem;--radius-lg:0.375rem;--radius-xl:0.5rem;--radius-2xl:0.75rem;--radius-3xl:1rem;--radius-full:9999px;--shadow-sm:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--shadow-md:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--shadow-lg:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--shadow-xl:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--shadow-2xl:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--shadow-inner:inset 0 2px 4px 0 rgba(0,0,0,.05);--shadow-none:none;--space:0.25rem;--font-size-article:0.875rem;--font-size-root:16px;--font-size-page-lineHeight:1.5384615385}.dark{--color-gray-50:#0b0f18;--color-gray-100:#30394a;--color-gray-200:#353d57;--color-gray-300:#3d4667;--color-gray-400:#4a577f;--color-gray-500:#64758b;--color-gray-600:#b2b9c5;--color-gray-700:#d2d6e5;--color-gray-800:#ebedf3;--color-gray-900:#eff1f3;--color-gray-950:#fcfdfe;--color-gray-50-rgb:11,15,24;--color-gray-100-rgb:48,57,74;--color-gray-200-rgb:53,61,87;--color-gray-300-rgb:61,70,103;--color-gray-400-rgb:74,87,127;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:178,185,197;--color-gray-700-rgb:210,214,229;--color-gray-800-rgb:235,237,243;--color-gray-900-rgb:239,241,243;--color-gray-950-rgb:252,253,254;--color-primary-50:#142457;--color-primary-100:#19388f;--color-primary-200:#173db6;--color-primary-300:#144ce1;--color-primary-400:#2b67e5;--color-primary-500:#3883fa;--color-primary-600:#59a5ff;--color-primary-700:#8ec6ff;--color-primary-800:#bcdcff;--color-primary-900:#d9eaff;--color-primary-950:#eef6ff;--color-primary-50-rgb:20,36,87;--color-primary-100-rgb:25,56,143;--color-primary-200-rgb:23,61,182;--color-primary-300-rgb:20,76,225;--color-primary-400-rgb:43,103,229;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:89,165,255;--color-primary-700-rgb:142,198,255;--color-primary-800-rgb:188,220,255;--color-primary-900-rgb:217,234,255;--color-primary-950-rgb:238,246,255;--color-secondary-50:#062a4b;--color-secondary-100:#046bab;--color-secondary-200:#078ada;--color-secondary-300:#1099ed;--color-secondary-400:#18a6fd;--color-secondary-500:#37b2fe;--color-secondary-600:#60c2ff;--color-secondary-700:#77cbff;--color-secondary-800:#9bd9ff;--color-secondary-900:#cdecff;--color-secondary-950:#e7f6ff;--color-secondary-50-rgb:6,42,75;--color-secondary-100-rgb:4,107,171;--color-secondary-200-rgb:7,138,218;--color-secondary-300-rgb:16,153,237;--color-secondary-400-rgb:24,166,253;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:96,194,255;--color-secondary-700-rgb:119,203,255;--color-secondary-800-rgb:155,217,255;--color-secondary-900-rgb:205,236,255;--color-secondary-950-rgb:231,246,255;--color-success-50:#0e3421;--color-success-100:#185e3b;--color-success-200:#21805a;--color-success-300:#28996c;--color-success-400:#2ba675;--color-success-500:#31bd85;--color-success-600:#5aca9d;--color-success-700:#83d7b6;--color-success-800:#ade5ce;--color-success-900:#d6f2e7;--color-success-950:#effaf6;--color-success-50-rgb:14,52,33;--color-success-100-rgb:24,94,59;--color-success-200-rgb:33,128,90;--color-success-300-rgb:40,153,108;--color-success-400-rgb:43,166,117;--color-success-500-rgb:49,189,133;--color-success-600-rgb:90,202,157;--color-success-700-rgb:131,215,182;--color-success-800-rgb:173,229,206;--color-success-900-rgb:214,242,231;--color-success-950-rgb:239,250,246;--color-warning-50:#441506;--color-warning-100:#af5f01;--color-warning-200:#d17100;--color-warning-300:#ed8307;--color-warning-400:#f38f19;--color-warning-500:#ff9f46;--color-warning-600:#ffaf65;--color-warning-700:#ffbc7e;--color-warning-800:#ffd2a9;--color-warning-900:#ffecdb;--color-warning-950:#fff4ea;--color-warning-50-rgb:68,21,6;--color-warning-100-rgb:175,95,1;--color-warning-200-rgb:209,113,0;--color-warning-300-rgb:237,131,7;--color-warning-400-rgb:243,143,25;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:255,175,101;--color-warning-700-rgb:255,188,126;--color-warning-800-rgb:255,210,169;--color-warning-900-rgb:255,236,219;--color-warning-950-rgb:255,244,234;--color-danger-50:#470808;--color-danger-100:#a20606;--color-danger-200:#ba1313;--color-danger-300:#d91b1b;--color-danger-400:#fb2b2b;--color-danger-500:#fc5959;--color-danger-600:#ff7c7c;--color-danger-700:#ff9292;--color-danger-800:#ffb1b1;--color-danger-900:#ffd5d5;--color-danger-950:#ffebeb;--color-danger-50-rgb:71,8,8;--color-danger-100-rgb:162,6,6;--color-danger-200-rgb:186,19,19;--color-danger-300-rgb:217,27,27;--color-danger-400-rgb:251,43,43;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:255,124,124;--color-danger-700-rgb:255,146,146;--color-danger-800-rgb:255,177,177;--color-danger-900-rgb:255,213,213;--color-danger-950-rgb:255,235,235;--color-important-50:#440609;--color-important-100:#611700;--color-important-200:#c83509;--color-important-300:#ff4912;--color-important-400:#ff6f42;--color-important-500:#ff8058;--color-important-600:#ff8c68;--color-important-700:#ffb29b;--color-important-800:#ffcebf;--color-important-900:#ffe2d9;--color-important-950:#fff8f5;--color-important-50-rgb:68,6,9;--color-important-100-rgb:97,23,0;--color-important-200-rgb:200,53,9;--color-important-300-rgb:255,73,18;--color-important-400-rgb:255,111,66;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,140,104;--color-important-700-rgb:255,178,155;--color-important-800-rgb:255,206,191;--color-important-900-rgb:255,226,217;--color-important-950-rgb:255,248,245;--color-special-50:#271560;--color-special-100:#30216e;--color-special-200:#452da5;--color-special-300:#513baa;--color-special-400:#7055df;--color-special-500:#8166ee;--color-special-600:#8a6ff5;--color-special-700:#a38cff;--color-special-800:#c4b6ff;--color-special-900:#e4dff7;--color-special-950:#efecfa;--color-special-50-rgb:39,21,96;--color-special-100-rgb:48,33,110;--color-special-200-rgb:69,45,165;--color-special-300-rgb:81,59,170;--color-special-400-rgb:112,85,223;--color-special-500-rgb:129,102,238;--color-special-600-rgb:138,111,245;--color-special-700-rgb:163,140,255;--color-special-800-rgb:196,182,255;--color-special-900-rgb:228,223,247;--color-special-950-rgb:239,236,250;--color-canvas:#0b0f18;--color-inverse:#fff;--color-surface:#353d57;--color-surface-light:#30394a;--color-surface-strong:#3d4667;--color-fore:#ebedf3;--color-focus:#173db6;--color-link:#59a5ff;--color-link-hover:#3883fa;--color-link-visited:#bcdcff;--color-link-active:#bcdcff;--color-placeholder:#4a577f;--color-border:#353d57;--color-border-strong:#3d4667;--color-border-light:#30394a;--color-canvas-rgb:11,15,24;--color-inverse-rgb:255,255,255;--color-surface-rgb:53,61,87;--color-surface-light-rgb:48,57,74;--color-surface-strong-rgb:61,70,103;--color-fore-rgb:235,237,243;--color-focus-rgb:23,61,182;--color-link-rgb:89,165,255;--color-link-hover-rgb:56,131,250;--color-link-visited-rgb:188,220,255;--color-link-active-rgb:188,220,255;--color-placeholder-rgb:74,87,127;--color-border-rgb:53,61,87;--color-border-strong-rgb:61,70,103;--color-border-light-rgb:48,57,74}.light-in-dark{--color-gray-50:#fcfdfe;--color-gray-100:#eff1f3;--color-gray-200:#ebedf3;--color-gray-300:#d2d6e5;--color-gray-400:#b2b9c5;--color-gray-500:#64758b;--color-gray-600:#4a577f;--color-gray-700:#3d4667;--color-gray-800:#353d57;--color-gray-900:#30394a;--color-gray-950:#0b0f18;--color-gray-50-rgb:252,253,254;--color-gray-100-rgb:239,241,243;--color-gray-200-rgb:235,237,243;--color-gray-300-rgb:210,214,229;--color-gray-400-rgb:178,185,197;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:74,87,127;--color-gray-700-rgb:61,70,103;--color-gray-800-rgb:53,61,87;--color-gray-900-rgb:48,57,74;--color-gray-950-rgb:11,15,24;--color-primary-50:#eef6ff;--color-primary-100:#d9eaff;--color-primary-200:#bcdcff;--color-primary-300:#8ec6ff;--color-primary-400:#59a5ff;--color-primary-500:#3883fa;--color-primary-600:#2b67e5;--color-primary-700:#144ce1;--color-primary-800:#173db6;--color-primary-900:#19388f;--color-primary-950:#142457;--color-primary-50-rgb:238,246,255;--color-primary-100-rgb:217,234,255;--color-primary-200-rgb:188,220,255;--color-primary-300-rgb:142,198,255;--color-primary-400-rgb:89,165,255;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:43,103,229;--color-primary-700-rgb:20,76,225;--color-primary-800-rgb:23,61,182;--color-primary-900-rgb:25,56,143;--color-primary-950-rgb:20,36,87;--color-secondary-50:#e7f6ff;--color-secondary-100:#cdecff;--color-secondary-200:#9bd9ff;--color-secondary-300:#77cbff;--color-secondary-400:#60c2ff;--color-secondary-500:#37b2fe;--color-secondary-600:#18a6fd;--color-secondary-700:#1099ed;--color-secondary-800:#078ada;--color-secondary-900:#046bab;--color-secondary-950:#062a4b;--color-secondary-50-rgb:231,246,255;--color-secondary-100-rgb:205,236,255;--color-secondary-200-rgb:155,217,255;--color-secondary-300-rgb:119,203,255;--color-secondary-400-rgb:96,194,255;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:24,166,253;--color-secondary-700-rgb:16,153,237;--color-secondary-800-rgb:7,138,218;--color-secondary-900-rgb:4,107,171;--color-secondary-950-rgb:6,42,75;--color-success-50:#effaf6;--color-success-100:#d6f2e7;--color-success-200:#ade5ce;--color-success-300:#83d7b6;--color-success-400:#5aca9d;--color-success-500:#31bd85;--color-success-600:#2ba675;--color-success-700:#28996c;--color-success-800:#21805a;--color-success-900:#185e3b;--color-success-950:#0e3421;--color-success-50-rgb:239,250,246;--color-success-100-rgb:214,242,231;--color-success-200-rgb:173,229,206;--color-success-300-rgb:131,215,182;--color-success-400-rgb:90,202,157;--color-success-500-rgb:49,189,133;--color-success-600-rgb:43,166,117;--color-success-700-rgb:40,153,108;--color-success-800-rgb:33,128,90;--color-success-900-rgb:24,94,59;--color-success-950-rgb:14,52,33;--color-warning-50:#fff4ea;--color-warning-100:#ffecdb;--color-warning-200:#ffd2a9;--color-warning-300:#ffbc7e;--color-warning-400:#ffaf65;--color-warning-500:#ff9f46;--color-warning-600:#f38f19;--color-warning-700:#ed8307;--color-warning-800:#d17100;--color-warning-900:#af5f01;--color-warning-950:#441506;--color-warning-50-rgb:255,244,234;--color-warning-100-rgb:255,236,219;--color-warning-200-rgb:255,210,169;--color-warning-300-rgb:255,188,126;--color-warning-400-rgb:255,175,101;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:243,143,25;--color-warning-700-rgb:237,131,7;--color-warning-800-rgb:209,113,0;--color-warning-900-rgb:175,95,1;--color-warning-950-rgb:68,21,6;--color-danger-50:#ffebeb;--color-danger-100:#ffd5d5;--color-danger-200:#ffb1b1;--color-danger-300:#ff9292;--color-danger-400:#ff7c7c;--color-danger-500:#fc5959;--color-danger-600:#fb2b2b;--color-danger-700:#d91b1b;--color-danger-800:#ba1313;--color-danger-900:#a20606;--color-danger-950:#470808;--color-danger-50-rgb:255,235,235;--color-danger-100-rgb:255,213,213;--color-danger-200-rgb:255,177,177;--color-danger-300-rgb:255,146,146;--color-danger-400-rgb:255,124,124;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:251,43,43;--color-danger-700-rgb:217,27,27;--color-danger-800-rgb:186,19,19;--color-danger-900-rgb:162,6,6;--color-danger-950-rgb:71,8,8;--color-important-50:#fff8f5;--color-important-100:#ffe2d9;--color-important-200:#ffcebf;--color-important-300:#ffb29b;--color-important-400:#ff8c68;--color-important-500:#ff8058;--color-important-600:#ff6f42;--color-important-700:#ff4912;--color-important-800:#c83509;--color-important-900:#611700;--color-important-950:#440609;--color-important-50-rgb:255,248,245;--color-important-100-rgb:255,226,217;--color-important-200-rgb:255,206,191;--color-important-300-rgb:255,178,155;--color-important-400-rgb:255,140,104;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,111,66;--color-important-700-rgb:255,73,18;--color-important-800-rgb:200,53,9;--color-important-900-rgb:97,23,0;--color-important-950-rgb:68,6,9;--color-special-50:#efecfa;--color-special-100:#e4dff7;--color-special-200:#c4b6ff;--color-special-300:#a38cff;--color-special-400:#8a6ff5;--color-special-500:#8166ee;--color-special-600:#7055df;--color-special-700:#513baa;--color-special-800:#452da5;--color-special-900:#30216e;--color-special-950:#271560;--color-special-50-rgb:239,236,250;--color-special-100-rgb:228,223,247;--color-special-200-rgb:196,182,255;--color-special-300-rgb:163,140,255;--color-special-400-rgb:138,111,245;--color-special-500-rgb:129,102,238;--color-special-600-rgb:112,85,223;--color-special-700-rgb:81,59,170;--color-special-800-rgb:69,45,165;--color-special-900-rgb:48,33,110;--color-special-950-rgb:39,21,96;--color-inherit:inherit;--color-transparent:transparent;--color-current:currentColor;--color-black:#000;--color-white:#fff;--color-canvas:#fff;--color-canvas-light:#fff;--color-canvas-dark:#fcfdfe;--color-inverse:#000;--color-surface:#eff1f3;--color-surface-light:#fcfdfe;--color-surface-strong:#ebedf3;--color-fore:#30394a;--color-fore-in-light:#30394a;--color-fore-in-dark:#fff;--color-focus:#bcdcff;--color-link:#2b47a2;--color-link-hover:#144ce1;--color-link-visited:#6328a4;--color-link-active:#144ce1;--color-placeholder:#64758b;--color-border:#ebedf3;--color-border-strong:#d2d6e5;--color-border-light:#eff1f3;--color-black-rgb:0,0,0;--color-white-rgb:255,255,255;--color-canvas-rgb:255,255,255;--color-canvas-light-rgb:255,255,255;--color-canvas-dark-rgb:252,253,254;--color-inverse-rgb:0,0,0;--color-surface-rgb:239,241,243;--color-surface-light-rgb:252,253,254;--color-surface-strong-rgb:235,237,243;--color-fore-rgb:48,57,74;--color-fore-in-light-rgb:48,57,74;--color-fore-in-dark-rgb:255,255,255;--color-focus-rgb:188,220,255;--color-link-rgb:43,71,162;--color-link-hover-rgb:20,76,225;--color-link-visited-rgb:99,40,164;--color-link-active-rgb:20,76,225;--color-placeholder-rgb:100,117,139;--color-border-rgb:235,237,243;--color-border-strong-rgb:210,214,229;--color-border-light-rgb:239,241,243}body{--btn-bg:var(--color-gray-50)}@media (prefers-color-scheme:dark){.dark-auto{--color-gray-50:#0b0f18;--color-gray-100:#30394a;--color-gray-200:#353d57;--color-gray-300:#3d4667;--color-gray-400:#4a577f;--color-gray-500:#64758b;--color-gray-600:#b2b9c5;--color-gray-700:#d2d6e5;--color-gray-800:#ebedf3;--color-gray-900:#eff1f3;--color-gray-950:#fcfdfe;--color-gray-50-rgb:11,15,24;--color-gray-100-rgb:48,57,74;--color-gray-200-rgb:53,61,87;--color-gray-300-rgb:61,70,103;--color-gray-400-rgb:74,87,127;--color-gray-500-rgb:100,117,139;--color-gray-600-rgb:178,185,197;--color-gray-700-rgb:210,214,229;--color-gray-800-rgb:235,237,243;--color-gray-900-rgb:239,241,243;--color-gray-950-rgb:252,253,254;--color-primary-50:#142457;--color-primary-100:#19388f;--color-primary-200:#173db6;--color-primary-300:#144ce1;--color-primary-400:#2b67e5;--color-primary-500:#3883fa;--color-primary-600:#59a5ff;--color-primary-700:#8ec6ff;--color-primary-800:#bcdcff;--color-primary-900:#d9eaff;--color-primary-950:#eef6ff;--color-primary-50-rgb:20,36,87;--color-primary-100-rgb:25,56,143;--color-primary-200-rgb:23,61,182;--color-primary-300-rgb:20,76,225;--color-primary-400-rgb:43,103,229;--color-primary-500-rgb:56,131,250;--color-primary-600-rgb:89,165,255;--color-primary-700-rgb:142,198,255;--color-primary-800-rgb:188,220,255;--color-primary-900-rgb:217,234,255;--color-primary-950-rgb:238,246,255;--color-secondary-50:#062a4b;--color-secondary-100:#046bab;--color-secondary-200:#078ada;--color-secondary-300:#1099ed;--color-secondary-400:#18a6fd;--color-secondary-500:#37b2fe;--color-secondary-600:#60c2ff;--color-secondary-700:#77cbff;--color-secondary-800:#9bd9ff;--color-secondary-900:#cdecff;--color-secondary-950:#e7f6ff;--color-secondary-50-rgb:6,42,75;--color-secondary-100-rgb:4,107,171;--color-secondary-200-rgb:7,138,218;--color-secondary-300-rgb:16,153,237;--color-secondary-400-rgb:24,166,253;--color-secondary-500-rgb:55,178,254;--color-secondary-600-rgb:96,194,255;--color-secondary-700-rgb:119,203,255;--color-secondary-800-rgb:155,217,255;--color-secondary-900-rgb:205,236,255;--color-secondary-950-rgb:231,246,255;--color-success-50:#0e3421;--color-success-100:#185e3b;--color-success-200:#21805a;--color-success-300:#28996c;--color-success-400:#2ba675;--color-success-500:#31bd85;--color-success-600:#5aca9d;--color-success-700:#83d7b6;--color-success-800:#ade5ce;--color-success-900:#d6f2e7;--color-success-950:#effaf6;--color-success-50-rgb:14,52,33;--color-success-100-rgb:24,94,59;--color-success-200-rgb:33,128,90;--color-success-300-rgb:40,153,108;--color-success-400-rgb:43,166,117;--color-success-500-rgb:49,189,133;--color-success-600-rgb:90,202,157;--color-success-700-rgb:131,215,182;--color-success-800-rgb:173,229,206;--color-success-900-rgb:214,242,231;--color-success-950-rgb:239,250,246;--color-warning-50:#441506;--color-warning-100:#af5f01;--color-warning-200:#d17100;--color-warning-300:#ed8307;--color-warning-400:#f38f19;--color-warning-500:#ff9f46;--color-warning-600:#ffaf65;--color-warning-700:#ffbc7e;--color-warning-800:#ffd2a9;--color-warning-900:#ffecdb;--color-warning-950:#fff4ea;--color-warning-50-rgb:68,21,6;--color-warning-100-rgb:175,95,1;--color-warning-200-rgb:209,113,0;--color-warning-300-rgb:237,131,7;--color-warning-400-rgb:243,143,25;--color-warning-500-rgb:255,159,70;--color-warning-600-rgb:255,175,101;--color-warning-700-rgb:255,188,126;--color-warning-800-rgb:255,210,169;--color-warning-900-rgb:255,236,219;--color-warning-950-rgb:255,244,234;--color-danger-50:#470808;--color-danger-100:#a20606;--color-danger-200:#ba1313;--color-danger-300:#d91b1b;--color-danger-400:#fb2b2b;--color-danger-500:#fc5959;--color-danger-600:#ff7c7c;--color-danger-700:#ff9292;--color-danger-800:#ffb1b1;--color-danger-900:#ffd5d5;--color-danger-950:#ffebeb;--color-danger-50-rgb:71,8,8;--color-danger-100-rgb:162,6,6;--color-danger-200-rgb:186,19,19;--color-danger-300-rgb:217,27,27;--color-danger-400-rgb:251,43,43;--color-danger-500-rgb:252,89,89;--color-danger-600-rgb:255,124,124;--color-danger-700-rgb:255,146,146;--color-danger-800-rgb:255,177,177;--color-danger-900-rgb:255,213,213;--color-danger-950-rgb:255,235,235;--color-important-50:#440609;--color-important-100:#611700;--color-important-200:#c83509;--color-important-300:#ff4912;--color-important-400:#ff6f42;--color-important-500:#ff8058;--color-important-600:#ff8c68;--color-important-700:#ffb29b;--color-important-800:#ffcebf;--color-important-900:#ffe2d9;--color-important-950:#fff8f5;--color-important-50-rgb:68,6,9;--color-important-100-rgb:97,23,0;--color-important-200-rgb:200,53,9;--color-important-300-rgb:255,73,18;--color-important-400-rgb:255,111,66;--color-important-500-rgb:255,128,88;--color-important-600-rgb:255,140,104;--color-important-700-rgb:255,178,155;--color-important-800-rgb:255,206,191;--color-important-900-rgb:255,226,217;--color-important-950-rgb:255,248,245;--color-special-50:#271560;--color-special-100:#30216e;--color-special-200:#452da5;--color-special-300:#513baa;--color-special-400:#7055df;--color-special-500:#8166ee;--color-special-600:#8a6ff5;--color-special-700:#a38cff;--color-special-800:#c4b6ff;--color-special-900:#e4dff7;--color-special-950:#efecfa;--color-special-50-rgb:39,21,96;--color-special-100-rgb:48,33,110;--color-special-200-rgb:69,45,165;--color-special-300-rgb:81,59,170;--color-special-400-rgb:112,85,223;--color-special-500-rgb:129,102,238;--color-special-600-rgb:138,111,245;--color-special-700-rgb:163,140,255;--color-special-800-rgb:196,182,255;--color-special-900-rgb:228,223,247;--color-special-950-rgb:239,236,250;--color-canvas:#0b0f18;--color-inverse:#fff;--color-surface:#353d57;--color-surface-light:#30394a;--color-surface-strong:#3d4667;--color-fore:#ebedf3;--color-focus:#173db6;--color-link:#59a5ff;--color-link-hover:#3883fa;--color-link-visited:#bcdcff;--color-link-active:#bcdcff;--color-placeholder:#4a577f;--color-border:#353d57;--color-border-strong:#3d4667;--color-border-light:#30394a;--color-canvas-rgb:11,15,24;--color-inverse-rgb:255,255,255;--color-surface-rgb:53,61,87;--color-surface-light-rgb:48,57,74;--color-surface-strong-rgb:61,70,103;--color-fore-rgb:235,237,243;--color-focus-rgb:23,61,182;--color-link-rgb:89,165,255;--color-link-hover-rgb:56,131,250;--color-link-visited-rgb:188,220,255;--color-link-active-rgb:188,220,255;--color-placeholder-rgb:74,87,127;--color-border-rgb:53,61,87;--color-border-strong-rgb:61,70,103;--color-border-light-rgb:48,57,74}}*,:after,:before{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}:focus-visible{outline-color:transparent}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }html{font-size:var(--font-size-root)}body{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));font-size:.8125rem;line-height:1.5384615385}.dark,body{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}:root{--font-h1-size:2.25rem;--article-p-space:0.5em;--article-heading-space:0.5em;--article-hr-space:1.5em;--article-cell-padding:0.25rem 0.75rem}a,a.disabled:hover{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}a:hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}a:focus-visible{outline-color:rgb(var(--color-focus-rgb));outline-offset:2px;outline-width:2px}.code,code{background-color:rgba(var(--color-important-500-rgb),.1);border-radius:var(--radius);padding-left:.25rem;padding-right:.25rem;--tw-text-opacity:1;color:rgba(var(--color-important-500-rgb),var(--tw-text-opacity))}pre{font-size:.75rem;line-height:1rem;overflow:auto;padding:.5rem}pre code{background-color:transparent;color:inherit;padding:0}samp,var{font-weight:700}.blockquote,blockquote{border-left-width:4px;font-size:.875rem;line-height:1.3rem;padding-left:.75rem;text-wrap:pretty}.blockquote figcaption,blockquote figcaption{font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:700;line-height:1.5;text-wrap:balance}.h1,h1{font-size:1.75rem}.h2,h2{font-size:1.5rem}.h3,h3{font-size:1.25rem}.h4,h4{font-size:1rem}.h5,h5{font-size:.875rem}.h6,h6{font-size:.75rem}ul{list-style-type:disc}ol,ul{padding-left:1.5em}ol{list-style-type:decimal}dt{font-weight:700}dd{padding-left:2em}.article{color:var(--font-size-article);-webkit-hyphens:auto;hyphens:auto;overflow-wrap:break-word;white-space:pre-wrap}.article h1,.article h2,.article h3,.article h4{margin-bottom:var(--article-heading-space);margin-top:var(--article-heading-space)}.article audio,.article blockquote,.article figure,.article img,.article ol,.article p,.article table,.article ul,.article video{margin-bottom:var(--article-p-space);margin-top:var(--article-p-space);text-wrap:pretty}.article p{min-height:1em}.article p:empty:before{content:" ";display:inline-block}.article hr{margin-bottom:var(--article-hr-space);margin-top:var(--article-hr-space)}.article table{border-width:1px}.article td,.article th{border-bottom-width:1px;padding:var(--article-cell-padding)}.article thead{background-color:var(--table-head-bg,var(--color-gray-100))}.article ol *,.article table *,.article ul *{margin-bottom:0;margin-top:0}.article pre{border-radius:var(--radius);border-width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity))}:root{--alert-bg:var(--color-surface)}.alert{align-items:center;background-color:var(--alert-bg);border-radius:var(--radius);display:flex;gap:.75rem;padding:.5rem .75rem}.alert-content{display:flex;flex:1 1 auto;flex-direction:column;gap:1rem}.alert-close{margin-bottom:-.375rem;margin-right:-.5rem;margin-top:-.375rem}.alert-link{color:inherit;font-weight:700}.alert-link:hover{color:inherit;text-decoration-line:underline}.alert-heading{font-weight:700;margin:0}.alert-text{flex:1 1 auto;white-space:pre-line}.alert-actions{align-items:center;display:flex;gap:.5rem}:root{--breadcrumb-divider:"/";--breadcrumb-divider-color:var(--color-gray-500);--breadcrumb-color-active:var(--color-gray-500)}.breadcrumb{display:flex;gap:1.25rem;list-style-type:none;padding-left:0}.breadcrumb>li{position:relative}.breadcrumb>li+li:before{color:var(--breadcrumb-divider-color);content:var(--breadcrumb-divider);display:block;left:-1.25rem;position:absolute;text-align:center;width:1.25rem}.breadcrumb>.active{color:var(--breadcrumb-color-active)}:root{--btn-radius:var(--radius);--btn-bg:var(--color-surface);--btn-border-color:var(--color-gray-300);--btn-height:2rem}.btn{align-items:center;background-color:var(--btn-bg);border-radius:var(--btn-radius);display:inline-flex;gap:.375rem;height:var(--btn-height);justify-content:center;padding-left:.75rem;padding-right:.75rem;white-space:nowrap;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--btn-border-color)}.btn,.btn-default:hover{color:inherit}.btn-link{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity));text-decoration-line:underline;text-underline-offset:2px;--tw-ring-color:transparent}.btn-link:visited{color:rgba(var(--color-link-visited-rgb),var(--tw-text-opacity))}.btn-link:hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}.btn-link{--btn-bg:transparent}.btn.size-xs,.size-xs>.btn{padding-left:.25rem;padding-right:.25rem;--btn-height:1.25rem}.btn.size-sm,.btn.size-xs,.size-sm>.btn,.size-xs>.btn{font-size:.75rem;line-height:1rem}.btn.size-sm,.size-sm>.btn{--btn-height:1.5rem}.btn.size-md,.btn.size-sm,.size-md>.btn,.size-sm>.btn{padding-left:.5rem;padding-right:.5rem}.btn.size-md,.size-md>.btn{--btn-height:1.75rem}.btn.size-lg,.size-lg>.btn{font-size:1rem;line-height:1.5rem;padding-left:1rem;padding-right:1rem;--btn-height:2.5rem}.btn.size-xl,.size-xl>.btn{font-size:1.125rem;line-height:1.75rem;padding-left:1.25rem;padding-right:1.25rem;--btn-height:3rem}.btn.square{aspect-ratio:1/1;gap:.125rem;padding-left:0;padding-right:0}@supports not (aspect-ratio:1/1){.btn.square{width:var(--btn-height)}}.btn.btn-caret{padding-left:.25rem;padding-right:.25rem}.btn.btn-wide{min-width:80px}:root{--checkbox-size:12px;--checkbox-color:var(--color-primary-500)}.checkbox,.radio{align-items:center;cursor:pointer;display:flex;gap:.375rem;min-height:20px}.checkbox>input[type=checkbox],.radio>input[type=radio]{accent-color:rgb(var(--color-primary-500-rgb));border-radius:var(--radius-lg)}.checkbox-primary,.radio-primary{display:flex;gap:.375rem;min-height:20px;position:relative}.checkbox-primary>input[type=checkbox],.radio-primary>input[type=radio]{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.checkbox-primary>label,.radio-primary>label{cursor:pointer;padding-left:calc(var(--checkbox-size) + 8px);position:relative}.checkbox-primary>label:after,.checkbox-primary>label:before,.radio-primary>label:after,.radio-primary>label:before{display:block;height:var(--checkbox-size);left:0;position:absolute;transition-duration:.15s;transition-property:transform,background-color,color,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--checkbox-size);--tw-content:"";content:var(--tw-content);top:calc((20px - var(--checkbox-size))/2)}.checkbox-primary>label:before{border-radius:var(--radius-sm);border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.checkbox-primary>label:after{--tw-scale-x:.9;--tw-scale-y:.9;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0ibTkgMjAuNDItNi4yMS02LjIxIDIuODMtMi44M0w5IDE0Ljc3bDkuODgtOS44OSAyLjgzIDIuODN6Ii8+PC9zdmc+");transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.radio-primary>label:before{border-radius:var(--radius-full);border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.radio-primary>label:after{background-color:var(--checkbox-color);border-radius:var(--radius-full);opacity:0;--checkbox-radio-size:calc(var(--checkbox-size)*2/3);height:var(--checkbox-radio-size);left:calc((var(--checkbox-size) - var(--checkbox-radio-size))/2);top:calc((20px - var(--checkbox-radio-size))/2);width:var(--checkbox-radio-size)}.checkbox-primary>label:hover:before,.radio-primary>label:hover:before{border-color:var(--checkbox-color)}.checkbox-primary.focus>label:before,.checkbox-primary>input[type=checkbox]:focus+label:before,.radio-primary.focus>label:before,.radio-primary>input[type=radio]:focus+label:before{border-color:var(--checkbox-color);outline-color:rgb(var(--color-focus-rgb));outline-style:solid;outline-width:2px}.checkbox-primary.checked>label:before,.checkbox-primary>input[type=checkbox]:checked+label:before{background-color:var(--checkbox-color);border-color:var(--checkbox-color)}.radio-primary.checked>label:before,.radio-primary>input[type=radio]:checked+label:before{border-color:var(--checkbox-color)}.checkbox-primary.checked>label:after,.checkbox-primary>input[type=checkbox]:checked+label:after,.radio-primary.checked>label:after,.radio-primary>input[type=radio]:checked+label:after{opacity:1}.checkbox-primary.disabled>label,.checkbox-primary>input[type=checkbox]:disabled+label,.radio-primary.disabled>label,.radio-primary>input[type=radio]:disabled+label{cursor:not-allowed;opacity:.7;pointer-events:none;--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.checkbox-primary.indeterminate>label:after,.checkbox-primary>input[type=checkbox]:indeterminate+label:after{--tw-border-opacity:1;background-color:var(--checkbox-color);background-image:none;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity));border-width:calc((var(--checkbox-size) - 2px)/2) 2px;opacity:1}.check-list{align-items:flex-start;flex-direction:column;gap:.5rem}.check-list,.check-list-inline{display:flex;padding-bottom:.375rem;padding-top:.375rem}.check-list-inline{align-items:center;-moz-column-gap:1rem;column-gap:1rem;flex-direction:row;flex-wrap:wrap;row-gap:.5rem}.switch{display:flex;gap:.375rem;min-height:20px;padding-left:2.5rem;position:relative}.switch>input{bottom:0;left:0;opacity:0;position:absolute;right:0;top:0}.switch>label:after,.switch>label:before{border-radius:var(--radius-full);border-width:1px;height:1rem;left:0;position:absolute;top:.125rem;width:2rem;--tw-border-opacity:1;border-color:rgba(var(--color-border-strong-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));transition-duration:.3s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:"";content:var(--tw-content)}.switch>label:before{cursor:pointer;--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.switch>label:hover:before{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}.switch>label:after{height:.75rem;left:.125rem;top:.25rem;width:.75rem;--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.switch>input:checked+label:before{background-color:var(--checkbox-color);border-color:rgba(var(--color-inverse-rgb),.2)}.switch>input:checked+label:after{color:var(--checkbox-color);left:18px}.switch.focus>label:before,.switch>input:focus+label:before{border-color:var(--checkbox-color);outline-color:rgb(var(--color-focus-rgb));outline-style:solid;outline-width:2px}.switch.disabled>label:before,.switch>input:disabled+label:before{cursor:not-allowed;opacity:.7;pointer-events:none;--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:root{--form-control-radius:var(--radius);--form-control-border:var(--color-border);--form-control-focus:var(--color-primary-500);--form-control-disabled:var(--color-surface);--form-control-readonly:var(--color-surface)}.dark{--form-control-border:var(--color-border-strong)}input::-moz-placeholder,textarea::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-placeholder-opacity))}input::placeholder,textarea::placeholder{--tw-placeholder-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-placeholder-opacity))}.form-control{border-radius:var(--form-control-radius);display:block;height:2rem;width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));outline-color:transparent;outline-style:solid;outline-width:1px;padding:.25rem .5rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--form-control-border);transition-duration:.15s;transition-property:outline,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.form-control.focus,.form-control:focus{outline-color:var(--form-control-focus);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-focus-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.3}.form-control.disabled,.form-control[disabled]{background-color:var(--form-control-disabled);opacity:1}.form-control.readonly,.form-control[readonly]{background-color:var(--form-control-readonly)}select{-webkit-appearance:none;background-image:url("data:image/gif;base64,R0lGODlhBwAEAIAAAMvQ2////yH5BAEAAAEALAAAAAAHAAQAAAIIhA+BGWoNWSgAOw==");background-position:right 8px top 50%;background-repeat:no-repeat;background-size:8px auto;padding-right:1rem}select.form-control[multiple]{background-image:none}textarea.form-control{height:auto;min-height:32px}input[type=file].form-control{padding:.125rem}input[type=file].form-control::-webkit-file-upload-button{-webkit-appearance:none;appearance:none;border-radius:inherit;border-style:none;cursor:pointer;height:1.75rem;padding-left:.5rem;padding-right:.5rem}input[type=file].form-control::-webkit-file-upload-button:hover{background-color:rgba(var(--color-black-rgb),.1)}.has-error .form-control,.has-error.form-control{--tw-ring-color:rgba(var(--color-danger-500-rgb),0.6)}.has-error .form-control.focus,.has-error .form-control:focus,.has-error.form-control.focus,.has-error.form-control:focus{outline-color:rgb(var(--color-danger-500-rgb));--tw-ring-color:rgba(var(--color-danger-500-rgb),0.1)}.has-warning .form-control,.has-warning.form-control{--tw-ring-color:rgba(var(--color-warning-500-rgb),0.6)}.has-warning .form-control.focus,.has-warning .form-control:focus,.has-warning.form-control.focus,.has-warning.form-control:focus{outline-color:rgb(var(--color-warning-500-rgb));--tw-ring-color:rgba(var(--color-warning-500-rgb),0.2)}.has-success .form-control,.has-success.form-control{--tw-ring-color:rgba(var(--color-success-500-rgb),0.6)}.has-success .form-control.focus,.has-success .form-control:focus,.has-success.form-control.focus,.has-success.form-control:focus{outline-color:rgb(var(--color-success-500-rgb));--tw-ring-color:rgba(var(--color-success-500-rgb),0.2)}.form-control.size-sm,.size-sm>.form-control{font-size:.75rem;height:1.5rem;line-height:1rem;padding-left:.5rem;padding-right:.5rem}.form-control.size-md,.size-md>.form-control{height:1.75rem;padding-left:.5rem;padding-right:.5rem}.form-control.size-lg,.size-lg>.form-control{font-size:1rem;height:2.5rem;line-height:1.5rem;padding-left:.75rem;padding-right:.75rem}:root{--input-group-addon-bg:var(--color-gray-50)}.input-group{align-items:stretch;display:flex}.input-group>.form-control,.input-group>.input-control{flex:1 1 auto;z-index:1}.input-group-addon{align-items:center;background-color:var(--input-group-addon-bg);border-radius:var(--form-control-radius);display:flex;flex:none;height:2rem;padding-left:.5rem;padding-right:.5rem;z-index:0;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--form-control-border)}.size-sm>.input-group-addon{font-size:.75rem;height:1.5rem;line-height:1rem;padding-left:.5rem;padding-right:.5rem}.size-lg>.input-group-addon{font-size:1rem;height:2.5rem;line-height:1.5rem;padding-left:.75rem;padding-right:.75rem}.input-group-control{flex:1 1 auto}.input-group>*+*,.input-group>*+* .form-control{border-bottom-left-radius:var(--radius-none);border-top-left-radius:var(--radius-none)}.input-group>:not(:last-child),.input-group>:not(:last-child) .form-control{border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none)}.input-group .btn:focus-visible,.input-group .form-control:focus{z-index:2}:root{--form-tip-color:var(--color-gray-400);--form-label-color:var(--color-gray-700);--form-horz-label-width:6rem;--form-grid-gap-x:1.25rem;--form-grid-gap-y:.75rem}.form{flex-direction:column;gap:1rem}.form,.form-label{display:flex}.form-label{align-items:center;color:var(--form-label-color);flex-direction:row;gap:.25rem;height:2rem;overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.form-label.required:after{content:"*";display:inline-block;margin-left:.25rem;--tw-translate-y:0.125rem;--tw-scale-x:1.25;--tw-scale-y:1.25;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.no-required .form-label.required:after{display:none}.form-label-actions{flex:1 1 auto;justify-content:flex-end}.form-label>.checkbox-primary{margin-left:.75rem}.form-tip{color:var(--form-tip-color);display:block;margin-top:.25rem}.has-error .form-tip{--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.has-warning .form-tip{--tw-text-opacity:1;color:rgba(var(--color-warning-500-rgb),var(--tw-text-opacity))}.has-success .form-tip{--tw-text-opacity:1;color:rgba(var(--color-success-500-rgb),var(--tw-text-opacity))}.form-actions{display:flex;flex-direction:row;gap:1rem;justify-content:center}.form-grid{--form-grid-gap-x-half:calc(var(--form-grid-gap-x)/2);--form-grid-gap-y-half:calc(var(--form-grid-gap-y)/2);align-items:flex-start;flex-direction:row;flex-wrap:wrap;gap:0}.form-grid .form-group{padding:var(--form-grid-gap-y-half) var(--form-grid-gap-x-half)}.form-grid .form-label.required:after{margin-left:.25rem;order:-9999}.form-grid .form-label .checkbox{margin-left:.75rem;margin-right:.75rem}.form-grid .has-wrap-after:after{display:block;width:100%;--tw-content:"";content:var(--tw-content)}.form-grid-wrap{width:100%}.form-grid-row{display:flex;flex-direction:row;padding-bottom:var(--form-grid-gap-y-half);padding-top:var(--form-grid-gap-y-half);position:relative;width:100%}.form-grid-col{padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half)}.form-grid .form-actions{gap:1.5rem;justify-content:center;padding:var(--form-grid-gap-y) var(--form-grid-gap-x-half);width:100%}.form-grid .form-actions.is-pinned{border-top-width:1px}.form-horz .form-row{align-items:flex-start;display:flex;flex-direction:row}.form-horz .form-group{align-items:flex-start;display:flex;flex:none;flex-direction:row;flex-wrap:wrap;min-height:32px;min-width:0;padding-left:var(--form-horz-label-width);position:relative}.form-horz .form-row .form-group{flex:1 1 auto}.form-horz .form-group[class*=" w-"],.form-horz .form-group[class^=w-]{flex:none}.form-horz .form-group>*{min-width:0}.form-horz .form-group.no-label{padding-left:0}.form-horz .form-group.no-label>.check-list-inline{padding-left:1rem;padding-right:1rem}.form-horz .form-label{justify-content:flex-end;left:0;padding-left:1rem;padding-right:.5rem;position:absolute;top:0;width:var(--form-horz-label-width)}.form-horz .form-label.required:after{margin-left:0;order:-9999}.form-horz .form-tip{width:100%}.form-horz .form-tip,.form-horz .input-control,.form-horz .input-group{flex:1 1 auto}.form .form-group-wrapper,.form-horz .form-group-wrapper{flex:1 1 auto;min-width:0;width:100%;z-index:1}.form .form-group-wrapper.flex-none,.form-horz .form-group-wrapper.flex-none{flex:none}.form fieldset>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.form fieldset{padding-bottom:1rem;padding-left:1rem}.form-grid fieldset>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.form legend{border-bottom-width:1px;display:flex;justify-content:flex-start;margin-left:-1rem;width:100%;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-primary-100-rgb),var(--tw-border-opacity));width:calc(100% + 1rem)}.form-title{align-items:center;background-color:rgba(var(--color-primary-50-rgb),.5);display:flex;font-weight:700;height:1.75rem;padding-left:.75rem;padding-right:.75rem}:root{--input-control-fix-width-sm:2rem;--input-control-fix-width:4.375rem;--input-control-fix-width-lg:6.75rem}.input-control{position:relative;--input-control-prefix:8px;--input-control-suffix:8px}.input-control-prefix,.input-control-suffix{align-items:center;display:flex;height:100%;left:0;opacity:.5;padding-left:.5rem;padding-right:.5rem;position:absolute;top:0;white-space:nowrap;width:var(--input-control-prefix);z-index:1}.input-control-suffix{justify-content:flex-end;left:auto;right:0;width:var(--input-control-suffix)}.form-control:focus+.input-control-prefix,.form-control:focus+.input-control-suffix{opacity:1}.input-control>.form-control{padding-left:var(--input-control-prefix);padding-right:var(--input-control-suffix)}.input-control>select.form-control{background-position-x:calc(100% - var(--input-control-suffix) - 8px);padding-right:calc(var(--input-control-suffix) + 20px)}.has-prefix{--input-control-prefix:var(--input-control-fix-width)}.has-suffix{--input-control-suffix:var(--input-control-fix-width)}.has-prefix-sm{--input-control-prefix:var(--input-control-fix-width-sm)}.has-suffix-sm{--input-control-suffix:var(--input-control-fix-width-sm)}.has-prefix-lg{--input-control-prefix:var(--input-control-fix-width-lg)}.has-suffix-lg{--input-control-suffix:var(--input-control-fix-width-lg)}.has-prefix-icon{--input-control-prefix:32px}.has-suffix-icon{--input-control-suffix:32px}.input-control.has-prefix-icon{--input-control-prefix:32px}.input-control.has-suffix-icon{--input-control-suffix:32px}.input-control.has-prefix-icon>.input-control-prefix,.input-control.has-suffix-icon>.input-control-suffix{justify-content:center;padding:0}.input-control.size-sm>.form-control,.input-control.size-sm>.input-control-prefix,.input-control.size-sm>.input-control-suffix{font-size:.75rem;line-height:1rem}.input-control.size-lg>.form-control,.input-control.size-lg>.input-control-prefix,.input-control.size-lg>.input-control-suffix{font-size:1rem;line-height:1.5rem}:root{--label-bg:rgba(var(--color-canvas-rgb),.1);--label-border-color:var(--color-gray-300);--label-color:var(--color-gray-500);--label-radius:var(--radius)}.label{align-items:center;background-color:var(--label-bg);border-radius:var(--label-radius);color:var(--label-color);display:inline-flex;font-size:.75rem;height:1.25rem;justify-content:center;line-height:1rem;min-width:1.25rem;padding-left:.25rem;padding-right:.25rem;white-space:pre-line;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--label-border-color)}.label.size-lg{font-size:.8125rem;height:1.5rem;line-height:1.25rem;min-width:1.5rem;padding-left:.5rem;padding-right:.5rem}.label.size-sm{height:1rem;min-width:1rem}.label-dot{aspect-ratio:1/1;border-radius:var(--radius-full);height:.5rem;min-width:0;padding-left:0;padding-right:0}.caret,.caret-down,.caret-left,.caret-right,.caret-up{align-items:center;display:inline-flex;height:.75rem;justify-content:center;position:relative;width:.75rem}.caret-down:before,.caret-left:before,.caret-right:before,.caret-up:before,.caret:before{display:block;height:.35rem;transform-origin:center;width:.35rem;--tw-translate-y:-1px;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.caret-left:before{--tw-translate-x:0.125rem;--tw-translate-y:0px;--tw-rotate:135deg}.caret-left:before,.caret-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.caret-right:before{--tw-translate-x:-0.125rem;--tw-translate-y:0px;--tw-rotate:-45deg}.caret-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:focus>.caret,:hover>.caret{opacity:inherit}.disabled .caret,.readonly .caret{opacity:var(--caret-opacity,.5)}.listitem{align-items:center;border-radius:var(--radius);display:flex;flex-direction:row;flex-wrap:nowrap;gap:.5rem;padding:.25rem}.listitem.selected{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.listitem.active{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.item-actions,.item-avatar,.item-icon,.item-trailing,.item-trailing-icon{flex:none}.item-icon.icon-EMPTY{display:none}.item-subtitle{font-size:.75rem;line-height:1rem;opacity:.8}.item-content,.item-text{flex:1 1 auto;min-width:0}.item-leading,.item-trailing{align-items:center;display:flex;flex:none;gap:.5rem}.item-checkbox{margin-right:-.5rem}.item-content{align-items:center;display:flex;gap:.5rem}.multiline>.item-content{align-items:flex-start;flex-direction:column;gap:.25rem}.list{list-style-type:none;padding-left:0}.list-heading-inner .item-title{font-weight:700;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.with-hover-actions>.item{position:relative}.with-hover-actions>.item>.item-inner .item-actions{opacity:0;pointer-events:none;position:absolute;right:.25rem;top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.with-hover-actions>.item>.item-inner:hover .item-actions{display:flex;margin-top:-.25rem;opacity:1;pointer-events:auto;position:static}.list.is-nested-sub{padding-left:var(--list-indent)}.is-nested-collapsed{display:none}.nested-toggle-icon{align-items:center;border-radius:var(--radius);display:flex;height:1rem;justify-content:center;margin-right:-.25rem;width:1rem}.magnifier{display:inline-block;height:1em;position:relative;width:1em}.magnifier:after,.magnifier:before{border-radius:var(--radius-full);content:"";display:block;position:absolute}.magnifier:before{border:1px solid;height:.75em;width:.75em}.magnifier:after{height:1px;left:.55em;top:.7em;width:.5em;--tw-rotate:45deg;background-color:currentColor;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.search-box.compact.has-prefix-icon{--input-control-prefix:24px}.search-box.compact.has-suffix-icon{--input-control-suffix:24px}:root{--menu-bg:var(--color-canvas);--menu-active-bg:var(--color-primary-500);--menu-active-color:var(--color-canvas);--menu-selected-bg:var(--color-primary-50);--menu-selected-color:var(--color-primary-500);--menu-icon-opacity:.5;--menu-icon-margin:1.75rem;--menu-min-width:3rem;--menu-heading-color:var(--color-gray-500)}.menu{background:var(--menu-bg);max-width:var(--menu-max-width);min-width:var(--menu-min-width);padding:.5rem}.menu-wrapper{display:flex;flex-direction:column;min-height:0}.menu-wrapper>.menu{flex:1 1 auto;min-height:0;overflow:auto}.menu-item>.item-inner,.menu-item>a{align-items:center;border-radius:var(--radius);color:inherit;cursor:pointer;display:flex;gap:.5rem;justify-content:space-between;overflow:hidden;padding:.25rem .5rem;position:relative;text-overflow:ellipsis;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);white-space:nowrap}.menu-item>.selected{background:var(--menu-selected-bg);color:var(--menu-selected-color)}.menu-item>.active,.menu-item>a.hover,.menu-item>a:hover{background:var(--menu-active-bg);color:var(--menu-active-color)}.menu-item>a.no-hover.hover,.menu-item>a.no-hover:hover{background:unset;color:unset}.menu-item.disabled>a:hover,.menu-item>a.disabled:hover{background-color:inherit;color:inherit}.menu-item .item-title{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:clip;white-space:nowrap}.menu>.divider{margin:.25rem}.menu-heading{align-items:center;color:var(--menu-heading-color);display:flex;font-size:.75rem;font-weight:700;height:2rem;line-height:1rem;padding-left:.25rem;padding-right:.25rem}.has-icons>.menu-item>a>.item-icon{align-items:center;display:flex;height:1rem;justify-content:center;opacity:var(--menu-icon-opacity);width:1rem}.menu-nested{--menu-indent:10px}.menu-nested .menu{background-color:transparent;margin-bottom:-.5rem;margin-left:var(--menu-indent);margin-top:-.5rem;padding-right:0}.menu-nested .menu-item>.item-inner{padding-left:0}.menu-nested .search-menu-footer,.menu-nested .search-menu-header{margin-bottom:.25rem;margin-left:var(--menu-indent);margin-top:-.125rem;padding-right:1px}.menu.compact .menu-item>a{padding-bottom:.125rem;padding-top:.125rem}.menu.compact .menu-heading{height:1.75rem}.search-menu-header{padding:.5rem .5rem .125rem}.search-menu-footer{padding:.125rem .5rem .5rem}.search-menu .item.is-not-match,.search-menu-footer:empty,.search-menu-header:empty{display:none}.search-menu .item.is-not-match.has-match-child{display:list-item}.search-menu .item.is-not-match.has-match-child>.item-inner{opacity:.5;pointer-events:none}.search-menu.no-toggle-on-search .nested-toggle-icon{pointer-events:none}.search-menu .is-match-keys{font-weight:700;text-decoration-line:underline}.search-menu-no-match-hint{display:none;font-size:.75rem;line-height:1rem;padding:.5rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.no-match-child .search-menu-no-match-hint{display:block}.no-match-child>.menu{display:none}.search-menu-exceed-limit-hint{font-size:.75rem;line-height:1rem;padding:.25rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}:root{--alert-bg:var(--color-surface)}.alert{align-items:center;background-color:var(--alert-bg);border-radius:var(--radius);display:flex;gap:.75rem;padding:.5rem .75rem}.alert-content{display:flex;flex:1 1 auto;flex-direction:column;gap:1rem}.alert-close{margin-bottom:-.375rem;margin-right:-.5rem;margin-top:-.375rem}.alert-link{color:inherit;font-weight:700}.alert-link:hover{color:inherit;text-decoration-line:underline}.alert-heading{font-weight:700;margin:0}.alert-text{flex:1 1 auto;white-space:pre-line}.alert-actions{align-items:center;display:flex;gap:.5rem}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.messagers{align-items:flex-end;bottom:0;display:flex;flex-direction:column;gap:.5rem;justify-content:flex-end;left:0;padding:1rem;pointer-events:none;position:fixed;right:0;top:0;z-index:1900}.messagers-top-left,.messagers-top-right{justify-content:flex-start}.messagers-bottom-left,.messagers-top-left{align-items:flex-start}.messagers-bottom,.messagers-center,.messagers-top{align-items:center}.messagers-top,.messagers-top-left,.messagers-top-right{justify-content:flex-start}.messagers-center{justify-content:center}.messager{background-color:rgba(var(--color-inverse-rgb),.8);pointer-events:auto;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);transition-duration:.3s}:root{--progress-radius:var(--radius);--progress-striped-size:40px;--progress-bg:var(--color-surface);--progress-bar-color:var(--color-primary-500)}.progress{background:var(--progress-bg);border-radius:var(--progress-radius);display:flex;height:1.25rem}.progress-bar{background:var(--progress-bar-color);height:100%;transition-duration:.5s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1)}.progress-striped>.progress-bar{background-image:linear-gradient(45deg,rgba(var(--color-canvas-rgb),.15) 25%,transparent 25%,transparent 50%,rgba(var(--color-canvas-rgb),.15) 50%,rgba(var(--color-canvas-rgb),.15) 75%,transparent 75%,transparent);background-size:var(--progress-striped-size) var(--progress-striped-size)}.progress>.progress-bar:first-child{border-bottom-left-radius:inherit;border-top-left-radius:inherit}.progress>.progress-bar:last-child{border-bottom-right-radius:inherit;border-top-right-radius:inherit}.progress.active .progress-bar{animation:progress-bar-stripes 2s linear infinite}@keyframes progress-bar-stripes{0%{background-position:40px 0}to{background-position:0 0}}.scrollbar,:root{--scrollbar-size:10px;--scrollbar-opacity:.6;--scrollbar-bg:rgba(var(--color-inverse-rgb),.15);--scrollbar-inset:inset 0 0 0 1px rgba(var(--color-inverse-rgb),.05);--scrollbar-bar-bg:rgba(var(--color-inverse-rgb),.3);--scrollbar-hover-bg:rgba(var(--color-inverse-rgb),.4);--scrollbar-drag-bg:rgba(var(--color-inverse-rgb),.5);--scrollbar-radius:var(--radius-sm);--scrollbar-duration:.7s}::-webkit-scrollbar{height:var(--scrollbar-size);width:var(--scrollbar-size)}::-webkit-scrollbar-track{background:var(--scrollbar-bg);box-shadow:var(--scrollbar-shadow);-webkit-transition:background-color var(--scrollbar-duration);transition:background-color var(--scrollbar-duration)}::-webkit-scrollbar-track:hover,:hover::-webkit-scrollbar-track{background:var(--scrollbar-hover-bg)}::-webkit-scrollbar-thumb{background:var(--scrollbar-bar-bg);border-radius:var(--scrollbar-radius);min-height:var(--scrollbar-size);-webkit-transition:var(--scrollbar-duration);transition:var(--scrollbar-duration);-webkit-transition-property:background-color;transition-property:background-color}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-hover-bg)}::-webkit-scrollbar-thumb:active{background:var(--scrollbar-drag-bg)}@-moz-document url-prefix(){.scrollbar-thin{scrollbar-width:thin}}.scrollbar-thin::-webkit-scrollbar{height:calc(var(--scrollbar-size)/2);width:calc(var(--scrollbar-size)/2)}.scrollbar-hover::-webkit-scrollbar,.scrollbar-hover::-webkit-scrollbar-thumb,.scrollbar-hover::-webkit-scrollbar-track{visibility:hidden}.scrollbar-hover:hover::-webkit-scrollbar,.scrollbar-hover:hover::-webkit-scrollbar-thumb,.scrollbar-hover:hover::-webkit-scrollbar-track{visibility:visible}@font-face{font-family:ZentaoIcon;font-style:normal;font-weight:400;src:url(./icons/ZentaoIcon.eot?v=1.72);src:url(./icons/ZentaoIcon.woff?v=1.72) format("woff"),url(./icons/ZentaoIcon.ttf?v=1.72) format("truetype"),url(./icons/ZentaoIcon.svg?v=1.72#regular) format("svg")}.icon,[class*=" icon-"],[class^=icon-]{display:inline-block;font-display:block;font-family:ZentaoIcon;font-size:14px;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{display:inline-block;min-width:14px;text-align:center}.icon-xs:before{font-size:.7em}.icon-sm:before{font-size:.8em}.icon-lg:before{font-size:1.25em;vertical-align:-10%}.icon-2x{font-size:28px}.icon-3x{font-size:42px}.icon-4x{font-size:56px}.icon-5x{font-size:70px}.icon-run{position:relative}.icon-run:before{opacity:.5}.icon-run:after{bottom:0;content:"\ea07";display:block;left:0;position:absolute;right:0;text-align:center;top:0}.icon-docspace:before{content:"\ea1b"}.icon-doclib:before{content:"\ea1c"}.icon-guihua:before{content:"\ea02"}.icon-memory:before{content:"\e9fd"}.icon-cpu:before{content:"\e9fe"}.icon-pause-pure:before{content:"\e9ff"}.icon-exclamation-pure:before{content:"\ea00"}.icon-zentao:before{content:"\e901"}.icon-zentao-alt:before{content:"\e900"}.icon-safe:before{content:"\ea06"}.icon-ai:before{content:"\e983"}.icon-kanban:before{content:"\e997"}.icon-college:before{content:"\e9c8"}.icon-home:before,.icon-menu-my:before{content:"\e97a"}.icon-program:before{content:"\e9aa"}.icon-lightbulb-alt:before,.icon-product:before{content:"\e98f"}.icon-project:before,.icon-rocket:before{content:"\e99c"}.icon-run:before{content:"\e9a9"}.icon-run-alt:before{content:"\ea07"}.icon-test:before{content:"\e956"}.icon-devops:before,.icon-infinite:before{content:"\e9a3"}.icon-doc:before,.icon-menu-doc:before{content:"\e99b"}.icon-statistic:before{content:"\e999"}.icon-group:before,.icon-menu-users:before,.icon-persons:before,.icon-team:before{content:"\e97e"}.icon-assets:before,.icon-diamond:before{content:"\e9ae"}.icon-flow:before{content:"\e994"}.icon-backend:before,.icon-cog-outline:before{content:"\ea05"}.icon-help:before{content:"\e968"}.icon-download:before,.icon-import:before{content:"\e904"}.icon-export:before{content:"\e905"}.icon-lightbulb:before{content:"\e91c"}.icon-close:before{content:"\e936"}.icon-check:before{content:"\e5ca"}.icon-minus:before{content:"\e926"}.icon-expand-alt:before{content:"\e6f1"}.icon-collapse-alt:before{content:"\e6f2"}.icon-fullscreen:before{content:"\e96b"}.icon-star-empty:before{content:"\e94a"}.icon-star:before{content:"\e94b"}.icon-exclamation-sign:before{content:"\e930"}.icon-info-sign:before{content:"\e9d5"}.icon-flag:before{content:"\e937"}.icon-check-circle:before{content:"\e92f"}.icon-check-sign:before{content:"\e938"}.icon-chart-pie:before{content:"\e95b"}.icon-history:before{content:"\e95f"}.icon-pencil:before{content:"\e254"}.icon-search:before{content:"\e928"}.icon-restart:before{content:"\e95e"}.icon-cog:before{content:"\e93b"}.icon-chart-line:before{content:"\e95c"}.icon-bar-chart:before,.icon-chart-bar:before{content:"\e95d"}.icon-exchange:before{content:"\e927"}.icon-severity:before{content:"\e973"}.icon-book:before{content:"\f02d"}.icon-treemap-alt:before{content:"\e971"}.icon-severity-solid:before{content:"\e902"}.icon-chat-line:before{content:"\e998"}.icon-stack:before{content:"\e943"}.icon-cube:before{content:"\e967"}.icon-minus-sign:before{content:"\e939"}.icon-bars-sign:before{content:"\e93a"}.icon-chat:before,.icon-message:before{content:"\e940"}.icon-more:before{content:"\e744"}.icon-certificate:before{content:"\f0a3"}.icon-bell:before{content:"\e7f5"}.icon-columns:before{content:"\f0db"}.icon-envelope-o:before{content:"\e92a"}.icon-unfold-all:before{content:"\e931"}.icon-fold-all:before{content:"\e932"}.icon-bars:before{content:"\e948"}.icon-cards-view:before{content:"\e949"}.icon-ellipsis-v:before{content:"\e5d4"}.icon-spinner-indicator:before{content:"\e982"}.icon-up-circle:before{content:"\e92b"}.icon-right-circle:before{content:"\e92c"}.icon-down-circle:before{content:"\e92d"}.icon-left-circle:before{content:"\e92e"}.icon-angle-double-right:before{content:"\f101"}.icon-angle-down:before{content:"\e313"}.icon-angle-left:before{content:"\e314"}.icon-angle-right:before{content:"\e315"}.icon-angle-top:before{content:"\e316"}.icon-first-page:before{content:"\e5dc"}.icon-last-page:before{content:"\e5dd"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.icon-sort:before{content:"\f0dc"}.icon-sort-down:before{content:"\f0dd"}.icon-sort-up:before{content:"\f0de"}.icon-arrow-up:before{content:"\e923"}.icon-arrow-down:before{content:"\e924"}.icon-arrow-left:before{content:"\e952"}.icon-arrow-right:before{content:"\e93e"}.icon-chevron-left:before{content:"\e934"}.icon-chevron-right:before{content:"\e935"}.icon-chevron-double-up:before{content:"\e959"}.icon-chevron-double-down:before{content:"\e95a"}.icon-folder-account:before{content:"\e942"}.icon-folder-move:before{content:"\e960"}.icon-folder-plus:before{content:"\e961"}.icon-folder-upload:before{content:"\e962"}.icon-folder-star:before{content:"\e963"}.icon-folder-edit:before{content:"\e964"}.icon-folder-download:before{content:"\e965"}.icon-folder-outline:before{content:"\e966"}.icon-folder:before{content:"\e944"}.icon-folder-o:before{content:"\e945"}.icon-folder-open-o:before{content:"\e946"}.icon-folder-open:before{content:"\e947"}.icon-color:before{content:"\e93c"}.icon-paper-clip:before{content:"\e93d"}.icon-text:before{content:"\e929"}.icon-share:before{content:"\f064"}.icon-format-list-bulleted:before{content:"\e9a8"}.icon-format-bold:before{content:"\e953"}.icon-format-header-pound:before{content:"\e954"}.icon-format-italic:before{content:"\e955"}.icon-format-list-numbers:before{content:"\e969"}.icon-format-quote-close:before{content:"\e96a"}.icon-image:before{content:"\e96c"}.icon-table-large:before{content:"\e96d"}.icon-productplan:before{content:"\e9fc"}.icon-aiux:before{content:"\e99e"}.icon-qc:before{content:"\e986"}.icon-qc-q:before{content:"\e985"}.icon-qc-c:before{content:"\e987"}.icon-sonarqube:before{content:"\e9ba"}.icon-board:before{content:"\ea15"}.icon-market:before{content:"\ea01"}.icon-ztool:before{content:"\e9c1"}.icon-contacts:before{content:"\e9c3"}.icon-chats:before{content:"\e9c4"}.icon-ops:before{content:"\e903"}.icon-menu-backend:before{content:"\e993"}.icon-feedback:before{content:"\e991"}.icon-oa:before{content:"\e9a1"}.icon-more-circle:before{content:"\e988"}.icon-controls:before{content:"\e995"}.icon-account:before{content:"\e992"}.icon-about:before,.icon-info:before{content:"\e996"}.icon-exclamation:before{content:"\e9fa"}.icon-exit:before{content:"\e99a"}.icon-theme:before{content:"\e9a0"}.icon-globe:before,.icon-lang:before{content:"\f0ac"}.icon-template:before{content:"\e9fb"}.icon-seal:before{content:"\e9f8"}.icon-menu-arrow-left:before{content:"\e9f0"}.icon-menu-arrow-right:before{content:"\e9f1"}.icon-add-directory:before{content:"\e9ef"}.icon-design:before{content:"\e9ec"}.icon-download-alt:before{content:"\e9ea"}.icon-blame:before{content:"\e9e0"}.icon-draft-edit:before{content:"\e9dc"}.icon-sub-review-user:before{content:"\e9db"}.icon-sub-review:before{content:"\e9df"}.icon-ztf:before{content:"\e9dd"}.icon-save:before{content:"\e9d8"}.icon-list-box:before{content:"\e9b4"}.icon-usecase:before{content:"\e99d"}.icon-code:before{content:"\e990"}.icon-summary:before{content:"\e9ad"}.icon-more-alt:before{content:"\e9a7"}.icon-customer:before{content:"\e9d9"}.icon-alarm:before{content:"\ea16"}.icon-treeview:before{content:"\ea0d"}.icon-or:before{content:"\ea0b"}.icon-manager:before{content:"\ea0c"}.icon-target:before{content:"\ea0a"}.icon-ipd:before{content:"\e9f9"}.icon-wiki-lib:before{content:"\e9f5"}.icon-annex-lib:before{content:"\e9f6"}.icon-interface-lib:before{content:"\e9f7"}.icon-has-authority-pack:before{content:"\e9f3"}.icon-without-authority-pack:before{content:"\e9f4"}.icon-data-structure:before{content:"\e9f2"}.icon-waterfallplus:before{content:"\e9ed"}.icon-agileplus:before{content:"\e9ee"}.icon-horn:before{content:"\e9eb"}.icon-resume:before{content:"\e9e9"}.icon-mirror:before{content:"\e9e6"}.icon-remote:before{content:"\e9e7"}.icon-moon:before{content:"\e9e8"}.icon-ticket:before{content:"\e9e1"}.icon-gantt-alt:before{content:"\e9e2"}.icon-tree:before{content:"\e9c9"}.icon-list:before{content:"\e9cb"}.icon-gantt:before{content:"\e9cc"}.icon-group-view:before{content:"\e9cd"}.icon-inherit-space:before{content:"\e9c2"}.icon-card-archive:before{content:"\e9b8"}.icon-col-archive:before{content:"\e9b9"}.icon-col-add-right:before{content:"\e9bb"}.icon-col-add-left:before{content:"\e9bc"}.icon-col-split:before{content:"\e9bd"}.icon-waterfall:before{content:"\e9a4"}.icon-manual:before{content:"\e98d"}.icon-lane:before{content:"\e9b1"}.icon-analyze:before{content:"\ea1e"}.icon-var-x:before{content:"\ea1d"}.icon-mobile:before{content:"\ea18"}.icon-clear:before{content:"\ea19"}.icon-db:before{content:"\ea17"}.icon-unpinned:before{content:"\ea08"}.icon-pinned:before{content:"\ea09"}.icon-support-ticket:before{content:"\ea04"}.icon-snap-house:before{content:"\e9e3"}.icon-wrench:before{content:"\e9e4"}.icon-desktop:before{content:"\e9e5"}.icon-back-circle:before{content:"\e9da"}.icon-back:before{content:"\e9d3"}.icon-shield:before{content:"\e9ca"}.icon-meh:before{content:"\e9ce"}.icon-frown:before{content:"\e9cf"}.icon-smile:before{content:"\e9d0"}.icon-unlock-solid:before{content:"\e9d1"}.icon-lock-solid:before{content:"\e9d2"}.icon-ver:before{content:"\e9c6"}.icon-publish:before,.icon-send:before{content:"\e9c7"}.icon-tag:before{content:"\e9be"}.icon-tag-lock:before{content:"\e9bf"}.icon-code-fork:before{content:"\f126"}.icon-branch-lock:before{content:"\e9c0"}.icon-groups:before{content:"\e9af"}.icon-thumbs-up:before{content:"\f087"}.icon-thumbs-down:before{content:"\f088"}.icon-thumbs-up-solid:before{content:"\e9d6"}.icon-thumbs-down-solid:before{content:"\e9d7"}.icon-hash:before,.icon-version:before{content:"\e9ab"}.icon-p-square:before{content:"\e97b"}.icon-video-play:before{content:"\e97f"}.icon-plus-solid-circle:before{content:"\e974"}.icon-minuse-solid-circle:before{content:"\e9b6"}.icon-s:before{content:"\e975"}.icon-c:before{content:"\e976"}.icon-t:before{content:"\e977"}.icon-guide:before{content:"\e978"}.icon-todo:before{content:"\e979"}.icon-plus:before{content:"\e925"}.icon-side-left:before{content:"\e9b3"}.icon-side-right:before{content:"\e9b2"}.icon-fullscreen-exit:before{content:"\e972"}.icon-alert:before{content:"\e99f"}.icon-undo:before{content:"\e93f"}.icon-redo:before{content:"\e9d4"}.icon-swap:before{content:"\e9b0"}.icon-chat-solid:before{content:"\e9b5"}.icon-clock:before{content:"\e97c"}.icon-cost:before{content:"\e97d"}.icon-pencil-alt:before{content:"\e984"}.icon-size-height:before{content:"\e9c5"}.icon-upload-file:before{content:"\ea03"}.icon-file-log:before{content:"\e9de"}.icon-rich-text:before{content:"\e913"}.icon-markdown:before{content:"\e916"}.icon-excel:before{content:"\e933"}.icon-text-link:before{content:"\e94d"}.icon-ppt:before{content:"\e957"}.icon-word:before{content:"\e958"}.icon-doc-lib:before{content:"\e96f"}.icon-file-empty:before,.icon-file:before{content:"\f016"}.icon-file-text:before{content:"\f0f6"}.icon-file-alt:before{content:"\f15b"}.icon-file-text-alt:before{content:"\f15c"}.icon-file-pdf:before{content:"\f1c1"}.icon-file-word:before{content:"\f1c2"}.icon-file-excel:before{content:"\f1c3"}.icon-file-powerpoint:before{content:"\f1c4"}.icon-file-image:before{content:"\f1c5"}.icon-file-archive:before{content:"\f1c6"}.icon-file-audio:before{content:"\f1c7"}.icon-file-video:before{content:"\f1c8"}.icon-file-code:before{content:"\f1c9"}.icon-multi-input:before{content:"\ea1a"}.icon-cell-input:before{content:"\ea0e"}.icon-input:before{content:"\ea0f"}.icon-checkbox:before{content:"\ea10"}.icon-radio:before{content:"\ea11"}.icon-transition:before{content:"\ea12"}.icon-add-sub-chapter:before{content:"\ea13"}.icon-add-chapter:before{content:"\ea14"}.icon-menu-collapse:before{content:"\e980"}.icon-menu-expand:before{content:"\e981"}.icon-estimate:before{content:"\e9ac"}.icon-sprint:before{content:"\e9a2"}.icon-shield-check:before{content:"\e9a5"}.icon-ok:before{content:"\e9a6"}.icon-printer:before{content:"\e906"}.icon-bullhorn:before{content:"\e910"}.icon-person:before{content:"\e941"}.icon-fields:before{content:"\e989"}.icon-trigger:before{content:"\e98a"}.icon-layout:before{content:"\e98b"}.icon-audit:before{content:"\e98c"}.icon-ban-circle:before,.icon-cancel:before{content:"\e951"}.icon-eye:before{content:"\e94e"}.icon-eye-off:before{content:"\e96e"}.icon-unlock:before{content:"\e94f"}.icon-lock:before,.icon-private:before{content:"\e950"}.icon-move:before{content:"\e94c"}.icon-hand-right:before{content:"\e907"}.icon-checked:before{content:"\e908"}.icon-off:before{content:"\e909"}.icon-play:before,.icon-start:before{content:"\e90a"}.icon-time:before{content:"\e90b"}.icon-edit:before{content:"\e90c"}.icon-trash:before{content:"\e90d"}.icon-link:before{content:"\e90e"}.icon-unlink:before{content:"\e90f"}.icon-bug:before{content:"\e911"}.icon-list-alt:before{content:"\e912"}.icon-alter:before,.icon-change:before{content:"\e970"}.icon-glasses:before,.icon-review:before{content:"\e914"}.icon-sitemap:before,.icon-testcase:before{content:"\e915"}.icon-pluses:before{content:"\e917"}.icon-report-list:before{content:"\e918"}.icon-active:before,.icon-magic:before{content:"\e919"}.icon-treemap:before{content:"\e91a"}.icon-confirm:before{content:"\e91b"}.icon-split:before{content:"\e98e"}.icon-calendar:before,.icon-delay:before{content:"\e91d"}.icon-pause:before{content:"\e91e"}.icon-ban:before{content:"\e91f"}.icon-plus-bold:before{content:"\e920"}.icon-copy:before{content:"\e921"}.icon-refresh:before{content:"\e922"}.icon-diff:before{content:"\e9b7"}.status-active,.status-asked,.status-normal,.status-unconfirmed,.status-wait{color:var(--color-status-normal,#313c52)}.status-active.status-issue,.status-checking,.status-commenting,.status-confirmed,.status-doing{color:#ff6f42}.status-blocked,.status-hangup,.status-pause,.status-suspended{color:#b89664}.status-clarify,.status-draft{color:#8166ee}.status-noreview,.status-reviewing,.status-wait.status-testcase{color:#18a6fd}.status-active.status-risk,.status-changed,.status-changing,.status-fail{color:#fb2b2b}.status-checked,.status-done,.status-pass,.status-replied,.status-resolved,.status-success{color:#0dbb7d}.status-cancel,.status-canceled,.status-investigate{color:var(--color-status-cancel,#838a9d)}.status-closed,.status-testtask.status-done{color:var(--color-status-closed,#9ea3b0)}.dark{--color-status-normal:#eff1f3;--color-status-cancel:#9ea3b0;--color-status-closed:#838a9d}@media (prefers-color-scheme:dark){.dark-auto{--color-status-normal:#eff1f3;--color-status-cancel:#9ea3b0;--color-status-closed:#838a9d}}.pri,[class*=" pri-"],[class^=pri-]{border-color:currentColor;border-radius:var(--radius-full);border-width:1px;display:inline-block;font-size:.75rem;height:1rem;line-height:1rem;line-height:14px;max-width:54px;min-width:16px;overflow:hidden;padding-left:.125rem;padding-right:.125rem;text-align:center;white-space:nowrap;--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.pri-1{color:rgb(255 73 18/var(--tw-text-opacity))}.pri-1,.pri-2{--tw-text-opacity:1}.pri-2{color:rgba(var(--color-warning-600-rgb),var(--tw-text-opacity))}.pri-3{color:rgb(59 130 246/var(--tw-text-opacity))}.pri-3,.pri-4{--tw-text-opacity:1}.pri-4{color:rgb(149 211 224/var(--tw-text-opacity))}.severity{display:inline-block;font-size:.75rem;height:1rem;line-height:1rem;line-height:14px;max-width:54px;min-width:16px;overflow:hidden;padding-left:.125rem;padding-right:.125rem;position:relative;text-align:center;white-space:nowrap;--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.severity:before{background-color:currentColor;background-repeat:no-repeat;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;--tw-content:attr(data-severity);content:var(--tw-content);-webkit-mask:url('data:image/svg+xml;charset=utf-8,');mask:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-size:100% 100%;mask-size:100% 100%}.severity:after,.severity:before{display:inline-block}.severity:after{--tw-scale-x:.75;--tw-scale-y:.75;content:attr(data-severity);line-height:20px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.severity[data-severity="1"]{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.severity[data-severity="2"]{--tw-text-opacity:1;color:rgb(249 115 22/var(--tw-text-opacity))}.severity[data-severity="3"]{--tw-text-opacity:1;color:rgb(250 174 26/var(--tw-text-opacity))}.severity[data-severity="4"]{--tw-text-opacity:1;color:rgb(184 150 100/var(--tw-text-opacity))}.severity[data-severity="5"]{--tw-text-opacity:1;color:rgb(158 163 176/var(--tw-text-opacity))}.severity-label{background-color:transparent}.severity-label:after,.severity-label:before{--tw-content:none;content:var(--tw-content)}.risk-high{color:rgb(220 38 38/var(--tw-text-opacity))}.risk-high,.risk-middle{--tw-text-opacity:1}.risk-middle{color:rgb(234 179 8/var(--tw-text-opacity))}.label.label-id{border-radius:var(--radius-full);flex:none;--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-300-rgb),var(--tw-ring-opacity));--label-bg:rgba(var(--color-canvas-rgb),.1)}.nav-feature{--nav-active-bg:var(--color-primary-100);--nav-active-color:var(--color-fore)}.nav-feature .nav-checkbox>.checkbox,.nav-feature .nav-checkbox>.checkbox-primary,.nav-feature .nav-item>a{align-items:center;border-radius:var(--radius);height:2rem;padding-left:.625rem;padding-right:.625rem}.nav-feature .nav-item>a>.icon{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.sortable-list .listitem{cursor:move;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-left:.5rem;padding-right:.5rem}.sortable-list .sortable-ghost>.listitem{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-50-rgb),var(--tw-bg-opacity))}.sortable-empty-shadow{height:1px!important;left:0!important;opacity:0!important;pointer-events:none!important;position:absolute!important;top:0!important;width:1px!important}.chevron-down,.chevron-left,.chevron-right,.chevron-up{align-items:center;display:inline-flex;height:1em;justify-content:center;position:relative;width:1em}.chevron-down:before,.chevron-left:before,.chevron-right:before,.chevron-up:before{display:block;height:.6923077em;transform-origin:center;width:.6923077em;--tw-translate-y:-0.125rem;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.chevron-left:before{--tw-translate-y:0px;--tw-translate-x:0.125rem;--tw-rotate:135deg}.chevron-left:before,.chevron-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-right:before{--tw-translate-y:0px;--tw-translate-x:-0.125rem;--tw-rotate:-45deg}.chevron-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.split{display:flex;flex-direction:row}.split-vert{flex-direction:column}.split-cell{min-height:0;min-width:0}.has-animation>.split-cell{transition-duration:.15s;transition-property:width,height;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter{align-items:stretch;border-radius:var(--radius);cursor:col-resize;display:flex;flex:none;flex-direction:row;justify-content:center;position:relative}.gutter-vert{cursor:row-resize;flex-direction:column}.gutter:before{display:block;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:"";content:var(--tw-content)}.gutter-horz:before{width:1px}.gutter-vert:before{height:1px}.gutter-horz:hover:before{width:75%}.gutter-vert:hover:before{height:75%}.gutter-resize-handler,.gutter-toggle{align-items:center;border-radius:var(--radius-lg);border-width:1px;display:flex;height:1.75rem;justify-content:center;margin-top:-.875rem;position:absolute;top:50%;width:.75rem;--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity));transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter-toggle>span{--tw-scale-x:.75;--tw-scale-y:.75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.gutter:hover .gutter-toggle{--tw-border-opacity:1;border-color:rgba(var(--color-gray-500-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.gutter .gutter-toggle:hover{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.is-last>.gutter-toggle{--tw-scale-x:-1}.is-first>.gutter-toggle,.is-last>.gutter-toggle{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.is-first>.gutter-toggle{--tw-scale-x:1}.gutter-vert .gutter-toggle{left:50%;margin-left:-.375rem;margin-top:0;top:auto;--tw-rotate:90deg}.gutter-vert .gutter-toggle,.gutter.is-next-collapsed>.gutter-toggle{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.gutter.is-next-collapsed>.gutter-toggle{--tw-scale-x:1}.gutter.is-prev-collapsed>.gutter-toggle{--tw-scale-x:-1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.gutter-horz.is-first.is-prev-collapsed{transform:translateX(calc(-1px - var(--split-gutter-size)/2))}.gutter-horz.is-last.is-next-collapsed{transform:translateX(calc(1px + var(--split-gutter-size)/2))}.gutter-vert.is-first.is-prev-collapsed{transform:translateY(calc(-1px - var(--split-gutter-size)/2))}.gutter-vert.is-last.is-next-collapsed{transform:translateY(calc(1px + var(--split-gutter-size)/2))}.gutter-resize-handler{background-color:transparent;border-width:0}.gutter-resize-handler:before{border-left-width:1px;border-right-width:1px;bottom:0;left:.25rem;position:absolute;right:.25rem;top:0;--tw-content:"";content:var(--tw-content)}:root{--avatar-radius:12.5%;--avatar-bg:var(--color-surface)}.avatar{align-items:center;aspect-ratio:1/1;background:var(--avatar-bg);border-radius:var(--avatar-radius);display:inline-flex;justify-content:center;overflow:hidden;width:2rem}.avatar>img{height:100%;margin:0;-o-object-fit:cover;object-fit:cover;width:100%}.avatar.size-xs{width:1.25rem}.avatar.size-sm,.avatar.size-xs{font-size:.75rem;line-height:1rem}.avatar.size-sm{width:1.5rem}.avatar.size-lg{font-size:1.5rem;line-height:2rem;width:3rem}.avatar.size-xl{font-size:2.25rem;line-height:2.5rem;width:5rem}.avatar-group{display:flex;gap:.625rem}.avatar-group>.avatar{box-shadow:0 0 0 1px var(--color-canvas)}.avatar-group>*+*{margin-left:-1rem}.avatar-group.size-xs>*+*{margin-left:-.75rem}.avatar-group.size-sm>*+*{margin-left:-.875rem}.avatar-group.size-lg>*+*{margin-left:-1.25rem}.avatar-group.size-xl>*+*{margin-left:-1.5rem}.btn-group{display:flex;gap:1px}.btn-group>.btn.active{z-index:1}.btn-group>.btn:focus-within,.btn-group>.btn:hover{z-index:2}.btn-group>.btn.disabled,.btn-group>.btn:disabled{z-index:0}.btn-group>.btn:not(:first-child){border-bottom-left-radius:var(--radius-none);border-left-color:rgba(var(--color-canvas-rgb),.2);border-left-width:1px;border-top-left-radius:var(--radius-none)}.btn-group>.btn:not(:first-child):before{left:-1px}.btn-group>.btn:not(:last-child){border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none)}.color-picker-heading{align-items:center;font-weight:700;justify-content:space-between;margin-bottom:-.25rem;padding:.5rem}.color-picker-heading,.color-picker-row{display:flex;flex-direction:row}.color-picker-row{flex-wrap:wrap;gap:.5rem;padding:.75rem}.color-picker-item{align-items:center;border-radius:var(--radius-full);display:flex;height:1.25rem;justify-content:center;padding-left:.125rem;padding-right:.125rem;width:1.25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.pick-container{left:0;pointer-events:none;position:absolute;top:0;z-index:1600}.pick-pop{display:flex;flex-direction:column;opacity:0;pointer-events:auto;position:absolute;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);z-index:1200}.pick-pop.in{opacity:1}.date-picker-menu{--menu-bg:none}.date-picker-menu .mini-calendar{margin-top:-.75rem}.date-pick-menu-month,.date-pick-menu-years{display:flex;flex-direction:row;flex-wrap:wrap;gap:1px;max-height:237px;padding-bottom:.5rem;padding-left:.5rem;padding-right:.5rem}.date-pick-menu-years>.btn{width:2.5rem}.date-pick-menu-years>.btn.is-current{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.date-pick-menu-month>.btn.active,.date-pick-menu-years>.btn.active{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.date-pick-menu-month>.btn{width:3rem}.date-picker-menu-footer{border-top-width:1px;display:flex;flex-direction:row;padding:.25rem}.date-picker-menu-footer>.toolbar{flex:1 1 auto;justify-content:center}.date-picker-menu>.menu{border-right-width:1px}.date-picker-menu .menu-item{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.time-picker-menu{max-height:inherit}.time-picker-menu .menu-item>a{justify-content:center;padding-left:0;padding-right:0;text-align:center}.datetime-picker-menu{max-height:inherit}.mini-calendar{padding:.5rem}.mini-calendar>.row>.col{align-items:center;justify-content:center;width:14.2857%}.mini-calendar-day{height:2rem}.mini-calendar-day.disabled{pointer-events:none;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-200-rgb),var(--tw-bg-opacity));opacity:.5}.mini-calendar-day>.btn{width:2rem}.mini-calendar-day.is-weekend>.btn{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.mini-calendar-day.active>.btn,.mini-calendar-day.is-today>.btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.mini-calendar-day.selected>.btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.mini-calendar-day.is-out-month{opacity:.5}.i-time{border-color:currentColor;border-radius:50%;border-width:.08em;display:inline-block;height:1em;position:relative;width:1em}.i-time:after{border-color:currentColor;border-width:0 0 .08em .08em;height:.385em;left:.3846em;position:absolute;top:.08em;width:.385em;--tw-content:"";content:var(--tw-content)}.i-calendar{border-radius:2px;display:inline-block;height:.79em;margin-top:.16em;position:relative;width:1em}.i-calendar,.i-calendar:after,.i-calendar:before{border-color:currentColor;border-width:.08em}.i-calendar:after,.i-calendar:before{position:absolute;--tw-content:"";content:var(--tw-content)}.i-calendar:before{border-bottom-width:0;left:.15em;top:.307em;width:.6em}.i-calendar:after{border-bottom-width:0;border-top-width:0;height:.3077em;left:.17em;top:-.154em;width:.538em}:root{--modal-radius:var(--radius-lg);--modal-bg:rgba(var(--color-inverse-rgb),.4);--modal-sm:37.5rem;--modal-base:50rem;--modal-lg:75rem;--modal-xl:90rem}.modal{align-items:center;background-color:var(--modal-bg);bottom:0;display:none;justify-content:center;left:0;overflow:hidden;position:fixed;right:0;top:0;z-index:1500}.modal.load-indicator:before{background-color:transparent;transition-property:none}.modal.loading:after{--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.modal.loading .modal-dialog{opacity:0!important}.modal.show{display:flex}.modal-no-backdrop{background-color:transparent;pointer-events:none}.modal-hide{opacity:0!important}.modal-dialog{background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));pointer-events:auto;position:relative;--tw-bg-opacity:0.9;--tw-shadow:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--tw-shadow-colored:0 10px 50px -10px var(--tw-shadow-color),0 8px 20px -10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);border-radius:var(--modal-radius);width:var(--modal-base)}.modal-content,.modal-dialog{max-height:100vh}.modal-content{display:flex;flex-direction:column;height:100%}.loading>.modal-dialog>.modal-content{opacity:0;visibility:hidden}.modal-dialog.loading{background-color:transparent}.modal-dialog.loading>.modal-content{display:none}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.modal-header{align-items:center;display:flex;flex:none;flex-wrap:nowrap;gap:1rem;padding:1rem 1.25rem;position:relative}.modal-title{flex:1 1 auto;font-size:1rem;font-weight:700;line-height:1.5rem}.modal-actions{position:absolute;right:.75rem;top:.75rem;z-index:15}.modal-body{flex:1 1 auto;overflow:auto;padding:1rem 1.25rem}.modal-footer{align-items:center;display:flex;flex:none;gap:.75rem;padding:1.25rem}.modal-dialog.size-full,.modal-dialog[data-size=full]{border-radius:var(--radius-none);height:100vh;width:100vw}.modal-dialog.size-sm,.modal-dialog[data-size=sm]{width:var(--modal-sm)}.modal-dialog.size-lg,.modal-dialog[data-size=lg]{width:var(--modal-lg)}.modal-dialog.size-xl,.modal-dialog[data-size=xl]{width:var(--modal-xl)}.modal-iframe{flex:1 1 auto;width:100%}.modal-trans{opacity:0;transition-duration:.2s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.modal-trans.in{opacity:1}.modal-trans>.modal-dialog{transition-property:transform,opacity;--tw-scale-x:.95;--tw-scale-y:.95;opacity:0;transition-duration:.3s}.modal-trans.in>.modal-dialog,.modal-trans>.modal-dialog{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-trans.in>.modal-dialog{--tw-scale-x:1;--tw-scale-y:1;opacity:1}.modal-alert .modal-footer{justify-content:flex-end}.modal-alert .modal-header{margin-bottom:-1rem}.modal-alert .modal-body{overflow-wrap:break-word;white-space:pre-line}.modal-alert .modal-actions+.modal-body{padding-right:3rem}.modal-alert .modal-header+.modal-actions+.modal-body{padding-right:1.25rem}.file-selector{gap:.5rem;width:100%}.file-selector,.file-selector-box{display:flex;flex-direction:column}.file-selector-box{border-style:dashed;border-width:1px;gap:0;height:auto;justify-content:center;position:relative;--tw-border-opacity:1;background-color:rgba(var(--color-primary-50-rgb),.3);border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));padding:.5rem .75rem;--tw-ring-color:transparent;--state-color:rgba(var(--color-primary-500-rgb),.05)}.file-selector-box .text{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.is-dragging .file-selector-box{border-style:solid}.file-selector-btn{align-items:center;display:flex;gap:.5rem;position:relative}.is-dragging .file-selector-btn{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.file-selector-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;bottom:0;cursor:pointer;left:0;opacity:.1;position:absolute;right:0;top:0}.file-selector-tip{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.file-selector.is-mode-button{flex-direction:column-reverse}.file-selector-list.is-empty{display:none}.file-selector-item .item-avatar{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.file-selector-item .item-subtitle{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.file-selector-item .item-content{flex:none;margin-right:.25rem;max-width:100%}.file-selector-item>.listitem:hover{background-color:rgba(var(--color-gray-500-rgb),.05)}.file-selector-item.is-renaming .item-avatar+.item-content{max-width:calc(100% - 32px)}.file-selector-rename-text{max-width:100%;min-width:100px;position:relative}.file-selector-rename-text>div{overflow:hidden;pointer-events:none;visibility:hidden;white-space:nowrap}.file-selector-rename-input{bottom:0;left:0;position:absolute;right:0;top:0}.file-selector-grid{align-items:flex-start;border-color:transparent;border-radius:var(--radius);border-width:1px;display:flex;flex-direction:row;flex-wrap:wrap;gap:var(--file-selector-grid-gap);--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity));padding:.5rem}.file-selector-grid-item{height:var(--file-selector-grid-height)}.file-selector-grid-btn,.file-selector-grid-item{width:var(--file-selector-grid-width)}.file-selector-grid-btn{aspect-ratio:1/1;border-style:dashed;border-width:1px;display:flex;flex-direction:column;gap:0;height:auto;justify-content:center;--tw-border-opacity:1;background-color:rgba(var(--color-primary-50-rgb),.3);border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));padding:.5rem;--tw-ring-color:transparent;--state-color:rgba(var(--color-primary-500-rgb),.05)}.file-selector-grid-btn .text{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.file-selector-grid-item .listitem{flex-direction:column;height:100%;padding:0;position:relative;width:100%}.file-selector-grid-item .item-avatar{border-radius:var(--radius);border-width:1px;width:100%;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.file-selector-grid-item .item-avatar.has-icon>.icon{font-size:calc(var(--file-selector-grid-width)/2)}.file-selector-grid-item .item-content,.file-selector-grid-item .toolbar{aspect-ratio:1/1;left:0;position:absolute;right:0;top:0;width:100%}.file-selector-grid-item .item-title{bottom:-1.25rem;font-size:.75rem;left:0;line-height:1rem;overflow:hidden;position:absolute;right:1.5rem;white-space:nowrap}.file-selector-grid-item .item-subtitle{border-radius:var(--radius-full);bottom:.25rem;left:.25rem;position:absolute;--tw-bg-opacity:1;background-color:rgba(var(--color-fore-rgb),var(--tw-bg-opacity));font-size:.75rem;line-height:1rem;padding-left:.25rem;padding-right:.25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.file-selector-grid-item:hover .item-subtitle{opacity:1}.file-selector-grid-item .toolbar .btn[data-remove-file]{background-color:rgba(var(--color-inverse-rgb),.5);padding:.375rem;position:absolute;right:1px;top:1px;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.file-selector-grid-item .toolbar .btn[data-rename-file]{bottom:-1.5rem;padding:0;position:absolute;right:0}.file-selector-grid .file-selector-rename{bottom:0;height:1.5rem;position:absolute;top:auto}.file-selector-grid .file-selector-rename-text{width:100%}.is-dragging .file-selector-grid{border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-primary-400-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}:root{--nav-radius:var(--radius);--nav-active-color:var(--color-primary-500);--nav-active-bg:var(--color-inherit);--nav-heading-color:var(--color-gray-500);--nav-gap:0.25rem;--nav-item-color:inherit;--nav-item-bg:transparent;--nav-item-padding:1rem;--nav-item-height:2rem;--nav-item-gap:0.75rem;--nav-divider-height:calc(var(--nav-item-height)/2);--nav-divider-margin:0.5rem}.nav{list-style-type:none;padding-left:0}.nav,.nav-item{align-items:center;display:flex;position:relative}.nav-item{gap:var(--nav-item-gap)}.nav-item>a{align-items:center;background-color:var(--nav-item-bg);color:var(--nav-item-color);cursor:pointer;display:flex;gap:var(--nav-gap);height:var(--nav-item-height);justify-content:center;padding-left:var(--nav-item-padding);padding-right:var(--nav-item-padding)}.nav-item>a>.text{white-space:nowrap}.nav-item>.active{font-weight:700;--nav-item-color:var(--nav-active-color);--nav-item-bg:var(--nav-active-bg)}.nav-item>.selected{--nav-item-color:var(--nav-selected-color);--nav-item-bg:var(--nav-selected-bg)}.nav-item>.disabled{--nav-item-color:var(--nav-disabled-color);--nav-item-bg:var(--nav-disabled-bg)}.nav-item>.disabled>*{opacity:var(--opacity-disabled)}.nav-divider,.nav>.divider{align-self:center;height:var(--nav-divider-height);margin-left:var(--nav-divider-margin);margin-right:var(--nav-divider-margin)}.nav-heading{align-items:center;color:var(--nav-heading-color);display:flex;font-weight:700;gap:.25rem;height:2rem;justify-content:center;padding-left:1rem;padding-right:1rem}.nav-space{flex:1 1 auto;width:1rem}.nav-compact{--nav-gap:0.25rem;--nav-item-gap:0.5rem;--nav-item-height:1.75rem;--nav-item-padding:0.5rem;--nav-divider-margin:0.25rem}.nav-primary>.nav-item{position:relative}.nav-primary>.nav-item:hover{z-index:10}.nav-primary>.nav-item+.nav-item{margin-left:-1px}.nav-primary>.nav-item>a{border-radius:var(--radius-none);border-width:1px}.nav-primary>.nav-item:first-child>a,.nav-primary>.nav-item:has(.nav-heading)+.nav-item>a{border-bottom-left-radius:var(--nav-radius);border-top-left-radius:var(--nav-radius)}.nav-primary>.nav-item:last-child>a{border-bottom-right-radius:var(--nav-radius);border-top-right-radius:var(--nav-radius)}.nav-primary>.nav-item>.active{--tw-text-opacity:1;background:var(--nav-active-color);border-color:var(--nav-active-color);color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.nav-primary>.nav-divider{display:none}.nav-secondary>.nav-item>a{border-radius:var(--radius-none);position:relative}.nav-secondary>.nav-item>a:after{bottom:-2px;display:block;height:2px;left:0;position:absolute;right:0;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}.nav-secondary>.nav-item>.active:after{background-color:currentColor}.nav-secondary>.nav-divider{margin:0 0 0 -1px}.nav-tabs>.nav-item>a{border-bottom-left-radius:var(--radius-none);border-bottom-right-radius:var(--radius-none);position:relative}.nav-tabs>.nav-item>a:after{border-color:transparent;border-width:1px;bottom:-1px;display:block;left:-1px;pointer-events:none;position:absolute;right:-1px;top:-1px;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-content:"";border-top-left-radius:inherit;border-top-right-radius:inherit;content:var(--tw-content)}.nav-tabs>.nav-item>.active:after{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-bottom-color:transparent}.nav-tabs>.nav-divider{margin:0 0 0 -1px}.nav-pills>.nav-item>a{border-radius:var(--radius-full)}.nav-pills>.nav-item>.active{--tw-text-opacity:1;background:var(--nav-active-color);border-color:var(--nav-active-color);color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.nav-steps{--nav-item-bg:var(--color-canvas);--nav-active-bg:var(--color-primary-500);--nav-active-color:var(--color-canvas);--nav-selected-bg:var(--color-secondary-500);--nav-selected-color:var(--color-canvas)}.nav-steps>.nav-item+.nav-item>a{padding-left:calc(var(--nav-item-padding) + var(--nav-item-height)/3)}.nav-steps>.nav-item>a:after,.nav-steps>.nav-item>a:before{border-style:solid;height:0;left:100%;position:absolute;width:0;z-index:2;--tw-content:"";border-color:transparent;border-left-color:var(--nav-item-bg,var(--color-canvas));border-width:calc(var(--nav-item-height)/2);border-left-width:calc(var(--nav-item-height)/3);border-right-width:0;content:var(--tw-content)}.nav-steps>.nav-item>a:before{background-color:transparent!important;border-left-color:var(--color-border);bottom:auto;left:calc(100% + 5.5px);opacity:1!important;right:auto;top:.4rem;transform:none;z-index:1;--nav-item-height:1.2rem}.nav-steps>.nav-item:has(+.nav-item>.active)>.selected:before,.nav-steps>.nav-item:has(+.nav-item>.active,+.nav-item>.selected)>a:not(.active,.selected):before,.nav-steps>.nav-item:has(+.nav-item>.selected)>.active:before,.nav-steps>.nav-item:last-child>a:after,.nav-steps>.nav-item:last-child>a:before{display:none}.nav-steps>.nav-item>a:hover{--nav-item-bg:var(--color-gray-100)}.nav-steps>.nav-item>.active:hover{--nav-item-bg:var(--color-primary-600)}.nav-steps>.nav-item>.selected:hover{--nav-item-bg:var(--color-secondary-600)}.nav-stacked{flex-direction:column}.nav-stacked>.nav-item{width:100%}.nav-stacked>.nav-heading,.nav-stacked>.nav-item>a{justify-content:flex-start;width:100%}.nav-stacked>.nav-divider{height:1px;margin:.5rem 0;width:100%}.nav-primary.nav-stacked>.nav-item>a{height:2.5rem}.nav-primary.nav-stacked>.nav-item+.nav-item{margin-left:0;margin-top:-1px}.nav-primary.nav-stacked>.nav-item:first-child>a{border-bottom-left-radius:0;border-top-left-radius:var(--nav-radius);border-top-right-radius:var(--nav-radius)}.nav-primary.nav-stacked>.nav-item:last-child>a{border-bottom-left-radius:var(--nav-radius);border-bottom-right-radius:var(--nav-radius);border-top-right-radius:0}.nav-secondary.nav-stacked>.nav-item>a:after{bottom:0;height:100%;left:auto;right:0;top:0;width:2px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity))}.nav-secondary.nav-stacked>.nav-item>.active:after{background-color:currentColor}.nav-secondary.nav-stacked>.nav-divider{margin:0}.nav-tabs.nav-stacked>.nav-item>a{border-bottom-left-radius:var(--nav-radius);border-bottom-right-radius:var(--radius-none);border-top-right-radius:var(--radius-none);position:relative}.nav-tabs.nav-stacked>.nav-item>a:after{--tw-border-opacity:1;border-bottom-color:transparent;border-bottom-left-radius:inherit;border-right-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-top-left-radius:inherit}.nav-tabs.nav-stacked>.nav-item>a.active:after{--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));border-right-color:transparent}.nav-tabs.nav-stacked>.nav-divider{margin:0}.nav-pills.nav-stacked>.nav-item+.nav-item{margin-top:.25rem}.nav-justified>.nav-item:not(.flex-none,.nav-divider){flex:1 1 auto}.nav-justified>.nav-item>a{width:100%}.arrow,.arrow:before{background:inherit;height:calc(var(--arrow-size)*1.4142);position:absolute;width:calc(var(--arrow-size)*1.4142)}.arrow{visibility:hidden;--arrow-size:5px}.arrow:before{border:inherit;content:"";visibility:visible;--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.arrow-top,.arrow-up{border-bottom:inherit;border-right:inherit;border-width:1px 0 0 1px;top:calc(1px - var(--arrow-size))}.white>.arrow-top,.white>.arrow-up{top:calc(0px - var(--arrow-size))}.arrow-bottom,.arrow-down{border-left:inherit;border-top:inherit;border-width:0 1px 1px 0;bottom:calc(1px - var(--arrow-size))}.white>.arrow-bottom,.white>.arrow-down{bottom:calc(0px - var(--arrow-size))}.arrow-left{border-right:inherit;border-top:inherit;border-width:0 0 1px 1px;left:calc(1px - var(--arrow-size))}.white>.arrow-left{left:calc(0px - var(--arrow-size))}.arrow-right{border-bottom:inherit;border-left:inherit;border-width:1px 1px 0 0;right:calc(1px - var(--arrow-size))}.white>.arrow-right{right:calc(0px - var(--arrow-size))}.popover{display:none;left:0;position:absolute;top:0;width:-moz-max-content;width:max-content}.popover.show{display:block}.popover-heading{align-items:center;border-top-left-radius:inherit;border-top-right-radius:inherit;display:flex;gap:1rem;height:2.5rem;justify-content:space-between;position:relative;z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:.75rem;padding-right:.5rem}.popover-title{flex:1 1 auto;font-weight:700}.popover-content{padding:.75rem;position:relative;z-index:1}.popover-arrow{z-index:0}.has-heading>.popover-arrow.arrow-top,.has-heading>.popover-arrow.arrow-up{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.popover>.btn-close{position:absolute;right:.5rem;top:.625rem;z-index:2}.btn-close+.popover-content{padding-right:3rem}.btn.with-popover-show{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.with-popover-show[data-pop-placement=top]>.caret{--tw-rotate:180deg}.with-popover-show[data-pop-placement=left]>.caret,.with-popover-show[data-pop-placement=top]>.caret{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.with-popover-show[data-pop-placement=left]>.caret{--tw-rotate:90deg}.with-popover-show[data-pop-placement=right]>.caret{--tw-rotate:-90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pager{align-items:center;display:flex;gap:.25rem;white-space:nowrap}.menu.pager-size-menu{display:grid!important;grid-template-columns:repeat(3,minmax(0,1fr));text-align:center}.menu.pager-size-menu>.menu-item>a{margin:.125rem}.pager .pager-goto-group>.form-control{width:3rem}.pager .pager-goto-group>.input-group-addon{border-width:1px;--tw-border-opacity:1;border-color:rgba(var(--color-gray-300-rgb),var(--tw-border-opacity));--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.pager>.pager-nav.active{--tw-text-opacity:1;box-shadow:0 0 0 1px var(--color-primary-500);color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.panel{border-radius:var(--radius);overflow:hidden;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05}.panel-heading{background-color:var(--panel-heading-bg);flex-wrap:nowrap;gap:1rem;justify-content:space-between;padding:.5rem 1rem}.panel-heading,.panel-title{align-items:center;display:flex}.panel-title{font-weight:700;gap:.5rem;margin:0}.panel-actions{align-items:center;display:flex;margin-right:-.5rem}.panel-body{padding:.75rem 1rem}.panel-footer{align-items:center;background-color:var(--panel-footer-bg);display:flex;gap:.5rem;padding:.5rem 1rem}.size-sm .panel-body,.size-sm .panel-footer,.size-sm .panel-heading{padding:.375rem .75rem}.size-lg .panel-body,.size-lg .panel-footer,.size-lg .panel-heading{padding:1rem 1.25rem}.picker{position:relative}.picker-select{align-items:center;gap:.25rem;justify-content:space-between}.picker-select,.picker-select.form-control{display:flex}.picker-select-placeholder{flex:1 1 auto;--tw-text-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-text-opacity))}.picker-select-multi .picker-select-placeholder{padding-left:.25rem;padding-right:.25rem}.picker-single-selection{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap}.picker-deselect-btn{border-radius:var(--radius-full);padding:.25rem}.picker-deselect-btn:not(:hover){opacity:.7}.picker-select-multi.form-control{height:auto;min-height:32px;padding-left:.25rem}.picker-multi-selections{display:flex;flex-wrap:wrap;gap:.25rem;min-width:0}.picker-multi-selection{align-items:center;border-radius:var(--radius-full);border-width:1px;display:flex;max-width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:.5rem}.readonly .picker-multi-selection{padding-right:.5rem}.picker-multi-selection>.text{max-width:180px;min-width:0;overflow:clip;white-space:nowrap}.picker-no-search{cursor:default}.picker-menu-list{border-style:none;flex:1 1 auto;min-height:0;overflow-y:auto;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.picker-menu-search+.picker-menu-list.menu{margin-top:-.125rem;padding-top:0}.picker-menu-list.tree{padding:.5rem}.picker-menu-list .tree-item>.selected .item-content{font-weight:400}.picker-menu .search-menu-footer{border-top-width:1px;padding-bottom:.25rem;padding-top:.25rem}.picker-search-input{border-color:transparent;height:1.75rem;outline-width:0!important;padding-left:0;padding-right:2rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.picker-search{flex:none;position:relative;width:100%}.picker-search>.magnifier{opacity:.5;position:absolute;right:0;top:.5rem}.picker-search-clear.btn{cursor:pointer;height:1.25rem;position:absolute;right:0;top:.25rem;width:1.25rem}.picker-search.is-inline{min-width:64px;width:4rem}.is-inline>.picker-search-input{height:1.25rem;min-width:64px;padding-left:.25rem;padding-right:.25rem}.picker-search-measure{height:0;left:0;overflow:hidden;position:absolute;top:0;white-space:nowrap}.sidebar{flex:none!important;position:relative;--gutter-width:1px;--sidebar-duration:200ms}.has-sidebar-animation .sidebar{transition-duration:.15s;transition-duration:var(--sidebar-duration);transition-property:width,margin;transition-timing-function:cubic-bezier(.4,0,.2,1)}.sidebar-left.is-collapsed{margin-left:calc(var(--gutter-width)*-1)}.sidebar-right.is-collapsed{margin-right:calc(var(--gutter-width)*-1)}.sidebar.is-collapsed>*,.sidebar.is-expanded.is-animating>*{display:none}.sidebar.is-collapsed>.sidebar-gutter{display:flex!important}.sidebar-gutter{bottom:0;left:100%;position:absolute;top:0;width:var(--gutter-width);z-index:10}.sidebar-right>.sidebar-gutter{left:auto;right:100%}.is-collapsed>.gutter>.gutter-toggle>span{--tw-rotate:-180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sidebar-gutter:before{border-radius:var(--radius-full);opacity:0}.sidebar-gutter:hover:before{opacity:1;width:.5rem}.is-expanded .sidebar-gutter.gutter-border:before{opacity:1}.is-sidebar-resizing{cursor:col-resize}.table{--table-head-bg:var(--color-surface);--table-striped-color:var(--color-gray-50);--table-hover-color:rgba(var(--color-primary-500-rgb),.05);--table-border-color:var(--color-border)}.table{border-color:var(--table-border-color);width:100%}.table>thead{background-color:var(--table-head-bg)}.table>*>tr{border-bottom-width:1px}.table>*>tr>*{padding:.5rem 1rem}.table-striped>tbody>tr:nth-child(2n){background:var(--table-striped-color)}.table-hover>tbody>tr:hover>*{background:var(--table-hover-color)}.table.bordered>*>tr>*{border-width:1px}.table.borderless>*>tr,.table.borderless>*>tr>*{border-style:none}.condensed>*>tr>*{padding:.375rem .75rem}.table-fixed{table-layout:fixed}.table-fixed>*>tr>*{overflow:hidden;white-space:nowrap}.toolbar{align-items:center;display:flex;position:relative}.toolbar>.divider{margin:.5rem;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity))}.toolbar-space{flex:1 1 auto;height:1px;width:1px}.toolbar>.dropdown.show{align-items:center;display:flex;position:relative}:root{--tooltip-bg:var(--skin-color,var(--color-inverse));--tooltip-text:var(--skin-text,var(--color-canvas));--tooltip-arrow:6px;--tooltip-delay:0.5s}.hint,[class*=" hint-"],[class^=hint-]{position:relative}.hint:before,[class*=" hint-"]:before,[class^=hint-]:before{border-style:solid;height:0;position:absolute;width:0;--tw-content:"";border-color:var(--tooltip-bg) transparent transparent transparent;border-width:var(--tooltip-arrow) var(--tooltip-arrow) 0 var(--tooltip-arrow);content:var(--tw-content);margin-bottom:calc(0px - var(--tooltip-arrow))}.hint:after,[class*=" hint-"]:after,[class^=hint-]:after{background-color:var(--tooltip-bg);border-color:var(--tooltip-color);border-radius:var(--radius);color:var(--tooltip-text);font-size:.75rem;line-height:1rem;max-width:28rem;overflow:hidden;padding:.25rem .5rem;position:absolute;white-space:nowrap;--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-content:attr(data-hint);content:var(--tw-content);text-shadow:0 1px 0 var(--tooltip-bg)}.hint:after,.hint:before,[class*=" hint-"]:after,[class*=" hint-"]:before,[class^=hint-]:after,[class^=hint-]:before{bottom:100%;left:50%;opacity:0;pointer-events:none;transition-delay:0s;transition-duration:.15s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,1,1);visibility:hidden;z-index:1800;--tw-translate-x:-50%;--tw-translate-y:calc(var(--tooltip-arrow)*-1);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint:hover:after,.hint:hover:before,[class*=" hint-"]:hover:after,[class*=" hint-"]:hover:before,[class^=hint-]:hover:after,[class^=hint-]:hover:before{opacity:1;transition-delay:var(--tooltip-delay);visibility:visible}.hint-bottom:before{border-color:transparent transparent var(--tooltip-bg) transparent;border-width:0 var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow);margin-bottom:auto;margin-top:calc(0px - var(--tooltip-arrow))}.hint-bottom:after,.hint-bottom:before{bottom:auto;top:100%;--tw-translate-y:var(--tooltip-arrow);transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-left:before{border-color:transparent transparent transparent var(--tooltip-bg);border-width:var(--tooltip-arrow) 0 var(--tooltip-arrow) var(--tooltip-arrow);margin-bottom:auto;margin-right:calc(0px - var(--tooltip-arrow))}.hint-left:after,.hint-left:before{bottom:50%;left:auto;right:100%;--tw-translate-x:calc(var(--tooltip-arrow)*-1);--tw-translate-y:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-right:before{border-color:transparent var(--tooltip-bg) transparent;border-width:var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow) 0;margin-bottom:auto;margin-left:calc(0px - var(--tooltip-arrow))}.hint-right:after,.hint-right:before{bottom:50%;left:100%;--tw-translate-x:var(--tooltip-arrow);--tw-translate-y:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hint-lg:after,.hint-sm +.hint-md:after:after,.hint-xl:after{white-space:normal;word-break:break-all}.hint-sm:after{width:4rem}.hint-md:after{width:8rem}.hint-lg:after{width:16rem}.hint-xl:after{width:24rem}.hint-primary{--tooltip-bg:var(--color-primary-500)}.hint-success{--tooltip-bg:var(--color-success-500)}.hint-danger{--tooltip-bg:var(--color-danger-500)}.hint-warning{--tooltip-bg:var(--color-warning-500)}.hint-important{--tooltip-bg:var(--color-important-500)}.hint-special{--tooltip-bg:var(--color-special-500)}.tooltip{background-color:var(--tooltip-bg);border-color:var(--tooltip-color);border-radius:var(--radius);color:var(--tooltip-text);font-size:.75rem;line-height:1rem;max-width:28rem;padding:.25rem .5rem;white-space:pre-wrap;z-index:1800}.tooltip:not(.white)>.arrow{border-width:0}.tooltip.white>.arrow{border-color:inherit}.tooltip-has-title{--tw-bg-opacity:0.8;padding:.5rem .75rem .75rem;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.tooltip-has-title>.arrow{opacity:.75}.tooltip-heading{align-items:center;display:flex;font-size:.8125rem;font-weight:700;gap:1rem;justify-content:space-between;line-height:1.25rem;padding:.25rem}.tooltip-heading>.btn-close{margin-right:-.25rem}.tooltip-content{padding:.25rem}.tree-item-inner{flex-direction:row;min-height:24px;padding-left:var(--list-nested-indent)}.tree-item-inner,.tree-toggle{align-items:center;display:flex}.tree-toggle{border-radius:var(--radius);flex:none;height:1rem;justify-content:center;margin-right:-.375rem;width:1rem;--caret-size:5px;--caret-opacity:.3}.tree-item-inner>.item-icon{opacity:.5;width:1rem}.tree-item-inner:hover>.item-icon{opacity:.8}.tree-item-inner.has-hover{border-radius:var(--radius)}.tree-item-inner .item-title:not(:hover),.tree-item-inner>a.item-title:not(:hover){color:inherit}.tree-item-inner>.toolbar{margin-left:1rem;opacity:.6}.tree-item-inner:hover>.toolbar{opacity:1}.tree-item>.active{background:var(--menu-active-bg);color:var(--menu-active-color)}.tree-item>.selected{background:var(--menu-selected-bg)}.tree-item>.selected .item-content{color:var(--menu-selected-color);font-weight:700}.tree.search-menu-on-top>.search-box{left:0;right:0}.tree-lines .tree{position:relative}.tree-lines .tree-item{--tree-line-indent:calc(var(--list-nested-indent) + 8px)}.tree-lines .tree:before{border-left-width:1px;bottom:.5rem;display:block;left:var(--tree-line-indent);position:absolute;top:-.5rem;--tw-content:"";content:var(--tw-content)}.upload .upload-tip{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.upload .draggable-area{background-color:rgba(var(--color-primary-50-rgb),.2);border:1px dashed var(--color-primary-300)}.upload .draggable-area.dragover{background-color:rgba(var(--color-primary-500-rgb),.1);border-style:solid}.upload .upload-tip{color:var(--color-slate-500)}.file-item>.img{height:120px;width:120px}.upload .file-item:hover .file-size{display:flex!important}.form-batch-container{overflow-y:auto}.form-batch-table{min-width:100%;table-layout:fixed;--table-head-bg:var(--color-canvas)}.form-batch-table>*>tr{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.form-batch-table>*>tr>*{padding-left:.375rem;padding-right:.375rem;vertical-align:top}.form-batch-table>*>tr>th{text-align:left;vertical-align:middle}.form-batch-head[data-name=ACTIONS]{width:5rem}.form-batch-head[data-name=ACTIONS][data-action-count="3"]{width:6rem}.form-batch-label{display:inline}.form-batch-control>textarea.form-control{height:2rem}.form-batch-btn+.btn{margin-left:.25rem}.form-batch-table>tbody[data-count="1"] .form-batch-btn[data-type=delete]{display:none}.form-batch-ditto{position:relative}.form-batch-ditto-btn{bottom:0;height:auto;opacity:.5;padding-left:.5rem;padding-right:.5rem;position:absolute!important;right:0;top:0}.form-batch-ditto-btn:after{bottom:.5rem;left:-1px;position:absolute;top:.5rem;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-border-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}[data-ditto=on] .form-batch-ditto-btn{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));opacity:1}td.form-batch-row-actions{padding-bottom:.75rem!important;padding-top:.75rem!important}.form-batch-ditto-wrapper{position:relative}.form-batch-ditto-control .form-control,.form-batch-ditto-control .pick-pri{padding-right:calc(var(--form-batch-ditto-width) + 8px)}.form-batch-ditto-control .input-control>.input-control-suffix{right:var(--form-batch-ditto-width)}.form-batch-ditto-control .input-control>.form-control{padding-right:calc(var(--form-batch-ditto-width) + var(--input-control-suffix))}.has-fixed-actions .form-batch-col-actions{position:sticky;right:0;z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.form-batch-col-actions.is-pinned:before{background-image:linear-gradient(-90deg,transparent,transparent),linear-gradient(-90deg,transparent,transparent 50%);border-right-width:1px;bottom:0;content:" ";display:block;left:-1rem;position:absolute;top:0;transition-duration:.15s;transition-property:background;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1rem;z-index:1}.form-batch:hover .form-batch-col-actions.is-pinned:before{background-image:linear-gradient(-90deg,rgba(0,0,0,.03),transparent),linear-gradient(-90deg,rgba(0,0,0,.03),transparent 50%)}.panel-form-batch .form-batch-container .form-batch-col-actions.is-pinned:after{bottom:0;display:block;position:absolute;right:-1rem;top:0;width:1rem;z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));content:" "}.datalist{--datalist-label-width:68px}.datalist-item{display:flex;gap:.5rem;padding-bottom:.375rem;padding-top:.375rem}.datalist-item-label{align-items:center;display:flex;flex:none;justify-content:flex-end;overflow:hidden;white-space:nowrap;width:var(--datalist-label-width);--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.datalist-item-content{align-items:center;display:flex;flex:1 1 0%;gap:.5rem}.deliverable-items{border-radius:var(--radius);border-width:1px}.deliverable-item-row{align-items:center;-moz-column-gap:1rem;column-gap:1rem;display:flex;min-height:3rem;padding:.25rem .5rem}.deliverable-item+.deliverable-item{border-top-width:1px}.deliverable-item-category{flex:none;margin-right:.5rem;padding-bottom:.5rem;padding-top:.5rem;position:relative;text-align:right;text-overflow:clip;width:5rem}.required .deliverable-item-category:after{font-size:1rem;line-height:1.5rem;position:absolute;right:-.75rem;top:.5rem;--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity));--tw-content:"*";content:var(--tw-content)}.deliverable-item-doc,.deliverable-item-file{align-items:center;display:flex;gap:.25rem;min-width:200px}.deliverable-item-actions{flex:1 1 auto}.deliverable-item-avatar{align-items:center;display:flex;gap:.25rem;white-space:nowrap}.deliverable-item-info{flex:1 1 auto;overflow:hidden;white-space:nowrap;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.deliverable-item-avatar+.deliverable-item-info{margin-left:-.75rem}.deliverable-item-doc-picker{width:14rem}.deliverable-item-rename{align-items:center;display:flex;gap:.5rem}.deliverable-item-rename .form-control{flex:1 1 auto;width:18rem}.deliverable-item .form-tip{line-height:28px;margin:0;padding-left:7rem;position:relative;top:-.5rem;width:100%}.scrollbar,:root{--scrollbar-size:10px;--scrollbar-opacity:.6;--scrollbar-bg:rgba(var(--color-inverse-rgb),.15);--scrollbar-inset:inset 0 0 0 1px rgba(var(--color-inverse-rgb),.05);--scrollbar-bar-bg:rgba(var(--color-inverse-rgb),.3);--scrollbar-hover-bg:rgba(var(--color-inverse-rgb),.4);--scrollbar-drag-bg:rgba(var(--color-inverse-rgb),.5);--scrollbar-radius:var(--radius-sm);--scrollbar-duration:.7s}.scrollbar{background:var(--scrollbar-bg);box-shadow:var(--scrollbar-shadow);opacity:var(--scrollbar-opacity);position:absolute;transition-duration:.15s;transition-duration:var(--scrollbar-duration);transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.scrollbar-hover .scrollbar{opacity:0}.scrollbar-hover:hover .scrollbar{opacity:var(--scrollbar-opacity)}.scrollbar.is-dragging,.scrollbar:hover{opacity:1!important}.scrollbar-bar{background:var(--scrollbar-bar-bg);border-radius:var(--scrollbar-radius);position:absolute}.scrollbar-bar:hover{background:var(--scrollbar-hover-bg)}.is-dragging>.scrollbar-bar{background:var(--scrollbar-drag-bg)}.is-horz>.scrollbar-bar{height:100%;z-index:20}.is-vert>.scrollbar-bar{width:100%;z-index:20}.affine-theme,.affine-theme [data-theme=dark],.affine-theme [data-theme=light]{--affine-brand-color:var(--color-primary-500);--affine-primary-color:var(--color-primary-500);--affine-text-primary-color:var(--color-fore);--affine-font-family:var(--font-family-sans);--affine-font-serif-family:var(--font-family-serif);--affine-font-mono-family:var(--font-family-mono)}.blocksuite-portal{position:absolute!important}.embed-card-modal-mask{z-index:12!important}.embed-card-modal-wrapper{z-index:13!important}.affine-code-block-container .line-number{opacity:.5}@-moz-document url-prefix(){.affine-code-block-container v-line{width:100%}}.affine-list-block__prefix{color:inherit!important}.embed-zui-iframe{border-radius:var(--radius-lg);border-width:1px}affine-bookmark .affine-block-component{border-width:0}.is-editor-empty.is-editing .affine-block-children-container>affine-paragraph:first-child .affine-paragraph-placeholder:not(.visible){display:block!important}database-datasource-note-renderer{display:none!important}.editor-is-exporting audio,.editor-is-exporting canvas,.editor-is-exporting embed,.editor-is-exporting iframe,.editor-is-exporting img,.editor-is-exporting object,.editor-is-exporting svg,.editor-is-exporting video{display:initial!important}body>.affine-modal{align-items:center;background-color:var(--modal-bg);bottom:0!important;display:flex;justify-content:center;left:0!important;position:fixed!important;right:0!important;top:0!important}body>.affine-modal>center-peek{left:auto;max-width:1200px;position:relative;top:auto;--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}body>.affine-modal affine-data-view-record-detail{border-radius:var(--radius);overflow:auto;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);max-height:calc(100vh - 40px)}body>.affine-modal>center-peek>.close-modal{height:2rem;right:.75rem;top:.75rem;width:2rem;z-index:10}body>.affine-modal>center-peek>.close-modal>svg{height:1rem;width:1rem}.affine-database-column-stats{margin-left:0}.editor.is-readonly .database-header-bar+uni-lit,.editor.is-readonly .unsupported-content{display:none}.form-control .affine-theme,.form-group .affine-theme{border-radius:var(--form-control-radius);--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));outline-color:transparent;outline-style:solid;outline-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:var(--form-control-border);transition-duration:.15s;transition-property:outline,box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);--affine-editor-width:initial;--affine-editor-bottom-padding:24px!important;--affine-editor-side-padding:16px!important;min-height:200px}.form-control .affine-page-viewport,.form-group .affine-page-viewport{overflow:visible}.dtable .toggle-icon{margin-top:0;opacity:.5;position:static!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.doc-app{--doc-view-max-width:unset;--doc-view-padding:24px 40px;--doc-view-side-width:240px;--affine-editor-side-padding:0}.doc-app{align-items:stretch;display:flex;flex-direction:column;min-height:120px}.doc-space-picker-menu .menu-item>.item-inner{padding-right:.25rem}.doc-app-search .form-control{border-radius:var(--radius-full)}.doc-app-search .input-control-prefix{cursor:pointer;opacity:.75}.doc-app-search.empty:not(.focus){transition-duration:.15s;transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);width:2rem}.doc-app-search.empty:not(.focus) .form-control{padding-left:.5rem;padding-right:.5rem;--tw-ring-color:transparent}.doc-app-search.empty:not(.focus) .form-control::-moz-placeholder{opacity:0}.doc-app-search.empty:not(.focus) .form-control::placeholder{opacity:0}.doc-app-search.empty:not(.focus) .form-control:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.doc-app-search:not(.empty) .form-control{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-300-rgb),var(--tw-ring-opacity))}.doc-app-header .divider{height:1rem!important;margin-left:.25rem!important;margin-right:.25rem!important}.doc-app .is-match-keys{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-100-rgb),var(--tw-bg-opacity));font-weight:700;text-decoration-line:underline;text-underline-offset:2px}.doc-main .dtable-footer{border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:rgba(var(--color-border-rgb),var(--tw-border-opacity))}.doc-main.show-view>.doc-list{pointer-events:none;visibility:hidden;z-index:-10}.has-doc-app-fullscreen .doc-app-header,.has-doc-app-fullscreen .doc-sidebar,.has-doc-app-fullscreen>#header{display:none}.has-doc-app-fullscreen #mainContainer{max-width:none!important;padding:0!important;width:100%!important}.has-doc-app-fullscreen #docApp{height:calc(100vh - 12px)!important}.doc-app doc-title,.editor-is-exporting .doc-editor-title{display:none}.editor-is-exporting doc-title{display:block}.doc-app .affine-page-root-block-container{margin:0;max-width:100%}.doc-tree .item-inner{cursor:pointer;padding-right:0;position:relative}.doc-tree .item-inner>.item-icon{flex:none;opacity:1}.doc-tree .item-inner .item-title{overflow:hidden;text-overflow:clip;white-space:nowrap}.doc-tree .item-inner.selected .item-title{font-weight:700}.doc-tree .item-inner>.toolbar{top:.25rem!important}.doc-tree .item-inner>.toolbar>.btn.with-popover-show,.doc-tree .list-heading-inner>.toolbar{opacity:1!important}.doc-tree .item-inner:hover>.toolbar{margin-top:0!important}.doc-tree .with-hover-actions>.item>.item-inner .item-actions{right:0}.doc-sidebar .sortable-ghost{border-radius:var(--radius-sm);z-index:10;--tw-bg-opacity:1;background-color:rgba(var(--color-warning-100-rgb),var(--tw-bg-opacity));opacity:.3;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-warning-600-rgb),var(--tw-ring-opacity))}.doc-tree [z-key=project-files]{border-top:1px solid rgba(var(--color-border-rgb),var(--tw-border-opacity));margin-top:.25rem;padding-top:.25rem}.doc-list-item-title{overflow:hidden;text-overflow:clip}.doc-view{scroll-padding-top:16px;scrollbar-gutter:stable both-edges}.doc-view-content{max-width:var(--doc-view-max-width);padding:var(--doc-view-padding)}.doc-files .item-title{overflow:hidden;white-space:nowrap}.doc-files .file-list-item{border-radius:var(--radius-lg);transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.doc-files .file-list-item:hover{background-color:rgba(var(--color-inverse-rgb),.05)}.doc-files .file-list-item .item-actions,.doc-files .file-list-item:hover .item-actions{margin-left:1rem;margin-top:0;position:relative}.doc-files .file-list-item .item-actions .btn{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}.doc-editor .affine-page-viewport{overflow:visible!important}.doc-editor .affine-page-root-block-container{max-width:100%;padding:0 0 2rem!important}.doc-editor-keywords,.doc-editor-title{flex:none;max-width:100%;min-width:0}.doc-editor-keywords:hover .form-control{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.doc-editor-keywords .form-control:focus{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.doc-editor-control{z-index:2}.doc-view-sidebar{display:flex;flex-direction:column;max-height:calc(100% - 24px);overflow:visible;width:var(--doc-view-side-width)}.doc-view-sidebar-nav{--nav-item-padding:6px;--nav-item-color:var(--color-gray-500);--nav-active-bg:var(--color-primary-100);--nav-active-color:var(--color-fore);--nav-item-height:26px;--nav-divider-margin:8px;background-color:rgba(var(--color-surface-rgb),.2)}.doc-view-sidebar .datalist{--datalist-label-width:56px}.is-closed.doc-view-sidebar .doc-view-sidebar-content,.is-sidebar-closed .doc-view-sidebar-content{display:none}.is-closed.doc-view-sidebar,.is-sidebar-closed .doc-view-sidebar{--doc-view-side-width:0;opacity:0;transition-delay:1s;transition-duration:1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.is-outline.doc-view-sidebar{--doc-view-side-width:260px}.doc-view:hover .doc-view-sidebar{opacity:1;transition-delay:0s}.is-closed>.doc-view-sidebar-container,.is-sidebar-closed .doc-view-sidebar-container{position:absolute;right:0;top:0}.doc-view-sidebar-container{background-color:rgba(var(--color-canvas-rgb),.8);min-height:0;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.doc-outline .listitem{position:relative}.doc-outline .tree-toggle.is-empty:before{border-radius:var(--radius-full);height:.25rem;position:absolute;width:.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-300-rgb),var(--tw-bg-opacity));--tw-content:"";content:var(--tw-content)}.doc-outline .is-nested-root.no-nested-items{padding-left:.375rem}.doc-view input{font-family:inherit}.doc-path-picker .picker-deselect-btn{display:none}.doc-path-picker-angle{margin-left:-.125rem;margin-right:-.125rem}.doc-path-picker,.doc-space-picker{outline:2px solid transparent!important;outline-offset:2px!important;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}.icon-strikethrough:before{font-size:1rem;line-height:1.5rem;text-decoration-line:line-through;--tw-content:"S"}.icon-strikethrough:before,.icon-underline:before{content:var(--tw-content);font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif;font-weight:700;margin-top:.125rem}.icon-underline:before{font-size:.875rem;line-height:1.3rem;text-decoration-line:underline;--tw-content:"U"}.icon-font:before{font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif;font-size:1rem;line-height:1.5rem;margin-top:.125rem;--tw-content:"A";content:var(--tw-content)}.dropmenu-btn{gap:.25rem;padding-left:.5rem;padding-right:.5rem}.dropmenu-btn>.text{max-width:180px;overflow:hidden}.dropmenu-btn>.is-leading{left:-.625rem;opacity:.6;position:absolute}.dropmenu-btn>.is-caret{align-items:center;background-color:rgba(var(--color-canvas-rgb),.2);border-radius:var(--radius);display:flex;height:1rem;justify-content:center;width:1rem}.dropmenu-nav{border-bottom-width:1px;margin-left:.75rem;margin-right:.75rem;margin-top:.25rem}.has-search .dropmenu-nav{margin-top:-.5rem}.dropmenu-nav>.nav-secondary{gap:.5rem}.dropmenu-nav>.nav-secondary>.nav-item>a{border-radius:var(--radius);padding-left:.5rem;padding-right:.5rem}.dropmenu-nav>.nav-secondary>.nav-item>a:after{bottom:-1px;left:1rem;opacity:0;right:1rem}.dropmenu-nav>.nav-secondary>.nav-item>.active:after{left:.5rem;opacity:1;right:.5rem;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dropmenu-title{font-size:.75rem;font-weight:700;line-height:1rem;margin-bottom:-.5rem;padding:.75rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.dropmenu-list{min-height:0;overflow-x:hidden;overflow-y:auto;padding:.5rem .75rem}.dropmenu.loading>*{opacity:0}.dropmenu-item .tree-item-inner{border-radius:var(--radius);cursor:pointer;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dropmenu-item.is-item.active>.tree-item-inner{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.tree-item-inner.is-link:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.tree-item-inner.is-link:hover .item-content,.tree-item-inner.is-link:hover .item-trailing-icon,.tree-item-inner.is-link:hover .label{color:inherit}.tree-item-inner.is-toggle:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.dropmenu-item+.tree-item{margin-top:.125rem}.dropmenu-item .is-match{font-weight:700;text-decoration-line:underline}.dropmenu-item .item-title,.dropmenu-item .label{overflow:hidden;white-space:nowrap}.dropmenu-item .item-content{padding-left:.375rem;padding-right:.375rem}.dropmenu-item *+.item-content{padding-left:0}.tree-item-inner.is-toggle .item-title{opacity:.6}.tree-item-inner.is-toggle:hover .item-title{opacity:1}.dropmenu-item-check{align-items:center;display:flex;flex:1 1 auto;justify-content:flex-end;padding-right:.5rem}.dropmenu-item .nested-toggle-icon.is-empty{width:.25rem}.dropmenu-item .item-icon{margin-right:-.25rem}.card-list{--list-gap:.625rem;--list-count-per-row:1}.card-list,.card-list-item{padding:calc(var(--list-gap)/2)}.card-list-item{width:calc(100%/var(--list-count-per-row))}.card-grid{display:flex;flex-wrap:wrap}.card-grid .card{height:100%}:root{--form-control-border:var(--color-border-strong)}.checkbox-primary.disabled,.checkbox-primary.disabled>label,.checkbox-primary>input[type=checkbox]:disabled,.checkbox-primary>input[type=checkbox]:disabled+label,.radio-primary.disabled,.radio-primary.disabled>label,.radio-primary>input[type=radio],.radio-primary>input[type=radio]:disabled+label{filter:none!important}.checkbox-primary.disabled>label,.radio-primary.disabled>label{opacity:1}.checkbox-primary.disabled>label:before,.radio-primary.disabled>label:before{background-color:rgba(var(--color-inverse-rgb),.05);opacity:.5}.form-actions{gap:1rem;justify-content:center}.form-actions .btn{min-width:96px}.form-control-static{min-height:32px;padding-bottom:.375rem;padding-top:.375rem}:root{--zt-panel-form-max-width:1000px}.size-sm{--zt-panel-form-max-width:800px}.size-lg{--zt-panel-form-max-width:1200px}.panel-body>.container,.panel-heading>.container{max-width:var(--panel-container-width);min-width:0;padding-left:var(--panel-container-padding);padding-right:var(--panel-container-padding)}.panel-heading>.container{align-items:center;display:flex;flex-direction:row;flex-wrap:nowrap;gap:1rem;justify-content:space-between;min-height:48px}.panel-form{border-radius:var(--radius-md);margin-bottom:1rem;margin-left:auto;margin-right:auto;max-width:var(--zt-panel-form-max-width);min-width:var(--zt-panel-form-min-width);overflow:visible;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-bottom:1rem;padding-left:1rem;padding-right:1rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.panel-form .form-actions{background-color:rgba(var(--color-canvas-rgb),.8);bottom:0;padding-bottom:1rem;padding-top:1rem;position:sticky;z-index:3;--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.panel-form .form-grid{margin-left:calc(0px - var(--form-grid-gap-y-half));margin-right:calc(0px - var(--form-grid-gap-y-half));padding-bottom:0}.panel-form-toolbar{padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half);width:100%}.panel-form-toolbar>.toolbar{gap:1rem;padding-bottom:.75rem;padding-top:.75rem}.panel-form-divider{margin-bottom:.75rem;margin-top:1rem;padding-left:var(--form-grid-gap-x-half);padding-right:var(--form-grid-gap-x-half);width:100%}.panel-form-divider:before{background-color:rgba(var(--color-border-rgb),.7);display:block;height:1px;--tw-content:"";content:var(--tw-content)}.is-full .btn-full-form,.is-lite .btn-lite-form{z-index:1;--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-300-rgb),var(--tw-ring-opacity))}.btn-toggle-fold:after{content:attr(data-expand-text)}.show-fold-items .btn-toggle-fold:after{content:attr(data-collapse-text)}.is-foldable,.is-full .full\:hidden,.is-full .lite\:visible,.is-full .panel-form-divider,.is-full .panel-form-toolbar,.is-lite .full\:visible,.is-lite .lite\:hidden,.no-foldable-items .btn-toggle-fold{display:none}.is-foldable.is-pinned,.is-full .full\:visible,.is-full .is-foldable,.is-full .lite\:hidden,.is-lite .full\:hidden,.is-lite .lite\:visible,.show-fold-items .is-foldable{display:block}.is-full .full\:w-1\/2,.is-lite .lite\:w-1\/2{width:50%}.is-full .full\:w-1\/3,.is-lite .lite\:w-1\/3{width:33.333333%}.is-full .full\:w-2\/3,.is-lite .lite\:w-2\/3{width:66.666667%}.is-full .full\:w-1\/4,.is-lite .lite\:w-1\/4{width:25%}.is-full .full\:w-2\/4,.is-lite .lite\:w-2\/4{width:50%}.is-full .full\:w-3\/4,.is-lite .lite\:w-3\/4{width:75%}.is-full .full\:w-1\/5,.is-lite .lite\:w-1\/5{width:20%}.is-full .full\:w-2\/5,.is-lite .lite\:w-2\/5{width:40%}.is-full .full\:w-3\/5,.is-lite .lite\:w-3\/5{width:60%}.is-full .full\:w-4\/5,.is-lite .lite\:w-4\/5{width:80%}.is-full .full\:w-1\/6,.is-lite .lite\:w-1\/6{width:16.666667%}.is-full .full\:w-2\/6,.is-lite .lite\:w-2\/6{width:33.333333%}.is-full .full\:w-3\/6,.is-lite .lite\:w-3\/6{width:50%}.is-full .full\:w-4\/6,.is-lite .lite\:w-4\/6{width:66.666667%}.is-full .full\:w-5\/6,.is-lite .lite\:w-5\/6{width:83.333333%}.is-full .full\:w-full,.is-lite .lite\:w-full{width:100%}.page-form{--panel-container-width:960px;--panel-container-padding:20px;--zt-panel-form-max-width:1200px;--zt-panel-form-min-width:1040px;padding-left:0;padding-right:0;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.page-form .panel-heading{border-bottom-width:1px;--tw-border-opacity:0.7;padding:0}.page-form .panel-title{font-size:1rem;line-height:1.5rem}@media (max-width:1240px){.page-form{--zt-panel-form-max-width:1100px}}@media (max-width:1110px){.page-form{--zt-panel-form-max-width:1040px}}.modal-body>.page-form{margin:-1.5rem -2rem!important;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-body>.page-form>.panel-heading{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);position:sticky;top:-1.25rem;z-index:2;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding-bottom:.375rem;padding-top:.375rem}.modal-body>.panel-form .form-actions{bottom:-1.5rem!important;padding-bottom:1.5rem;padding-top:1.5rem}.gantt-container .gantt_message_area{display:none}.gantt-container .gantt_grid_head_owner_id{text-align:left}.gantt-container .gantt_grid_head_cell.gantt_grid_head_text{overflow:visible}.gantt-container .gantt_grid_head_cell,.gantt_scale_cell{color:#000!important}.gantt-container .gantt_grid_scale,.gantt_task_scale,.gantt_task_vscroll{background-color:#f2f7ff}.gantt-container .gantt_row{cursor:pointer}.gantt-container .gantt_row>div:first-child .gantt_tree_content{color:#3c4353}.gantt-container .gantt_row_task:hover .submitBtn{display:inline-block}.gantt-container .gantt_link_arrow_right{border-left-color:#2196f3}.gantt-container .gantt_link_arrow_left{border-right-color:#2196f3}.gantt-container .gantt_tree_content table{width:100%}.gantt-container .gantt_tree_content table td{padding:0!important}.gantt-container .gantt_tree_content{color:#838a9d}.gantt-container .gantt_task_content .icon-seal,.gantt-container .gantt_task_content span.task-label,.gantt_task_content span.label-pri{display:none}.gantt-container .gantt_task_line{overflow:visible}.gantt-container .gantt_task_line.gantt_selected{box-shadow:0 1px 1px rgba(0,0,0,.05),0 2px 6px 0 rgba(0,0,0,.045)}.gantt-container .gantt_task_line.gantt_task_inline_color{border:0}.gantt-container .gantt_task_link .gantt_line_wrapper div{background-color:#2196f3}.gantt-container .gantt_task_link.start_to_start .gantt_line_wrapper div{background-color:#dd55ea}.gantt-container .gantt_task_link.start_to_start:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #dd55ea}.gantt-container .gantt_task_link.start_to_start .gantt_link_arrow_right{border-left-color:#dd55ea}.gantt-container .gantt_task_link.finish_to_start .gantt_line_wrapper div{background-color:#7576ba}.gantt-container .gantt_task_link.finish_to_start:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #7576ba}.gantt-container .gantt_task_link.finish_to_start .gantt_link_arrow_right{border-left-color:#7576ba}.gantt-container .gantt_task_link.finish_to_finish .gantt_line_wrapper div{background-color:#55d822}.gantt-container .gantt_task_link.finish_to_finish:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #55d822}.gantt-container .gantt_task_link.finish_to_finish .gantt_link_arrow_left{border-right-color:#55d822}.gantt-container .gantt_task_link.start_to_finish .gantt_line_wrapper div{background-color:#975000}.gantt-container .gantt_task_link.start_to_finish:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #975000}.gantt-container .gantt_task_link.start_to_finish .gantt_link_arrow_left{border-right-color:#975000}.gantt-container .gantt_critical_link .gantt_line_wrapper>div{background-color:#e63030!important}.gantt-container .gantt_critical_link.finish_to_start .gantt_link_arrow_right,.gantt-container .gantt_critical_link.start_to_start .gantt_link_arrow_right{border-left-color:#e63030!important}.gantt-container .gantt_critical_link.finish_to_finish .gantt_link_arrow_left,.gantt-container .gantt_critical_link.start_to_finish .gantt_link_arrow_left{border-right-color:#e63030!important}.gantt-container .gantt_critical_task{background:#e63030!important;border-color:#9d3a3a!important}.gantt-container .gantt_marker .gantt_marker_content{background-color:#f51e1e;left:-15px}.gantt-container .submitBtn{display:none}.gantt-container .editDeadline{color:#fff!important;display:none;line-height:normal!important;padding:2px 6px}.gantt-container td:hover>.editDeadline{display:inline-block!important}.gantt-container .icon-confirm{color:#18a6fd;font-size:18px}.gantt-container .icon-seal{font-size:18px}.gantt-container div.delayed{background:#ffebeb;color:#fb2b2b}.gantt-container [class*=" pri-"]{max-width:unset}.dropdown.popover{display:flex;flex-direction:column;position:absolute;z-index:1200}.dropdown.show{display:flex}.dropdown-menu{display:none;--menu-min-width:7rem;--menu-max-width:20rem}.dropdown-menu.show,.menu-wrapper>.dropdown-menu,.show>.dropdown-menu{display:block}.dropdown>.dropdown-menu,.menu-wrapper .dropdown-menu{position:relative}.popup .popup.search-menu{background-color:var(--menu-bg)}.show>.menu-wrapper{display:flex}.dropdown>.menu-wrapper{height:100%}.dropdown>.menu-wrapper .menu-wrapper{position:absolute}.dropdown>.menu-wrapper.is-tree .menu-wrapper{position:relative}.is-contextmenu .is-nested-show>a:not(:hover){--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity))}.is-contextmenu .menu-item.is-nested>.item-inner>.nested-toggle-icon{position:absolute;right:.25rem;top:.375rem}.is-contextmenu .menu-nested .menu-item>.item-inner{padding-left:.5rem;padding-right:1.25rem}.is-contextmenu .menu-nested .menu-item>.item-inner>.item-content{overflow:hidden}.dropdown>.arrow{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.global-search-panel li:not(.order-first):hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.global-search-panel li a{width:100%}.global-search-panel li{cursor:pointer}.history-panel>.panel-heading+.panel-body{margin-top:-.75rem}.history-panel-action{position:relative}.history-panel-action:before{border-left-width:1px;bottom:-.375rem;left:.5rem;position:absolute;top:22px;--tw-border-opacity:1;border-color:rgba(var(--color-border-rgb),var(--tw-border-opacity));--tw-content:"";content:var(--tw-content)}.col-reverse>.history-panel-action:first-child:before,.col>.history-panel-action:last-child:before{display:none}.history-panel-action>.item-inner{padding-left:1.5rem}.history-panel-action>.item-inner>.avatar{left:0;position:absolute;top:.375rem}.history-panel-action .file-list-item .item-content{flex:none}.history-panel-action blockquote{margin-top:.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding:.25rem .25rem .25rem .5rem}.history-panel-action blockquote.original{display:none}.img-cutter{background:var(--color-gray-100);border:1px solid #ddd;margin-bottom:20px;padding:10px}.img-cutter .canvas{margin:0 auto;max-width:100%;min-width:50px;position:relative}.img-cutter .cover{bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.img-cutter .controller{background:none;border:1px dashed hsla(0,0%,100%,.7);cursor:move;position:absolute;z-index:5}.img-cutter .control{background:#000;background:rgba(0,0,0,.6);border:1px solid hsla(0,0%,100%,.6);height:6px;position:absolute;width:6px}.img-cutter .control[data-type=left]{cursor:w-resize;left:-4px;margin-top:-3px;top:50%}.img-cutter .control[data-type=top]{cursor:n-resize;left:50%;margin-left:-3px;top:-4px}.img-cutter .control[data-type=right]{cursor:e-resize;margin-top:-3px;right:-4px;top:50%}.img-cutter .control[data-type=bottom]{bottom:-4px;cursor:s-resize;left:50%;margin-left:-3px}.img-cutter .control[data-type=top-left]{cursor:nw-resize;left:-4px;top:-4px}.img-cutter .control[data-type=top-right]{cursor:ne-resize;right:-4px;top:-4px}.img-cutter .control[data-type=bottom-left]{bottom:-4px;cursor:sw-resize;left:-4px}.img-cutter .control[data-type=bottom-right]{bottom:-4px;cursor:se-resize;right:-4px}.img-cutter .cliper{bottom:0;left:0;position:absolute;right:0;top:0;z-index:2}.messager-lite{border-radius:var(--radius-lg);min-width:160px;--tw-bg-opacity:1!important;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))!important;padding:1rem 1.5rem;--tw-text-opacity:1!important;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))!important;--skin-ring:transparent!important;--skin-text:inherit!important;--skin-color:var(--color-gray-500)}.messager-lite .alert-icon{color:var(--skin-color);font-size:1.5rem;line-height:2rem}.messager-lite .alert-text{font-size:.875rem;font-weight:700;line-height:1.3rem}.messager-lite .toolbar{gap:.5rem;margin-left:2rem}.messager-lite .alert-content+.alert-close{margin-left:1.5rem}.messager-lite .toolbar .btn.ghost{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.modal-reconfirm .modal-body{font-size:14px;font-weight:700;padding:24px 32px}.modal-reconfirm .modal-footer{justify-content:center;padding:24px}.picker-deselect-btn{opacity:.6;transition-duration:.15s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.picker-multi-selection{cursor:pointer;padding-right:.5rem;position:relative}.picker-multi-selection .picker-deselect-btn{bottom:0;left:0;position:absolute;right:0;top:0;--tw-scale-x:0;--tw-scale-y:0;background-color:rgba(var(--color-surface-rgb),.8);opacity:0}.picker-deselect-btn:hover,.picker-multi-selection .picker-deselect-btn,.picker-multi-selection:hover .picker-deselect-btn{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.picker-deselect-btn:hover,.picker-multi-selection:hover .picker-deselect-btn{--tw-scale-x:1;--tw-scale-y:1;opacity:1;--state-color:rgba(var(--color-surface-rgb),.9)}.pick-pri{flex-direction:row;justify-content:flex-start;position:relative}.pick-pri,.pick-pri>.text{align-items:center;display:flex}.pick-pri>.text{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap}.pick-pri .placeholder{--tw-text-opacity:1;color:rgba(var(--color-placeholder-rgb),var(--tw-text-opacity))}.pick-pri-list>.btn{justify-content:flex-start}.disabled.pick-pri,.disabled.pick-pri>*{filter:none}.search-form{--gutter-width:12px;padding-bottom:.5rem}.search-form-container{border-radius:var(--radius);min-height:116px;position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.is-simple .search-form-container{min-height:56px}.search-form-field td{padding:.375rem}.search-form-field td.is-andOr,.search-form-field td.is-operator{width:5rem}.search-form-field td.is-condition{width:7rem}.search-form-field td.is-operator{width:5rem}[lang=en] .search-form-field td.is-operator{width:6rem}.search-form .sidebar-right.is-collapsed{margin-right:-.375rem}.is-simple .search-form-wrapper{display:flex}.is-simple .search-form-wrapper>.row{flex:1 1 auto}.is-simple .search-form-wrapper>.toolbar{flex:none;margin-top:0}.zinbar [data-hint]{position:relative}.zinbar [data-hint]:after{background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity));border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg);bottom:100%;display:block;pointer-events:none;position:absolute;right:0;white-space:nowrap;z-index:50;--tw-bg-opacity:0.9;font-size:.75rem;line-height:1rem;padding:.125rem .25rem;--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity));opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);--tw-content:attr(data-hint);content:var(--tw-content)}.zinbar [data-hint]:hover:after{opacity:1}.zin-perf-btn-list .text-danger{color:var(--color-danger-400)}.zinbar .state{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.zinbar .state:active{--tw-scale-x:1.05;--tw-scale-y:1.05}.zinbar .state:active,.zinbar.collapse{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.zinbar.collapse{--tw-translate-x:100%}.zinbar.collapse>div{pointer-events:none}.zinbar{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-duration:.7s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}body[z-perf=danger]:before,body[z-perf=warning]:before{bottom:0;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:9990;--tw-border-opacity:1;border-color:rgba(var(--color-warning-600-rgb),var(--tw-border-opacity));font-size:.75rem;line-height:1rem;--tw-content:"";border-style:inset;border-width:12px 8px 8px;content:var(--tw-content)}body[z-perf=danger]:before{--tw-border-opacity:1;border-color:rgba(var(--color-danger-600-rgb),var(--tw-border-opacity))}body[z-perf=danger]:after,body[z-perf=warning]:after{font-size:.75rem;font-weight:700;left:0;line-height:1rem;line-height:1;pointer-events:none;position:fixed;right:0;text-align:center;top:0;z-index:9991;--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity));--tw-content:attr(z-perf-message);content:var(--tw-content)}.card{border-radius:var(--radius);min-height:28px;position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;transition-duration:.15s;transition-property:box-shadow,border,color,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.card:hover{--tw-shadow:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--tw-shadow-colored:0 2px 6px -1px var(--tw-shadow-color),0 1px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.card-content,.card-footer,.card-header,.card-heading{padding:.25rem .5rem}.card-heading{align-items:center;display:flex;gap:.5rem}.card-icon{opacity:.5}.card-header{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.card-content{display:flex;flex-direction:column;gap:.25rem}.card-actions{position:absolute;right:.125rem;top:.125rem}.card-actions+.card-heading{padding-right:1.75rem}.card-subtitle{font-size:.75rem;line-height:1rem;--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.card.selected{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-400-rgb),var(--tw-ring-opacity))}.card-list{--list-gap:.625rem;--list-count-per-row:1}.card-list,.card-list-item{padding:calc(var(--list-gap)/2)}.card-list-item{width:calc(100%/var(--list-count-per-row))}.card-grid{display:flex;flex-wrap:wrap}.card-grid .card{height:100%}.contextmenu{display:none}.contextmenu.show{display:block}.contextmenu .popup .popup,.contextmenu.popup{position:absolute}.more,.more-vert{margin:.5rem;position:relative}.more,.more-vert,.more-vert:after,.more-vert:before,.more:after,.more:before{background-color:currentColor;border-radius:var(--radius-full);height:.125rem;width:.125rem}.more-vert:after,.more-vert:before,.more:after,.more:before{display:block;left:-5px;position:absolute;top:0;--tw-content:"";content:var(--tw-content)}.more-vert:after,.more:after{left:5px}.more-vert{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dashboard-blocks{position:relative}.dashboard-block-cell{position:absolute;transition-duration:.15s;transition-property:left,top;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-block{border-radius:var(--radius);bottom:.5rem;left:.5rem;position:absolute;right:.5rem;top:.5rem;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-block.is-dragging{opacity:0;z-index:1600}.dashboard-block-header{align-items:center;border-top-left-radius:var(--radius);border-top-right-radius:var(--radius);display:flex;flex-direction:row;justify-content:space-between;left:0;padding:.75rem;pointer-events:none;position:absolute;right:0;top:0;z-index:10}.dashboard-block-header>*{pointer-events:auto}.dashboard-block-title{font-size:.875rem;font-weight:700;line-height:1.3rem}.dashboard-block-body{bottom:0;left:0;position:absolute;right:0;top:0}.dashboard-block-body>.panel{display:flex;flex-direction:column;height:100%;width:100%;--tw-shadow:0px 6px 16px rgba(202,215,235,.25)}.dashboard-block-body .panel-heading{cursor:move;flex:none}.dashboard-block-body .panel-body{flex:1 1 auto;overflow-y:auto}.has-more-menu>.dashboard-block-body .panel-heading{padding-right:3rem}.dashboard-block-body .panel-title{font-size:.875rem;height:2rem;line-height:1.3rem}.dashboard-block-actions .btn{opacity:.6}.dashboard-block-actions .btn:hover{opacity:1}.dashboard-drop-shadow{position:absolute;transition-duration:.15s;transition-property:left,top;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dashboard-drop-shadow:before{background-color:rgba(var(--color-inverse-rgb),.05);border-radius:var(--radius);bottom:.5rem;left:.5rem;position:absolute;right:.5rem;top:.5rem;--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-content:"";content:var(--tw-content)}:root{--dtable-checked-bg:var(--color-warning-50);--dtable-checked-bg-hover:var(--color-warning-100);--dtable-checked-border:var(--color-border-strong)}.dtable-cell.is-checked,.dtable-striped .dtable-cell.is-odd-row.is-checked{background-color:var(--dtable-checked-bg)}.checkbox-primary.dtable-checkbox{margin-right:-.375rem}.dtable-checkbox{order:-5}.dtable-hover-col .dtable-cell.is-hover-col.is-checked,.dtable-hover-row .dtable-cell.is-hover-row.is-checked{background-color:var(--dtable-checked-bg-hover)}.dtable-cell.is-checked{--dtable-border-color:var(--dtable-checked-border)}.dtable-check-info{flex-shrink:1;margin-right:.5rem;overflow:hidden;white-space:nowrap}:root{--toggle-icon-size:calc(var(--font-size-root)*3/4 + 1px)}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-color:currentColor;border-width:1px;display:block;opacity:.5;position:relative}.toggle-icon-collapse:hover,.toggle-icon-expand:hover,.toggle-icon:hover{opacity:.9}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-radius:inherit;height:var(--toggle-icon-size);width:var(--toggle-icon-size)}.is-collapsed .toggle-icon:after,.is-collapsed .toggle-icon:before,.is-expanded .toggle-icon:before,.toggle-icon-collapse:after,.toggle-icon-collapse:before,.toggle-icon-expand:before{background-color:currentColor;content:" ";display:block;height:1px;left:2px;position:absolute;right:2px;top:calc((var(--toggle-icon-size) - 3px)/2)}.is-collapsed .toggle-icon:after,.toggle-icon-collapse:after{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:root{--dtable-nt-size:calc(var(--font-size-root)*3/4 + 1px)}.dtable-nested-indent{flex:none;margin-right:-.25rem;order:-100}.dtable-nested-toggle{align-items:center;border-radius:var(--radius-sm);display:flex;flex:none;height:1.25rem;justify-content:center;margin-left:-.25rem;order:-6;width:1.25rem}.dtable-nested-toggle.is-no-child{margin-right:-.25rem;opacity:0;pointer-events:none}.dtable-child-label{order:-5}.dtable-header-group{align-items:center;background:var(--dtable-header-bg);cursor:default;display:flex;justify-content:center;left:0;position:absolute;top:1px;z-index:30}.dtable-bordered .dtable-header-group{border-bottom:1px solid var(--dtable-border-color);border-left:1px solid var(--dtable-border-color)}.dtable-header-as-group{contain:style;content-visibility:visible;overflow:visible!important}.dtable-sorting{cursor:move}.dtable-cell.is-sorting-from{background-color:var(--dtable-bg);z-index:20}.dtable-cell.is-sorting-from:before{border-top-width:1px}.dtable-sorting .dtable-cell.is-sorting-after{--tw-translate-y:-100%}.dtable-sorting .dtable-cell.is-sorting-after,.dtable-sorting .dtable-cell.is-sorting-before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dtable-sorting .dtable-cell.is-sorting-before{--tw-translate-y:100%}.dtable-cell.is-sorting-before:before,.dtable-cell.is-sorting-from:before{border-bottom-width:1px;border-top-width:1px}.dtable{--dtable-bg:var(--color-canvas);--dtable-striped-bg:var(--color-gray-50);--dtable-hover-bg:rgba(var(--color-primary-500-rgb),.05);--dtable-header-bg:var(--color-surface);--dtable-footer-bg:var(--color-surface);--dtable-border-color:var(--color-border);--dtable-sorter-size:0.3125rem}.dtable{position:relative;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.dtable.no-animation *{transition-property:none!important}.dtable-block{overflow:hidden;position:absolute;width:100%}.dtable-header{background-color:var(--dtable-header-bg);border-top-left-radius:inherit;border-top-right-radius:inherit}.dtable-body{overflow:hidden}.dtable-cells{background-color:var(--dtable-bg);height:100%;position:absolute;z-index:0}.dtable-cells-container{height:100%;position:absolute;width:100%}.dtable-header .dtable-cells{background-color:var(--dtable-header-bg)}.dtable-cells.dtable-fixed-left,.dtable-cells.dtable-fixed-right{z-index:10}.dtable-cell{position:absolute;transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-cell:after,.dtable-cell:before{bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:-1px;z-index:2}.dtable-cell:before{border-bottom-width:1px;border-color:var(--dtable-border-color);opacity:1}.dtable-header-cell{align-items:center;display:flex;font-weight:700}.dtable-header-cell:after,.dtable-header-cell:before{top:0}.dtable-cell-content{align-items:center;display:flex;gap:.25rem;height:100%;overflow:hidden;padding-left:.75rem;padding-right:.75rem;position:relative;white-space:nowrap;width:100%;z-index:5}.dtable-body .dtable-cell.is-last-row:before{border-bottom-width:0}.dtable-footer{align-items:center;background-color:var(--dtable-footer-bg);border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-color:var(--dtable-border-color);border-top-width:1px;display:flex;padding-left:.75rem;padding-right:.75rem;position:absolute;width:100%;z-index:10}.dtable-empty-tip{align-items:center;display:flex;height:100%;justify-content:center}.dtable .scrollbar{z-index:20}.dtable-header{transition-duration:1s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-scrolled-down .dtable-header{border-bottom-color:rgba(var(--color-inverse-rgb),.15);border-bottom-width:1px}.dtable-has-scroll-y:not(.dtable-scrolled-bottom) .dtable-footer{border-top-color:rgba(var(--color-inverse-rgb),.15);border-top-width:1px}.dtable-scroll-shadow{background-image:linear-gradient(90deg,rgba(0,0,0,.03),transparent),linear-gradient(90deg,rgba(0,0,0,.03),transparent 50%);opacity:0;pointer-events:none;position:absolute;top:0;transition-duration:1s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:8px;z-index:20}.dtable:hover .dtable-scroll-shadow{opacity:1}.dtable-scroll-shadow.is-right{margin-left:-7px;--tw-rotate:180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.dtable-scroll-shadow.is-left,.dtable-scrolled-end .dtable-scroll-shadow.is-right{visibility:hidden}.dtable-scroll-shadow.is-right,.dtable-scrolled-right .dtable-scroll-shadow.is-left{visibility:visible}.scrollbar-hover:hover .scrollbar{opacity:0}.scrollbar-hover .dtable-body:hover~.scrollbar{opacity:var(--scrollbar-opacity)}.dtable-sort{display:inline-flex;height:calc(var(--dtable-sorter-size)*12/5);margin-left:.25rem;opacity:.8;position:relative}.dtable-cell:hover .dtable-sort{opacity:1}.dtable-sort:after,.dtable-sort:before{border-color:transparent;border-style:solid;height:0;left:0;opacity:.4;position:absolute;width:0;--tw-content:"";border-width:var(--dtable-sorter-size);content:var(--tw-content)}.dtable-sort:before{border-bottom-color:currentColor;border-top-width:0;top:0}.dtable-sort:after{border-bottom-width:0;border-top-color:currentColor;bottom:0}.dtable-sort.dtable-sort-asc:before,.dtable-sort.dtable-sort-desc:after{opacity:.9}.dtable-sort-link{align-items:center;cursor:pointer;display:inline-flex}.dtable-cells.dtable-fixed-left:before,.dtable-cells.dtable-fixed-right:before{border-color:var(--dtable-border-color);content:"";height:100%;pointer-events:none;position:absolute;width:100%;z-index:5}.dtable-cells.dtable-fixed-left:before{border-right-width:1px;right:-1px}.dtable-cells.dtable-fixed-right:before{border-left-width:1px;left:0}.dtable-bordered:before{border-color:var(--dtable-border-color);border-radius:inherit;border-width:1px;bottom:0;content:"";display:block;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:15}.dtable-bordered .dtable-cell:before{border-width:1px;right:-1px}.dtable-cell.has-border-left:before{border-left-width:1px}.dtable-cell.has-border-right:before{border-right-width:1px;right:-1px}.dtable-striped .dtable-cell.is-odd-row{background-color:var(--dtable-striped-bg)}.dtable-hover-cell .dtable-cell:hover:after,.dtable-hover-col .dtable-cell.is-hover-col:before,.dtable-hover-row .dtable-body .dtable-cell.is-hover-row:before{background-color:var(--dtable-hover-bg)}.kanban,.kanban-list{--kanban-lane-name-width:20px;--kanban-col-width:280px;--kanban-cols-gap:8px;--kanban-lanes-gap:8px;--kanban-header-height:32px;--kanban-lane-height:auto;--kanban-lane-color:var(--color-primary-500);--kanban-link-color:var(--color-secondary-600)}.kanban{align-items:flex-start;display:flex;flex-direction:column;min-width:-moz-fit-content;min-width:fit-content;position:relative}.kanban-header{display:flex;flex-direction:row;height:var(--kanban-header-height)}.kanban.has-sub-cols .kanban-header{height:calc(var(--kanban-header-height)*2)}.kanban-header-lane-name{background-color:rgba(var(--color-fore-rgb),.05);flex:none;width:var(--kanban-lane-name-width)}.kanban-header-cols,.kanban-header-sub-cols{display:flex;flex:1 1 0%;flex-direction:row;gap:var(--kanban-cols-gap)}.kanban-header-sub-cols{border-top-width:2px;--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity))}.kanban-header-col{align-items:center;border-bottom-width:1px;display:flex;flex:1 1 0%;flex-direction:column;height:100%;width:var(--kanban-col-width)}.kanban-header-col.has-subs{width:auto}.kanban-header-col-wrapper{align-items:center;display:flex;flex:1 1 0%;flex-direction:row;position:relative;width:100%;--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));padding-left:3.5rem;padding-right:3.5rem}.kanban-header-col-wrapper.is-align-left{justify-content:flex-start;padding-left:.5rem}.kanban-header-col-wrapper.is-align-left>.kanban-header-title{justify-content:flex-start}.kanban-header-title{align-items:center;display:flex;flex:1 1 auto;flex-direction:row;justify-content:center;overflow:hidden}.kanban-header-title>.as-title{color:var(--kanban-col-color);font-weight:700;overflow:hidden;white-space:nowrap}.kanban-header-col-actions{bottom:.25rem;position:absolute;right:.25rem;top:.25rem}.kanban-header-col-actions>.btn{opacity:.6}.kanban-header-col-actions>.btn:hover{opacity:1}.kanban-body{display:flex;flex-direction:column;gap:var(--kanban-lanes-gap)}.kanban-lane{display:flex;flex-direction:row;height:var(--kanban-lane-height);min-height:96px}.kanban-lane-name{align-items:center;background-color:var(--kanban-lane-color);display:flex;justify-content:center;width:var(--kanban-lane-name-width);--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity));writing-mode:vertical-rl}.kanban-lane-actions,.kanban-lane-name{flex:none;position:relative}.kanban-lane.is-first .kanban-lane-actions{margin-top:calc(4px - var(--kanban-header-height))}.has-sub-cols .kanban-lane.is-first .kanban-lane-actions{margin-top:calc(4px - var(--kanban-header-height)*2)}.kanban-lane-actions>.btn.square{width:var(--kanban-lane-name-width)}.kanban-lane-title{align-items:center;display:flex;flex:1 1 auto;justify-content:center;overflow:hidden;white-space:nowrap}.kanban-lane-cols{display:flex;flex-direction:row;gap:var(--kanban-cols-gap)}.kanban-lane-col{background-color:rgba(var(--color-inverse-rgb),.05);display:flex;flex-direction:column;height:100%;width:var(--kanban-col-width)}.kanban-header-col,.kanban-lane-col{margin-left:calc(var(--kanban-col-gap-left) - var(--kanban-cols-gap));margin-right:calc(var(--kanban-col-gap-right) - var(--kanban-cols-gap))}.kanban-col-content{position:relative;z-index:5}.kanban-lane.is-first>.kanban-lane-name:before{background-color:var(--kanban-lane-color);bottom:100%;display:block;height:var(--kanban-header-height);left:0;position:absolute;right:0;--tw-content:"";content:var(--tw-content)}.kanban.has-sub-cols .kanban-lane.is-first>.kanban-lane-name:before{height:calc(var(--kanban-header-height)*2)}.kanban-lane{margin-bottom:calc(var(--kanban-col-gap-bottom) - var(--kanban-lanes-gap));margin-top:calc(var(--kanban-col-gap-top) - var(--kanban-lanes-gap))}.kanban-items{flex:1 1 auto;overflow:auto;scrollbar-gutter:both-edges stable}.kanban-lane.is-auto-height .kanban-items{scrollbar-gutter:auto}.kanban-item{cursor:default}.kanban-item .card-actions{z-index:5}.kanban-heading{width:100%}.kanban-heading .listitem{height:2.25rem}.kanban-heading .item-title{font-weight:700}.kanban.has-dragging{cursor:move}.kanban-item.is-dragging{cursor:move;opacity:.1}.kanban-sticky .kanban-header{position:sticky;top:0;z-index:10;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.kanban-sticky .kanban-header.is-pinned{border-bottom-color:rgba(var(--color-inverse-rgb),.15);border-bottom-width:1px;z-index:20;--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.kanban-sticky .kanban-lane-name{left:0;position:sticky;z-index:21}.kanban-region{border-radius:var(--radius);min-width:-moz-fit-content;min-width:fit-content;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));padding:.75rem;--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.kanban-region>.kanban+.kanban{margin-top:.75rem}.kanban-region.has-heading{padding-top:0}.kanban-heading>.listitem{left:.75rem;position:sticky;width:calc(var(--kanban-list-width) - 24px)}.kanban-list{display:flex;flex-direction:column;gap:.75rem;height:100vh;overflow:auto;position:relative;scrollbar-gutter:stable}.kanban-list.is-moving{cursor:grabbing}.kanban-items.is-dropping{position:relative}.kanban-item.is-dropping{position:relative;transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.kanban-item.is-dropping:after,.kanban-items.is-dropping>.card-list:after{background-color:rgba(var(--color-warning-500-rgb),.5);border-radius:var(--radius-full);display:block;height:.25rem;--tw-content:"";content:var(--tw-content)}.kanban-item.is-dropping:after{left:.25rem;position:absolute;right:.25rem;top:-.25rem}.kanban-item.is-dropping[z-drop-side=before]{--tw-translate-y:0.25rem}.kanban-item.is-dropping[z-drop-side=after],.kanban-item.is-dropping[z-drop-side=before]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-item.is-dropping[z-drop-side=after]{--tw-translate-y:-0.25rem}.kanban-item.is-dropping[z-drop-side=after]:after{bottom:-.25rem;top:auto}.kanban-links{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:5}.kanban-list>.kanban-links{overflow:visible;z-index:11}.kanban-link{align-items:center;color:var(--kanban-link-color);display:flex;justify-content:center;position:absolute}.kanban-link>svg{position:absolute}.kanban-link-text{border-radius:var(--radius);height:1em;line-height:1;padding-left:.125rem;padding-right:.125rem;pointer-events:auto;position:relative;text-align:center;white-space:nowrap}.kanban-link-start-point{height:.5rem;width:.5rem;--tw-translate-x:-0.25rem;--tw-translate-y:-0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-start-point,.kanban-link-start-point:before{background-color:currentColor;border-radius:var(--radius-full);position:absolute}.kanban-link-start-point:before{bottom:-.25rem;display:block;left:-.25rem;opacity:.2;right:-.25rem;top:-.25rem;--tw-content:"";content:var(--tw-content)}.kanban-link path{pointer-events:auto}.kanban-link path+path{opacity:.6}.kanban-link.is-hover path+path{opacity:1;stroke-width:calc(var(--kanban-link-weight)*1.5)}.kanban-link-delete-btn{pointer-events:auto;--tw-scale-x:.75;--tw-scale-y:.75;opacity:0;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.is-hover .kanban-link-delete-btn,.kanban-link-delete-btn{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.is-hover .kanban-link-delete-btn{--tw-scale-x:1;--tw-scale-y:1;opacity:1}.is-adding-link{cursor:crosshair;-webkit-user-select:none;-moz-user-select:none;user-select:none}.kanban-link-editor{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:20}.kanban-link-editor-from,.kanban-link-editor-to{border-radius:var(--radius);--tw-shadow-color:rgb(var(--color-primary-500-rgb));--tw-shadow:var(--tw-shadow-colored);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-500-rgb),var(--tw-ring-opacity))}.kanban-link-editor-from,.kanban-link-editor-point,.kanban-link-editor-to{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);position:absolute}.kanban-link-editor-point{height:.5rem;pointer-events:auto;width:.5rem;--tw-translate-x:-0.25rem;--tw-translate-y:-0.25rem;border-radius:var(--radius-full);cursor:move;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));opacity:.5;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);--tw-ring-color:rgba(var(--color-primary-500-rgb),0.1);transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.kanban-link-editor-point.is-left{left:0;top:50%}.kanban-link-editor-point.is-right{right:0;top:50%;--tw-translate-x:0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-editor-point.is-top{left:50%;top:0}.kanban-link-editor-point.is-bottom{bottom:0;left:50%;--tw-translate-y:0.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.kanban-link-editor-point:hover{opacity:1;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-primary-500-rgb),0.5)}.tab-pane{display:none}.tab-pane.active{display:block}.has-sorting-col{cursor:move;--dtable-sorting-col-color:var(--color-primary-300);--dtable-hover-bg:transparent}.has-sorting-col .dtable-col-splitter{display:none}.dtable-cell.is-sorting-col-move{transition-duration:.15s;transition-property:left;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-cell.is-sorting-from-col{transition-duration:.1s}.dtable-cell.is-sorting-from-col:after{background-color:var(--dtable-sorting-col-color)!important;opacity:.1!important}.dtable-cell.is-sorting-from-col:before{border-left:1px solid var(--dtable-sorting-col-color);border-right:1px solid var(--dtable-sorting-col-color)}.dtable-header-cell.is-sortable-col{cursor:move}.has-sorting-col .scrollbar.is-horz{opacity:var(--scrollbar-opacity)!important}.has-sorting-col .dtable-scroll-shadow{visibility:visible}:root{--dtable-col-splitter-width:7px;--dtable-col-splitter-color:var(--color-primary-500)}.dtable-cell.has-col-resizing:after,.dtable-cell.has-col-splitter:hover:after{background:var(--dtable-col-splitter-color);opacity:.05}.dtable-col-splitter{background:var(--dtable-col-splitter-color);border-radius:var(--radius-full);bottom:0;cursor:ew-resize;opacity:0;position:absolute;right:calc(var(--dtable-col-splitter-width)/-2);top:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--dtable-col-splitter-width);z-index:20}.dtable-cell.has-col-splitter:hover .dtable-col-splitter{opacity:.3}.dtable-cell.has-col-resizing .dtable-col-splitter,.dtable-cell.has-col-splitter .dtable-col-splitter:hover{opacity:.5}.dtable.has-col-resizing .dtable-cell.has-col-splitter:not(.has-col-resizing) .dtable-col-splitter,.dtable.has-col-resizing .dtable-cell.has-col-splitter:not(.has-col-resizing):after{opacity:0}.dtable-col-splitter:after,.dtable-col-splitter:before{content:" ";display:block;height:.5rem;left:50%;margin-top:-.25rem;position:absolute;top:50%;width:1px;--tw-bg-opacity:1;background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity))}.dtable-col-splitter:before{margin-left:-1px}.dtable-col-splitter:after{margin-left:1px}.dtable.has-col-resizing{--dtable-hover-bg:transparent}.dtable.has-col-resizing,.has-col-resizing .dtable-header-cell{cursor:ew-resize!important}.dtable-cell.is-col-resizing:before{border-right:1px solid var(--dtable-col-splitter-color)}.dtable-cell.is-col-resizing:after{background:var(--dtable-col-splitter-color);opacity:.05}.has-col-resizing .scrollbar.is-horz{opacity:var(--scrollbar-opacity)!important}.dtable-cell.has-contextmenu-show:after{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));opacity:.1}.dtable{--dtable-header-bg:var(--color-surface-light);--dtable-footer-bg:var(--color-surface-light);--dtable-border-color:var(--color-border-light);--dtable-checked-border:var(--color-border);--dtable-checked-bg:var(--color-primary-50);--dtable-checked-bg-hover:var(--color-primary-100);--dtable-hover-bg:rgba(var(--color-gray-500-rgb),.05);--dtable-link-color:var(--color-link);--dtable-link-hover-color:var(--color-link-hover);--dtable-link-visited-color:var(--color-link-visited)}.dtable-cell-content[style*="--color-link"]{--dtable-link-hover-color:var(--color-link);--dtable-link-visited-color:var(--color-link)}.dtable-body .dtable-cell a{--dtable-link-color:var(--color-link)}.dtable-body .dtable-cell a:not(.btn){color:var(--dtable-link-color)}.dtable-body .dtable-cell a:not(.btn):visited{color:var(--dtable-link-visited-color)}.dtable-body .dtable-cell a:not(.btn):hover{color:var(--dtable-link-hover-color)}.dtable .btn-avatar{border-radius:var(--radius-full);gap:.25rem;height:1.25rem;--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity));padding-left:0;padding-right:.5rem;--tw-ring-color:transparent}.dtable .btn-avatar:hover{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dtable-nested-toggle{width:1rem}.dtable .toggle-icon{--toggle-icon-size:11px;border-radius:var(--radius);--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.dtable .toggle-icon:after,.dtable .toggle-icon:before{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-700-rgb),var(--tw-bg-opacity))}.dtable-footer>.toolbar{margin-right:.5rem}.dtable-header .dtable-cell[data-sort]>.dtable-cell-content>a:not(:hover){color:inherit}.dtable-assign-btn{align-items:center;border-radius:var(--radius-full);display:flex;flex-direction:row;height:1.25rem;padding-left:.375rem;padding-right:.375rem;--dtable-link-color:var(--color-fore)}.dtable-assign-btn:not(:hover){color:inherit}.dtable-assign-btn.is-me{--dtable-link-color:var(--color-warning-500)!important}.dtable-assign-btn:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.dtable-assign-btn>span{border-radius:var(--radius-full);line-height:20px;padding-left:.375rem;padding-right:.375rem}.dtable-assign-btn.is-unassigned>span{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity));--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.dtable-assign-btn.is-unassigned:hover>span{background-color:inherit;color:inherit;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.dtable-assign-btn>.icon{opacity:0;transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.dtable-assign-btn:not(.disabled):hover>.icon{opacity:1}.dtable-header .dtable-cell[data-type=assign]{padding-left:1.5rem}.dtable-cell-icon{order:-5}.dtable-custom-cell[data-type=control]{align-items:center;display:flex;justify-content:center;padding-left:.125rem;padding-right:.125rem;z-index:1}:root{--dtable-editing-color:var(--color-success-600)}.dtable-cell.is-editing:after{border-color:var(--dtable-editing-color);border-width:2px!important;opacity:1;z-index:20}.dtable-editing-input{height:100%;outline:2px solid transparent;outline-offset:2px;padding-left:.75rem;padding-right:.75rem;width:100%}:root{--dtable-selected-color:var(--color-success-500);--dtable-selected-bg:var(--color-success-50);--dtable-selecting-bg:var(--color-success-100);--dtable-highlight-color:var(--color-success-700)}.dtable-selectable{-webkit-user-select:none;-moz-user-select:none;user-select:none}.dtable-cell.is-select:after{border-color:var(--dtable-selected-color);border-width:1px;opacity:1;z-index:10}.dtable-cell.is-selecting{background:var(--dtable-selecting-bg)}.dtable-cell.is-selected{background:var(--dtable-selected-bg)}.dtable-cell.is-col-selected:after,.dtable-cell.is-row-selected[data-col=INDEX]:after{background-color:rgba(var(--color-inverse-rgb),.05);opacity:1}.dtable-cell.has-cell-selected{color:var(--dtable-highlight-color)}.dtable-cell.is-first-row.is-select:after{top:0}.dtable-cell.is-last-row.is-select:after{bottom:1px}.dtable-cell.is-first-in-row.is-select:after{left:1px}.dtable-cell.is-last-in-row.is-select:after{right:1px}.dtable-datagrid .dtable-cell[data-col=INDEX]{background:var(--dtable-header-bg)}.dtable-empty-tip{min-height:212px}.dtable-cell[data-type=actions] .btn>.icon{font-size:1rem;line-height:1.5rem}.menu.menu-dtable-actions.has-icons{align-items:center;display:flex;gap:.25rem;min-width:auto;--menu-icon-opacity:1}.menu.menu-dtable-actions.has-icons>.menu-item>a{padding-left:.25rem;padding-right:.25rem}.menu.menu-dtable-actions.has-icons>.menu-item>a>.icon-EMPTY,.menu.menu-dtable-actions.has-icons>.menu-item>a>.item-content{display:none}.menu.menu-dtable-actions.has-icons>.menu-item>a>.icon-EMPTY+.item-content,.menu.menu-dtable-actions.has-icons>.menu-item>a>.item-content:first-child{display:block}:root{--state-color:rgba(0,0,0,.03);--zt-page-bg:#f8f9fa;--zt-header-height:3rem;--zt-header-bg:var(--color-canvas);--zt-header-color:var(--color-fore);--zt-sidebar-width:160px;--zt-navbar-active-color:var(--color-primary-500)}body{background-color:var(--zt-page-bg)}.page-app{overflow:overlay}.container{min-width:1200px}#header{height:var(--zt-header-height);--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);background:var(--zt-header-bg);border-bottom:1px solid var(--zt-header-border,rgba(var(--color-inverse-rgb),.05));box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);color:var(--zt-header-color)}#header>.container{height:100%;position:relative}#heading{align-items:center;bottom:0;display:flex;gap:.25rem;left:1rem;position:absolute;top:0}#heading>.toolbar{margin-left:-.75rem}#heading .dropmenu-btn>.text{max-width:142px}#heading>[data-zui-dropmenu]+div .dropmenu-btn>.text,#heading>[data-zui-dropmenu]+div+div .dropmenu-btn>.text{max-width:78px}#navbar{align-items:center;display:flex;font-size:.875rem;height:100%;justify-content:center;line-height:1.3rem;--state-color:rgba(var(--color-primary-500-rgb),.05);--state-active-opacity:1;--state-active-color:rgba(var(--color-primary-500-rgb),.08)}#navbar>.nav{--nav-active-color:var(--zt-navbar-active-color,var(--color-current));--nav-item-padding:12px;--nav-divider-margin:8px;margin-left:var(--nav-offset-left)}#navbar>.nav>.nav-item>a{height:3rem;padding-left:var(--nav-item-padding);padding-right:var(--nav-item-padding)}#navbar>.nav>.nav-item>a:before{--tw-scale-x:1!important;--tw-scale-y:1!important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)!important;--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)!important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)!important}#navbar>.nav>.nav-item>a.active:before{background:var(--state-active-color)!important;opacity:1!important}#navbar>.nav>.divider{align-self:center;height:1.25rem;margin-left:var(--nav-divider-margin);margin-right:var(--nav-divider-margin);opacity:.2}#navbar>.nav.compact{font-size:.8125rem;line-height:1.25rem}#navbar>.nav.compact-extra{font-size:.75rem;line-height:1rem}#toolbar{align-items:center;bottom:0;display:flex;gap:.25rem;position:absolute;right:1rem;top:0}#main{min-height:100vh}#header+#main{min-height:calc(100vh - 3rem)}#main>.container{padding-left:1rem;padding-right:1rem;position:relative}@media (min-width:1400px){#header>.container,#main>.container,#mainNavbar>.container{padding-left:2.5rem;padding-right:2.5rem}#heading{left:2.5rem}#toolbar{right:2.5rem}}#mainNavbar{height:2.75rem;--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}#mainNavbar>.container{position:relative}#mainNavbar .nav{bottom:0;height:2.75rem;justify-content:center;left:0;position:absolute;right:0;top:0}#mainNavbar .nav-item{font-size:.875rem;line-height:1.3rem}#mainNavbar .nav-item>a{border-radius:var(--radius)}#mainMenu{gap:1rem;justify-content:space-between;padding-bottom:.75rem;padding-top:.75rem}#featureBar,#mainMenu{align-items:center;display:flex}#featureBar{flex:1 1 auto;gap:.5rem}#actionBar{gap:.5rem}#actionBar>.nav-divider{margin-left:-.25rem;margin-right:-.25rem}#mainContent{padding-top:.75rem}#mainMenu+#mainContent{padding-top:0}#mainContent.row{align-items:stretch;display:flex;gap:1rem;justify-content:space-between}#mainContent.row>*{flex:1 1 auto;min-width:0}#mainContainer.has-sidebar-left{--gutter-left-size:16px}#mainContainer.is-sidebar-left-collapsed{--gutter-left-size:0}.has-sidebar-animation.has-sidebar-left #mainMenu{transition-duration:.15s;transition-property:padding-left;transition-timing-function:cubic-bezier(.4,0,.2,1)}:root{--modal-radius:var(--radius);--avatar-bg:var(--color-gray-200)}.modal-alert .modal-footer{justify-content:center}.modal-dialog{--tw-bg-opacity:1}.modal-content,.modal-dialog{max-height:calc(100vh - 4rem)}.modal-body,.modal-footer,.modal-header{padding:1.5rem 2rem}.modal-header{padding-right:3rem}.modal-body+.modal-footer,.modal-header+.modal-actions+.modal-body,.modal-header+.modal-body{padding-top:1px}.modal-condensed .modal-body,.modal-condensed .modal-header{padding:1rem 1.25rem}.modal-condensed .modal-actions{top:.75rem}:root{--label-bg:var(--color-gray-100);--label-color:var(--color-gray-800)}.label[class$=-pale],.label[class*="-pale "]{--tw-bg-opacity:0.4;--tw-ring-opacity:0.4}.body-modal .panel-form,.modal-body>.panel-form{margin:0;padding:0}.modal-body>.panel-form>.panel-heading{padding-left:1px;padding-right:1px;padding-top:1px}.modal-body>.panel-form>.panel-body{padding:1px}.modal-body>.form{padding-top:1px}.modal .history,.modal .panel-body>.form{padding:0}:root{--article-p-space:0}.lane-col-join-with-above{position:relative}.lane-col-join-with-above:before{background-color:inherit;left:0;position:absolute;right:0;--tw-content:"";content:var(--tw-content);height:var(--kanban-col-gap-top,var(--kanban-lanes-gap));top:calc(0px - var(--kanban-col-gap-top, var(--kanban-lanes-gap)))}.arrow,.arrow:before{background:inherit;height:calc(var(--arrow-size)*1.4142);position:absolute;width:calc(var(--arrow-size)*1.4142)}.arrow{visibility:hidden;--arrow-size:5px}.arrow:before{border:inherit;content:"";visibility:visible;--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.arrow-top,.arrow-up{border-bottom:inherit;border-right:inherit;border-width:1px 0 0 1px;top:calc(1px - var(--arrow-size))}.white>.arrow-top,.white>.arrow-up{top:calc(0px - var(--arrow-size))}.arrow-bottom,.arrow-down{border-left:inherit;border-top:inherit;border-width:0 1px 1px 0;bottom:calc(1px - var(--arrow-size))}.white>.arrow-bottom,.white>.arrow-down{bottom:calc(0px - var(--arrow-size))}.arrow-left{border-right:inherit;border-top:inherit;border-width:0 0 1px 1px;left:calc(1px - var(--arrow-size))}.white>.arrow-left{left:calc(0px - var(--arrow-size))}.arrow-right{border-bottom:inherit;border-left:inherit;border-width:1px 1px 0 0;right:calc(1px - var(--arrow-size))}.white>.arrow-right{right:calc(0px - var(--arrow-size))}.caret,.caret-down,.caret-left,.caret-right,.caret-up{align-items:center;display:inline-flex;height:.75rem;justify-content:center;position:relative;width:.75rem}.caret-down:before,.caret-left:before,.caret-right:before,.caret-up:before,.caret:before{display:block;height:.35rem;transform-origin:center;width:.35rem;--tw-translate-y:-1px;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.caret-left:before{--tw-translate-x:0.125rem;--tw-translate-y:0px;--tw-rotate:135deg}.caret-left:before,.caret-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.caret-right:before{--tw-translate-x:-0.125rem;--tw-translate-y:0px;--tw-rotate:-45deg}.caret-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:focus>.caret,:hover>.caret{opacity:inherit}.disabled .caret,.readonly .caret{opacity:var(--caret-opacity,.5)}:root{--toggle-icon-size:calc(var(--font-size-root)*3/4 + 1px)}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-color:currentColor;border-width:1px;display:block;opacity:.5;position:relative}.toggle-icon-collapse:hover,.toggle-icon-expand:hover,.toggle-icon:hover{opacity:.9}.toggle-icon,.toggle-icon-collapse,.toggle-icon-expand{border-radius:inherit;height:var(--toggle-icon-size);width:var(--toggle-icon-size)}.is-collapsed .toggle-icon:after,.is-collapsed .toggle-icon:before,.is-expanded .toggle-icon:before,.toggle-icon-collapse:after,.toggle-icon-collapse:before,.toggle-icon-expand:before{background-color:currentColor;content:" ";display:block;height:1px;left:2px;position:absolute;right:2px;top:calc((var(--toggle-icon-size) - 3px)/2)}.is-collapsed .toggle-icon:after,.toggle-icon-collapse:after{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close{aspect-ratio:1/1;display:block;position:relative;width:1em}.close:after,.close:before{content:"";display:block;height:1px;left:0;position:absolute;width:100%;--tw-rotate:45deg;background-color:currentColor;border-radius:var(--radius-full);top:calc(50% - .5px)}.close:after,.close:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.close:after{--tw-rotate:-45deg}.spinner,.spinner:after,.spinner:before{display:block;height:1em;position:relative;width:1em}.spinner:after,.spinner:before{border-radius:var(--radius-full);content:" ";position:absolute}.spinner:before{animation:-spin 1s cubic-bezier(.6,0,.4,1) infinite;border:.16667em solid transparent;border-top-color:currentcolor}.spinner:after{border:.16667em solid;opacity:.2}.magnifier{display:inline-block;height:1em;position:relative;width:1em}.magnifier:after,.magnifier:before{border-radius:var(--radius-full);content:"";display:block;position:absolute}.magnifier:before{border:1px solid;height:.75em;width:.75em}.magnifier:after{height:1px;left:.55em;top:.7em;width:.5em;--tw-rotate:45deg;background-color:currentColor;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.more,.more-vert{margin:.5rem;position:relative}.more,.more-vert,.more-vert:after,.more-vert:before,.more:after,.more:before{background-color:currentColor;border-radius:var(--radius-full);height:.125rem;width:.125rem}.more-vert:after,.more-vert:before,.more:after,.more:before{display:block;left:-5px;position:absolute;top:0;--tw-content:"";content:var(--tw-content)}.more-vert:after,.more:after{left:5px}.more-vert{--tw-rotate:90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-down,.chevron-left,.chevron-right,.chevron-up{align-items:center;display:inline-flex;height:1em;justify-content:center;position:relative;width:1em}.chevron-down:before,.chevron-left:before,.chevron-right:before,.chevron-up:before{display:block;height:.6923077em;transform-origin:center;width:.6923077em;--tw-translate-y:-0.125rem;--tw-rotate:45deg;border-color:currentColor;border-width:0 1px 1px 0;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-content:"";content:var(--tw-content)}.chevron-left:before{--tw-translate-y:0px;--tw-translate-x:0.125rem;--tw-rotate:135deg}.chevron-left:before,.chevron-right:before{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chevron-right:before{--tw-translate-y:0px;--tw-translate-x:-0.125rem;--tw-rotate:-45deg}.chevron-up:before{--tw-translate-y:0.125rem;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.i-time{border-color:currentColor;border-radius:50%;border-width:.08em;display:inline-block;height:1em;position:relative;width:1em}.i-time:after{border-color:currentColor;border-width:0 0 .08em .08em;height:.385em;left:.3846em;position:absolute;top:.08em;width:.385em;--tw-content:"";content:var(--tw-content)}.i-calendar{border-color:currentColor;border-radius:2px;border-width:.08em;display:inline-block;height:.79em;margin-top:.16em;position:relative;width:1em}.i-calendar:after,.i-calendar:before{border-color:currentColor;border-width:.08em;position:absolute;--tw-content:"";content:var(--tw-content)}.i-calendar:before{border-bottom-width:0;left:.15em;top:.307em;width:.6em}.i-calendar:after{border-bottom-width:0;border-top-width:0;height:.3077em;left:.17em;top:-.154em;width:.538em}:root{--state-color:rgba(0,0,0,.05);--state-scale:.9;--opacity-disabled:.7;--opacity-muted:.5;--load-indicator-duration:300ms;--load-indicator-delay:.5s}.btn,.item>a,.state{cursor:pointer;position:relative}.btn:before,.item>a:before,.state:before{background:var(--state-color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transform:scale(var(--state-scale));transition-duration:.2s;transition-property:opacity,transform,box-shadow,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn.active:not(:hover,:focus-visible,:focus-within,:active):before,.item>a.active:not(:hover,:focus-visible,:focus-within,:active):before,.state.active:not(:hover,:focus-visible,:focus-within,:active):before{background:var(--state-active-color,var(--state-color));opacity:var(--state-active-opacity,0);--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-duration:.7s}.btn.selected:not(:hover,:focus-visible,:focus-within,:active):before,.item>a.selected:not(:hover,:focus-visible,:focus-within,:active):before,.state.selected:not(:hover,:focus-visible,:focus-within,:active):before{background:var(--state-selected-color,var(--state-scale));opacity:var(--state-selected-opacity,.1);--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:focus-visible,.item>a:focus-visible,.state:focus-visible{outline:2px solid transparent;outline-offset:2px}.btn:active:before,.btn:focus-visible:before,.btn:hover:before,.item>a:active:before,.item>a:focus-visible:before,.item>a:hover:before,.state:active:before,.state:focus-visible:before,.state:hover:before{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.btn:hover:before,.item>a:hover:before,.state:hover:before{opacity:var(--state-hover-opacity,1)}.btn:active:before,.item>a:active:before,.state:active:before{background:var(--state-pressed-color,var(--state-color));opacity:var(--state-pressed-opacity,.6);--tw-ring-color:var(--state-ring-color,currentColor);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);transition-duration:.7s}.btn:focus-visible:before,.item>a:focus-visible:before,.state:focus-visible:before{background:var(--state-focus-color,var(--state-color));opacity:var(--state-focus-opacity,1);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-focus-rgb),var(--tw-ring-opacity))}.btn.disabled:before,.btn[disabled]:before,.item>a.disabled:before,.item>a[disabled]:before,.state.disabled:before,.state[disabled]:before{display:none}.btn{--state-active-opacity:1}@-moz-document url-prefix(){.btn,:root{--state-active-opacity:0;--state-focus-opacity:0}}.disabled,.disabled *,[disabled],[disabled] *{cursor:not-allowed!important;opacity:var(--opacity-disabled);--tw-grayscale:grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.load-indicator:after,.load-indicator:before{display:block;opacity:0;position:absolute;transition-delay:0s;transition-duration:.15s;transition-duration:var(--load-indicator-duration);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden}.load-indicator:before{align-items:center;background-color:rgba(var(--color-canvas-rgb),.7);border-radius:inherit;bottom:0;display:flex;font-size:.75rem;justify-content:center;left:0;line-height:1rem;right:0;top:0;z-index:99;--tw-content:attr(data-loading);content:var(--tw-content)}.load-indicator[data-loading]:before{padding-top:3.5rem}.load-indicator:after{border-color:transparent currentcolor currentcolor;border-radius:var(--radius-full);border-style:dotted;border-width:4px 3px 4px 4px;height:2rem;left:50%;margin-left:-1rem;margin-top:-1rem;top:50%;width:2rem;z-index:100;--tw-content:"";content:var(--tw-content)}.load-indicator.loading:after,.load-indicator.loading:before{opacity:1;transition-delay:var(--load-indicator-delay);visibility:visible}@keyframes -spin{to{transform:rotate(1turn)}}.load-indicator.loading:after{animation:-spin 1s linear infinite;opacity:.5}.events-none,.pointer-events-none{pointer-events:none}.events-auto,.pointer-events-auto{pointer-events:auto}.scroll-auto{scroll-behavior:auto}.scroll-smooth{scroll-behavior:smooth}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;-moz-user-select:auto;user-select:auto}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.active\:opacity-100.active,.active\:opacity-100:active,.group.active .group-active\:opacity-100,.group:active .group-active\:opacity-100,.group:hover .group-hover\:opacity-100,.hover\:opacity-100:hover{opacity:1}.active\:opacity-0.active,.active\:opacity-0:active,.group.active .group-active\:opacity-0,.group:active .group-active\:opacity-0,.group:hover .group-hover\:opacity-0,.hover\:opacity-0:hover{opacity:0}.active\:text-primary.active,.active\:text-primary:active,.group.active .group-active\:text-primary,.group:active .group-active\:text-primary,.group:hover .group-hover\:text-primary,.hover\:text-primary:hover{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.active\:border-primary.active,.active\:border-primary:active,.group.active .group-active\:border-primary,.group:active .group-active\:border-primary,.group:hover .group-hover\:border-primary,.hover\:border-primary:hover{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity))}.active\:primary-pale.active,.active\:primary-pale:active,.group.active .group-active\:primary-pale,.group:active .group-active\:primary-pale,.group:hover .group-hover\:primary-pale,.hover\:primary-pale:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.active\:primary.active,.active\:primary:active,.group.active .group-active\:primary,.group:active .group-active\:primary,.group:hover .group-hover\:primary,.hover\:primary:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.active\:canvas.active,.active\:canvas:active,.group.active .group-active\:canvas,.group:active .group-active\:canvas,.group:hover .group-hover\:canvas,.hover\:canvas:hover{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.active\:font-bold.active,.active\:font-bold:active,.group.active .group-active\:font-bold,.group:active .group-active\:font-bold,.group:hover .group-hover\:font-bold,.hover\:font-bold:hover{font-weight:700}.active\:shadow.active,.active\:shadow:active,.group.active .group-active\:shadow,.group:active .group-active\:shadow,.group:hover .group-hover\:shadow,.hover\:shadow:hover{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.active\:shadow-lg.active,.active\:shadow-lg:active,.group.active .group-active\:shadow-lg,.group:active .group-active\:shadow-lg,.group:hover .group-hover\:shadow-lg,.hover\:shadow-lg:hover{--tw-shadow:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--tw-shadow-colored:0 5px 15px -3px var(--tw-shadow-color),0 2px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.group:hover .group-hover\:block,.hover\:block:hover{display:block!important}.group:hover .group-hover\:flex,.hover\:flex:hover{display:flex!important}.group:hover .group-hover\:inline-flex,.hover\:inline-flex:hover{display:inline-flex!important}.group:hover .group-hover\:scale-110,.hover\:scale-110:hover{--tw-scale-x:1.1!important;--tw-scale-y:1.1!important}.group:hover .group-hover\:scale-110,.group:hover .group-hover\:scale-125,.hover\:scale-110:hover,.hover\:scale-125:hover{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.group:hover .group-hover\:scale-125,.hover\:scale-125:hover{--tw-scale-x:1.25!important;--tw-scale-y:1.25!important}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:16/9}.container{width:100%}@media (min-width:1720px){.container{max-width:1720px}}.container{margin-left:auto;margin-right:auto}.popup{background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity));border-radius:var(--radius);--tw-bg-opacity:0.85;--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05;--tw-backdrop-blur:blur(16px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.hidden{display:none!important}.pull-right{float:right}.pull-left{float:left}.clearfix:after{clear:both;content:"";display:block}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.object-fill{-o-object-fit:fill;object-fit:fill}.object-none{-o-object-fit:none;object-fit:none}.object-scale-down{-o-object-fit:scale-down;object-fit:scale-down}.object-bottom{-o-object-position:bottom;object-position:bottom}.object-center{-o-object-position:center;object-position:center}.object-left{-o-object-position:left;object-position:left}.object-left-bottom{-o-object-position:left bottom;object-position:left bottom}.object-left-top{-o-object-position:left top;object-position:left top}.object-right{-o-object-position:right;object-position:right}.object-right-bottom{-o-object-position:right bottom;object-position:right bottom}.object-right-top{-o-object-position:right top;object-position:right top}.object-top{-o-object-position:top;object-position:top}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-clip{overflow:clip}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-clip{overflow-x:clip}.overflow-y-clip{overflow-y:clip}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.overflow-overlay{overflow:overlay}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{bottom:0;left:0;right:0;top:0}.inset-auto{bottom:auto;left:auto;right:auto;top:auto}.inset-x-0{left:0;right:0}.inset-y-0{bottom:0;top:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-full{top:100%}.right-full{right:100%}.bottom-full{bottom:100%}.left-full{left:100%}.top-auto{top:auto}.right-auto{right:auto}.bottom-auto{bottom:auto}.left-auto{left:auto}.top-px{top:1px}.right-px{right:1px}.bottom-px{bottom:1px}.left-px{left:1px}.top-0\.5{top:.125rem}.right-0\.5{right:.125rem}.bottom-0\.5{bottom:.125rem}.left-0\.5{left:.125rem}.top-1{top:.25rem}.right-1{right:.25rem}.bottom-1{bottom:.25rem}.left-1{left:.25rem}.top-1\.5{top:.375rem}.right-1\.5{right:.375rem}.bottom-1\.5{bottom:.375rem}.left-1\.5{left:.375rem}.top-2{top:.5rem}.right-2{right:.5rem}.bottom-2{bottom:.5rem}.left-2{left:.5rem}.top-2\.5{top:.625rem}.right-2\.5{right:.625rem}.bottom-2\.5{bottom:.625rem}.left-2\.5{left:.625rem}.top-3{top:.75rem}.right-3{right:.75rem}.bottom-3{bottom:.75rem}.left-3{left:.75rem}.top-3\.5{top:.875rem}.right-3\.5{right:.875rem}.bottom-3\.5{bottom:.875rem}.left-3\.5{left:.875rem}.top-4{top:1rem}.right-4{right:1rem}.bottom-4{bottom:1rem}.left-4{left:1rem}.top-5{top:1.25rem}.right-5{right:1.25rem}.bottom-5{bottom:1.25rem}.left-5{left:1.25rem}.top-6{top:1.5rem}.right-6{right:1.5rem}.bottom-6{bottom:1.5rem}.left-6{left:1.5rem}.top-7{top:1.75rem}.right-7{right:1.75rem}.bottom-7{bottom:1.75rem}.left-7{left:1.75rem}.top-8{top:2rem}.right-8{right:2rem}.bottom-8{bottom:2rem}.left-8{left:2rem}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-0{z-index:0}.z-1{z-index:1}.z-5{z-index:5}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.z-base{z-index:1100}.z-above{z-index:50}.z-below{z-index:-50}.z-dropdown{z-index:1200}.z-sticky{z-index:1300}.z-fixed{z-index:1400}.z-modal{z-index:1500}.z-overlay{z-index:1600}.z-popover{z-index:1700}.z-tooltip{z-index:1800}.z-messager{z-index:1900}.m-0{margin:0}.m-auto{margin:auto}.m-px{margin:1px}.m-0\.5{margin:.125rem}.m-1{margin:.25rem}.m-1\.5{margin:.375rem}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.m-3{margin:.75rem}.m-3\.5{margin:.875rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-7{margin:1.75rem}.m-8{margin:2rem}.m-9{margin:2.25rem}.m-10{margin:2.5rem}.mx-0{margin-left:0;margin-right:0}.my-0{margin-bottom:0}.mt-0,.my-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mx-auto{margin-left:auto;margin-right:auto}.my-auto{margin-bottom:auto}.mt-auto,.my-auto{margin-top:auto}.mr-auto{margin-right:auto}.mb-auto{margin-bottom:auto}.ml-auto{margin-left:auto}.mx-px{margin-left:1px;margin-right:1px}.my-px{margin-bottom:1px}.mt-px,.my-px{margin-top:1px}.mr-px{margin-right:1px}.mb-px{margin-bottom:1px}.ml-px{margin-left:1px}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.my-0\.5{margin-bottom:.125rem}.mt-0\.5,.my-0\.5{margin-top:.125rem}.mr-0\.5{margin-right:.125rem}.mb-0\.5{margin-bottom:.125rem}.ml-0\.5{margin-left:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-1{margin-bottom:.25rem}.mt-1,.my-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.my-1\.5{margin-bottom:.375rem}.mt-1\.5,.my-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mb-1\.5{margin-bottom:.375rem}.ml-1\.5{margin-left:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-2{margin-bottom:.5rem}.mt-2,.my-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.my-2\.5{margin-bottom:.625rem}.mt-2\.5,.my-2\.5{margin-top:.625rem}.mr-2\.5{margin-right:.625rem}.mb-2\.5{margin-bottom:.625rem}.ml-2\.5{margin-left:.625rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-3{margin-bottom:.75rem}.mt-3,.my-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.my-3\.5{margin-bottom:.875rem}.mt-3\.5,.my-3\.5{margin-top:.875rem}.mr-3\.5{margin-right:.875rem}.mb-3\.5{margin-bottom:.875rem}.ml-3\.5{margin-left:.875rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-4{margin-bottom:1rem}.mt-4,.my-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.my-5{margin-bottom:1.25rem}.mt-5,.my-5{margin-top:1.25rem}.mr-5{margin-right:1.25rem}.mb-5{margin-bottom:1.25rem}.ml-5{margin-left:1.25rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-6{margin-bottom:1.5rem}.mt-6,.my-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mx-7{margin-left:1.75rem;margin-right:1.75rem}.my-7{margin-bottom:1.75rem}.mt-7,.my-7{margin-top:1.75rem}.mr-7{margin-right:1.75rem}.mb-7{margin-bottom:1.75rem}.ml-7{margin-left:1.75rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-8{margin-bottom:2rem}.mt-8,.my-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.ml-8{margin-left:2rem}.mx-9{margin-left:2.25rem;margin-right:2.25rem}.my-9{margin-bottom:2.25rem}.mt-9,.my-9{margin-top:2.25rem}.mr-9{margin-right:2.25rem}.mb-9{margin-bottom:2.25rem}.ml-9{margin-left:2.25rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.my-10{margin-bottom:2.5rem}.mt-10,.my-10{margin-top:2.5rem}.mr-10{margin-right:2.5rem}.mb-10{margin-bottom:2.5rem}.ml-10{margin-left:2.5rem}.p-0{padding:0}.p-px{padding:1px}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-7{padding:1.75rem}.p-8{padding:2rem}.p-9{padding:2.25rem}.p-10{padding:2.5rem}.px-0{padding-left:0;padding-right:0}.py-0{padding-bottom:0}.pt-0,.py-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.px-px{padding-left:1px;padding-right:1px}.py-px{padding-bottom:1px}.pt-px,.py-px{padding-top:1px}.pr-px{padding-right:1px}.pb-px{padding-bottom:1px}.pl-px{padding-left:1px}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.py-0\.5{padding-bottom:.125rem}.pt-0\.5,.py-0\.5{padding-top:.125rem}.pr-0\.5{padding-right:.125rem}.pb-0\.5{padding-bottom:.125rem}.pl-0\.5{padding-left:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-1{padding-bottom:.25rem}.pt-1,.py-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.py-1\.5{padding-bottom:.375rem}.pt-1\.5,.py-1\.5{padding-top:.375rem}.pr-1\.5{padding-right:.375rem}.pb-1\.5{padding-bottom:.375rem}.pl-1\.5{padding-left:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-2{padding-bottom:.5rem}.pt-2,.py-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.py-2\.5{padding-bottom:.625rem}.pt-2\.5,.py-2\.5{padding-top:.625rem}.pr-2\.5{padding-right:.625rem}.pb-2\.5{padding-bottom:.625rem}.pl-2\.5{padding-left:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-3{padding-bottom:.75rem}.pt-3,.py-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.py-3\.5{padding-bottom:.875rem}.pt-3\.5,.py-3\.5{padding-top:.875rem}.pr-3\.5{padding-right:.875rem}.pb-3\.5{padding-bottom:.875rem}.pl-3\.5{padding-left:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.py-4{padding-bottom:1rem}.pt-4,.py-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-5{padding-bottom:1.25rem}.pt-5,.py-5{padding-top:1.25rem}.pr-5{padding-right:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-6{padding-bottom:1.5rem}.pt-6,.py-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-7{padding-bottom:1.75rem}.pt-7,.py-7{padding-top:1.75rem}.pr-7{padding-right:1.75rem}.pb-7{padding-bottom:1.75rem}.pl-7{padding-left:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-8{padding-bottom:2rem}.pt-8,.py-8{padding-top:2rem}.pr-8{padding-right:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.py-9{padding-bottom:2.25rem}.pt-9,.py-9{padding-top:2.25rem}.pr-9{padding-right:2.25rem}.pb-9{padding-bottom:2.25rem}.pl-9{padding-left:2.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-10{padding-bottom:2.5rem}.pt-10,.py-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(0px*(1 - var(--tw-space-x-reverse)));margin-right:calc(0px*var(--tw-space-x-reverse))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.125rem*var(--tw-space-x-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.375rem*var(--tw-space-x-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.625rem*var(--tw-space-x-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.625rem*var(--tw-space-y-reverse));margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.875rem*var(--tw-space-x-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.875rem*var(--tw-space-y-reverse));margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.75rem*var(--tw-space-x-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.75rem*var(--tw-space-y-reverse));margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.25rem*var(--tw-space-x-reverse))}.space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2.25rem*var(--tw-space-y-reverse));margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2.5rem*var(--tw-space-x-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2.5rem*var(--tw-space-y-reverse));margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(1px*var(--tw-space-x-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1px*var(--tw-space-y-reverse));margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))}.w-0{width:0}.w-px{width:1px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-32{width:8rem}.w-36{width:9rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-52{width:13rem}.w-56{width:14rem}.w-60{width:15rem}.w-64{width:16rem}.w-72{width:18rem}.w-80{width:20rem}.w-96{width:24rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-1\/6{width:16.666667%}.w-2\/6{width:33.333333%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.w-min{width:-moz-min-content;width:min-content}.w-max{width:-moz-max-content;width:max-content}.w-fit{width:-moz-fit-content;width:fit-content}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-min{min-width:-moz-min-content;min-width:min-content}.min-w-max{min-width:-moz-max-content;min-width:max-content}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.max-w-0{max-width:0}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.h-0{height:0}.h-px{height:1px}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-32{height:8rem}.h-36{height:9rem}.h-40{height:10rem}.h-44{height:11rem}.h-48{height:12rem}.h-52{height:13rem}.h-56{height:14rem}.h-60{height:15rem}.h-64{height:16rem}.h-72{height:18rem}.h-80{height:20rem}.h-96{height:24rem}.h-1\/2{height:50%}.h-1\/3{height:33.333333%}.h-2\/3{height:66.666667%}.h-1\/4{height:25%}.h-2\/4{height:50%}.h-3\/4{height:75%}.h-1\/5{height:20%}.h-2\/5{height:40%}.h-3\/5{height:60%}.h-4\/5{height:80%}.h-1\/6{height:16.666667%}.h-2\/6{height:33.333333%}.h-3\/6{height:50%}.h-4\/6{height:66.666667%}.h-5\/6{height:83.333333%}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.h-min{height:-moz-min-content;height:min-content}.h-max{height:-moz-max-content;height:max-content}.h-fit{height:-moz-fit-content;height:fit-content}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-min{min-height:-moz-min-content;min-height:min-content}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-fit{min-height:-moz-fit-content;min-height:fit-content}.max-h-0{max-height:0}.max-h-px{max-height:1px}.max-h-none{max-height:none}.max-h-full{max-height:100%}.max-h-min{max-height:-moz-min-content;max-height:min-content}.max-h-screen{max-height:100vh}.max-h-max{max-height:-moz-max-content;max-height:max-content}.max-h-fit{max-height:-moz-fit-content;max-height:fit-content}.canvas,.surface,.surface-light,.surface-strong{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}.canvas{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.surface-light{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-light-rgb),var(--tw-ring-opacity))}.surface{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-rgb),var(--tw-ring-opacity))}.surface-strong{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-strong-rgb),var(--tw-bg-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-strong-rgb),var(--tw-ring-opacity))}.inverse{background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity));color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.inverse,.white{--tw-bg-opacity:1;--tw-text-opacity:1}.white{background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity));color:rgba(var(--color-fore-in-light-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-white-rgb),var(--tw-ring-opacity))}.black{--tw-bg-opacity:1;background-color:rgba(var(--color-black-rgb),var(--tw-bg-opacity));--tw-text-opacity:1;color:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity));--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-black-rgb),var(--tw-ring-opacity))}.transparent{background-color:transparent;--tw-ring-color:transparent}.skin{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.skin:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger,.darken,.darker,.darkest,.gray,.gray-100,.gray-200,.gray-300,.gray-400,.gray-50,.gray-500,.gray-600,.gray-700,.gray-800,.gray-900,.gray-950,.important,.lighten,.lighter,.lightest,.primary,.secondary,.special,.success,.warning{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger:hover,.darken:hover,.darker:hover,.darkest:hover,.gray-100:hover,.gray-200:hover,.gray-300:hover,.gray-400:hover,.gray-500:hover,.gray-50:hover,.gray-600:hover,.gray-700:hover,.gray-800:hover,.gray-900:hover,.gray-950:hover,.gray:hover,.important:hover,.lighten:hover,.lighter:hover,.lightest:hover,.primary:hover,.secondary:hover,.special:hover,.success:hover,.warning:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger,.darken,.darker,.darkest,.gray,.gray-100,.gray-200,.gray-300,.gray-400,.gray-50,.gray-500,.gray-600,.gray-700,.gray-800,.gray-900,.gray-950,.important,.lighten,.lighter,.lightest,.primary,.secondary,.special,.success,.warning{--skin-text:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity));--skin-color:rgba(var(--skin-solid-rgb),1);--state-ring-color:var(--skin-color);--state-active-color:rgba(0,0,0,.1);--state-pressed-color:rgba(0,0,0,.1);--state-color:hsla(0,0%,100%,.1);--state-focus-color:rgba(0,0,0,.1)}.primary{--skin-solid-rgb:var(--color-primary-500-rgb)}.secondary{--skin-solid-rgb:var(--color-secondary-500-rgb)}.success{--skin-solid-rgb:var(--color-success-500-rgb)}.warning{--skin-solid-rgb:var(--color-warning-500-rgb)}.danger{--skin-solid-rgb:var(--color-danger-500-rgb)}.important{--skin-solid-rgb:var(--color-important-500-rgb)}.special{--skin-solid-rgb:var(--color-special-500-rgb)}.gray-50{--skin-bg:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity));--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-100{--skin-solid-rgb:var(--color-gray-100-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-200,.lightest{--skin-solid-rgb:var(--color-gray-200-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-300,.lighter{--skin-solid-rgb:var(--color-gray-300-rgb);--skin-text:rgba(var(--color-fore),var(--tw-text-opacity))}.gray-400,.lighten{--skin-solid-rgb:var(--color-gray-400-rgb)}.gray,.gray-500{--skin-solid-rgb:var(--color-gray-500-rgb)}.darken,.gray-600{--skin-solid-rgb:var(--color-gray-600-rgb)}.darker,.gray-700{--skin-solid-rgb:var(--color-gray-700-rgb)}.darkest,.gray-800{--skin-solid-rgb:var(--color-gray-800-rgb)}.gray-900{--skin-solid-rgb:var(--color-gray-900-rgb)}.gray-950{--skin-solid-rgb:var(--color-gray-950-rgb)}.danger-pale,.gray-100-pale,.gray-200-pale,.gray-300-pale,.gray-400-pale,.gray-50-pale,.gray-500-pale,.gray-600-pale,.gray-700-pale,.gray-800-pale,.gray-900-pale,.gray-950-pale,.gray-pale,.important-pale,.pale,.primary-pale,.secondary-pale,.special-pale,.success-pale,.warning-pale{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-pale:hover,.gray-100-pale:hover,.gray-200-pale:hover,.gray-300-pale:hover,.gray-400-pale:hover,.gray-50-pale:hover,.gray-500-pale:hover,.gray-600-pale:hover,.gray-700-pale:hover,.gray-800-pale:hover,.gray-900-pale:hover,.gray-950-pale:hover,.gray-pale:hover,.important-pale:hover,.pale:hover,.primary-pale:hover,.secondary-pale:hover,.special-pale:hover,.success-pale:hover,.warning-pale:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-pale,.gray-100-pale,.gray-200-pale,.gray-300-pale,.gray-400-pale,.gray-50-pale,.gray-500-pale,.gray-600-pale,.gray-700-pale,.gray-800-pale,.gray-900-pale,.gray-950-pale,.gray-pale,.important-pale,.pale,.primary-pale,.secondary-pale,.special-pale,.success-pale,.warning-pale{--skin-color:rgba(var(--skin-pale-rgb),.1);--skin-text:rgba(var(--skin-pale-rgb),1);--state-color:rgba(var(--skin-pale-rgb),.1)}.pale{--skin-pale-rgb:var(--color-gray-500-rgb)}.primary-pale{--skin-pale-rgb:var(--color-primary-500-rgb)}.secondary-pale{--skin-pale-rgb:var(--color-secondary-500-rgb)}.success-pale{--skin-pale-rgb:var(--color-success-500-rgb)}.warning-pale{--skin-pale-rgb:var(--color-warning-500-rgb)}.danger-pale{--skin-pale-rgb:var(--color-danger-500-rgb)}.important-pale{--skin-pale-rgb:var(--color-important-500-rgb)}.special-pale{--skin-pale-rgb:var(--color-special-500-rgb)}.gray-50-pale{--skin-pale-rgb:var(--color-gray-50-rgb);--skin-text:var(--color-gray-400)}.gray-100-pale{--skin-pale-rgb:var(--color-gray-100-rgb);--skin-text:var(--color-gray-400)}.gray-200-pale{--skin-pale-rgb:var(--color-gray-200-rgb);--skin-text:var(--color-gray-400)}.gray-300-pale{--skin-pale-rgb:var(--color-gray-300-rgb);--skin-text:var(--color-gray-500)}.gray-400-pale{--skin-pale-rgb:var(--color-gray-400-rgb);--skin-text:var(--color-gray-500)}.gray-500-pale,.gray-pale{--skin-pale-rgb:var(--color-gray-500-rgb)}.gray-600-pale{--skin-pale-rgb:var(--color-gray-600-rgb)}.gray-700-pale{--skin-pale-rgb:var(--color-gray-700-rgb)}.gray-800-pale{--skin-pale-rgb:var(--color-gray-800-rgb)}.gray-900-pale{--skin-pale-rgb:var(--color-gray-900-rgb)}.gray-950-pale{--skin-pale-rgb:var(--color-gray-950-rgb)}.danger-outline,.dark-outline,.gray-300-outline,.gray-400-outline,.gray-600-outline,.gray-outline,.important-outline,.light-outline,.outline,.primary-outline,.secondary-outline,.special-outline,.success-outline,.warning-outline{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-outline:hover,.dark-outline:hover,.gray-300-outline:hover,.gray-400-outline:hover,.gray-600-outline:hover,.gray-outline:hover,.important-outline:hover,.light-outline:hover,.outline:hover,.primary-outline:hover,.secondary-outline:hover,.special-outline:hover,.success-outline:hover,.warning-outline:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-outline,.dark-outline,.gray-300-outline,.gray-400-outline,.gray-600-outline,.gray-outline,.important-outline,.light-outline,.outline,.primary-outline,.secondary-outline,.special-outline,.success-outline,.warning-outline{--skin-text:var(--skin-color,inherit);--skin-bg:transparent;--skin-color:rgba(var(--skin-outline-rgb),1);--state-color:rgba(var(--skin-outline-rgb),.1)}.outline{--skin-outline-rgb:var(--color-fore-rgb)}.primary-outline{--skin-outline-rgb:var(--color-primary-500-rgb)}.secondary-outline{--skin-outline-rgb:var(--color-secondary-500-rgb)}.success-outline{--skin-outline-rgb:var(--color-success-500-rgb)}.warning-outline{--skin-outline-rgb:var(--color-warning-500-rgb)}.danger-outline{--skin-outline-rgb:var(--color-danger-500-rgb)}.important-outline{--skin-outline-rgb:var(--color-important-500-rgb)}.special-outline{--skin-outline-rgb:var(--color-special-500-rgb)}.gray-300-outline{--skin-text:var(--color-gray-500);--skin-outline-rgb:var(--color-gray-300-rgb)}.gray-400-outline{--skin-text:var(--color-gray-500);--skin-outline-rgb:var(--color-gray-400-rgb)}.gray-outline{--skin-outline-rgb:var(--color-gray-500-rgb)}.gray-600-outline{--skin-outline-rgb:var(--color-gray-600-rgb)}.dark-outline{--skin-outline-rgb:var(--color-inverse-rgb)}.light-outline{--skin-outline-rgb:var(--color-canvas-rgb)}.danger-ghost,.ghost,.important-ghost,.primary-ghost,.secondary-ghost,.special-ghost,.success-ghost,.warning-ghost{--skin-bg:var(--skin-color);--skin-ring:var(--skin-color);--skin-border:var(--skin-color);--skin-hover-text:var(--skin-text);--skin-hover-bg:var(--skin-bg);--tw-ring-color:var(--skin-ring);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);--color-link-hover:var(--skin-text);background-color:var(--skin-bg);border-color:var(--skin-border);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);color:var(--skin-text)}.danger-ghost:hover,.ghost:hover,.important-ghost:hover,.primary-ghost:hover,.secondary-ghost:hover,.special-ghost:hover,.success-ghost:hover,.warning-ghost:hover{background-color:var(--skin-hover-bg);color:var(--skin-hover-text)}.danger-ghost,.ghost,.important-ghost,.primary-ghost,.secondary-ghost,.special-ghost,.success-ghost,.warning-ghost{--tw-ring-opacity:0;--tw-bg-opacity:0;--skin-text:var(--skin-color,inherit);--skin-bg:transparent;--skin-ring:transparent;--skin-color:rgba(var(--skin-ghost-rgb),1);--state-color:rgba(var(--skin-ghost-rgb),.1)}.ghost{--skin-ghost-rgb:var(--color-fore-rgb);--skin-text:inherit}.primary-ghost{--skin-ghost-rgb:var(--color-primary-500-rgb)}.secondary-ghost{--skin-ghost-rgb:var(--color-secondary-500-rgb)}.success-ghost{--skin-ghost-rgb:var(--color-success-500-rgb)}.warning-ghost{--skin-ghost-rgb:var(--color-warning-500-rgb)}.danger-ghost{--skin-ghost-rgb:var(--color-danger-500-rgb)}.important-ghost{--skin-ghost-rgb:var(--color-important-500-rgb)}.special-ghost{--skin-ghost-rgb:var(--color-special-500-rgb)}.font-sans{font-family:-apple-system,Noto Sans,Helvetica Neue,Helvetica,Nimbus Sans L,Arial,Liberation Sans,PingFang SC,Hiragino Sans GB,Noto Sans CJK SC,Source Han Sans SC,Source Han Sans CN,Microsoft YaHei,Wenquanyi Micro Hei,WenQuanYi Zen Hei,ST Heiti,SimHei,WenQuanYi Zen Hei Sharp,sans-serif}.font-serif{font-family:Nimbus Roman No9 L,Songti SC,Noto Serif CJK SC,Source Han Serif SC,Source Han Serif CN,STSong,AR PL New Sung,AR PL SungtiL GB,NSimSun,SimSun,TW-Sung,WenQuanYi Bitmap Song,AR PL UMing CN,AR PL UMing HK,AR PL UMing TW,AR PL UMing TW MBE,PMingLiU,MingLiU,serif}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-root{font-size:16px}.text-sm{font-size:.75rem;line-height:1rem}.text-base{font-size:.8125rem;line-height:1.25rem}.text-md{font-size:.875rem;line-height:1.3rem}.text-lg{font-size:1rem;line-height:1.5rem}.text-xl{font-size:1.125rem;line-height:1.75rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.font-thin{font-weight:100}.font-light{font-weight:300}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-black{font-weight:900}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{-webkit-line-clamp:3}.line-clamp-3,.line-clamp-4{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-4{-webkit-line-clamp:4}.line-clamp-5{-webkit-line-clamp:5}.line-clamp-5,.line-clamp-6{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.line-clamp-6{-webkit-line-clamp:6}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.align-bottom{vertical-align:bottom}.align-sub{vertical-align:sub}.align-super{vertical-align:super}.text-primary{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.text-secondary{--tw-text-opacity:1;color:rgba(var(--color-secondary-500-rgb),var(--tw-text-opacity))}.text-success{--tw-text-opacity:1;color:rgba(var(--color-success-500-rgb),var(--tw-text-opacity))}.text-warning{--tw-text-opacity:1;color:rgba(var(--color-warning-500-rgb),var(--tw-text-opacity))}.text-danger{--tw-text-opacity:1;color:rgba(var(--color-danger-500-rgb),var(--tw-text-opacity))}.text-important{--tw-text-opacity:1;color:rgba(var(--color-important-500-rgb),var(--tw-text-opacity))}.text-special{--tw-text-opacity:1;color:rgba(var(--color-special-500-rgb),var(--tw-text-opacity))}.text-primary-50{--tw-text-opacity:1;color:rgba(var(--color-primary-50-rgb),var(--tw-text-opacity))}.text-primary-100{--tw-text-opacity:1;color:rgba(var(--color-primary-100-rgb),var(--tw-text-opacity))}.text-primary-200{--tw-text-opacity:1;color:rgba(var(--color-primary-200-rgb),var(--tw-text-opacity))}.text-primary-300{--tw-text-opacity:1;color:rgba(var(--color-primary-300-rgb),var(--tw-text-opacity))}.text-primary-400{--tw-text-opacity:1;color:rgba(var(--color-primary-400-rgb),var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(var(--color-primary-500-rgb),var(--tw-text-opacity))}.text-primary-600{--tw-text-opacity:1;color:rgba(var(--color-primary-600-rgb),var(--tw-text-opacity))}.text-primary-700{--tw-text-opacity:1;color:rgba(var(--color-primary-700-rgb),var(--tw-text-opacity))}.text-primary-800{--tw-text-opacity:1;color:rgba(var(--color-primary-800-rgb),var(--tw-text-opacity))}.text-primary-900{--tw-text-opacity:1;color:rgba(var(--color-primary-900-rgb),var(--tw-text-opacity))}.text-primary-950{--tw-text-opacity:1;color:rgba(var(--color-primary-950-rgb),var(--tw-text-opacity))}.text-secondary-50{--tw-text-opacity:1;color:rgba(var(--color-secondary-50-rgb),var(--tw-text-opacity))}.text-secondary-100{--tw-text-opacity:1;color:rgba(var(--color-secondary-100-rgb),var(--tw-text-opacity))}.text-secondary-200{--tw-text-opacity:1;color:rgba(var(--color-secondary-200-rgb),var(--tw-text-opacity))}.text-secondary-300{--tw-text-opacity:1;color:rgba(var(--color-secondary-300-rgb),var(--tw-text-opacity))}.text-secondary-400{--tw-text-opacity:1;color:rgba(var(--color-secondary-400-rgb),var(--tw-text-opacity))}.text-secondary-500{--tw-text-opacity:1;color:rgba(var(--color-secondary-500-rgb),var(--tw-text-opacity))}.text-secondary-600{--tw-text-opacity:1;color:rgba(var(--color-secondary-600-rgb),var(--tw-text-opacity))}.text-secondary-700{--tw-text-opacity:1;color:rgba(var(--color-secondary-700-rgb),var(--tw-text-opacity))}.text-secondary-800{--tw-text-opacity:1;color:rgba(var(--color-secondary-800-rgb),var(--tw-text-opacity))}.text-secondary-900{--tw-text-opacity:1;color:rgba(var(--color-secondary-900-rgb),var(--tw-text-opacity))}.text-secondary-950{--tw-text-opacity:1;color:rgba(var(--color-secondary-950-rgb),var(--tw-text-opacity))}.text-gray-50{--tw-text-opacity:1;color:rgba(var(--color-gray-50-rgb),var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgba(var(--color-gray-100-rgb),var(--tw-text-opacity))}.text-gray-200,.text-lightest{--tw-text-opacity:1;color:rgba(var(--color-gray-200-rgb),var(--tw-text-opacity))}.text-gray-300,.text-lighter{--tw-text-opacity:1;color:rgba(var(--color-gray-300-rgb),var(--tw-text-opacity))}.text-gray-400,.text-lighten{--tw-text-opacity:1;color:rgba(var(--color-gray-400-rgb),var(--tw-text-opacity))}.text-gray,.text-gray-500{--tw-text-opacity:1;color:rgba(var(--color-gray-500-rgb),var(--tw-text-opacity))}.text-darken,.text-gray-600{--tw-text-opacity:1;color:rgba(var(--color-gray-600-rgb),var(--tw-text-opacity))}.text-darker,.text-gray-700{--tw-text-opacity:1;color:rgba(var(--color-gray-700-rgb),var(--tw-text-opacity))}.text-darkest,.text-gray-800{--tw-text-opacity:1;color:rgba(var(--color-gray-800-rgb),var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgba(var(--color-gray-900-rgb),var(--tw-text-opacity))}.text-gray-950{--tw-text-opacity:1;color:rgba(var(--color-gray-950-rgb),var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(var(--color-white-rgb),var(--tw-text-opacity))}.text-black{--tw-text-opacity:1;color:rgba(var(--color-black-rgb),var(--tw-text-opacity))}.text-transparent{color:transparent}.text-canvas{--tw-text-opacity:1;color:rgba(var(--color-canvas-rgb),var(--tw-text-opacity))}.text-surface-light{--tw-text-opacity:1;color:rgba(var(--color-surface-light-rgb),var(--tw-text-opacity))}.text-surface{--tw-text-opacity:1;color:rgba(var(--color-surface-rgb),var(--tw-text-opacity))}.text-surface-strong{--tw-text-opacity:1;color:rgba(var(--color-surface-strong-rgb),var(--tw-text-opacity))}.text-inverse{--tw-text-opacity:1;color:rgba(var(--color-inverse-rgb),var(--tw-text-opacity))}.text-fore-in-light{--tw-text-opacity:1;color:rgba(var(--color-fore-in-light-rgb),var(--tw-text-opacity))}.text-fore-in-dark{--tw-text-opacity:1;color:rgba(var(--color-fore-in-dark-rgb),var(--tw-text-opacity))}.text-fore{--tw-text-opacity:1;color:rgba(var(--color-fore-rgb),var(--tw-text-opacity))}.text-focus{--tw-text-opacity:1;color:rgba(var(--color-focus-rgb),var(--tw-text-opacity))}.text-link{--tw-text-opacity:1;color:rgba(var(--color-link-rgb),var(--tw-text-opacity))}.text-link-hover{--tw-text-opacity:1;color:rgba(var(--color-link-hover-rgb),var(--tw-text-opacity))}.text-current{color:currentColor}.text-inherit{color:inherit}.clip,.ellipsis,.text-clip,.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.clip,.text-clip{text-overflow:clip}.whitespace-normal{white-space:normal}.nowrap,.whitespace-nowrap{white-space:nowrap}.pre,.whitespace-pre{white-space:pre}.pre-line,.whitespace-pre-line{white-space:pre-line}.pre-wrap,.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-opacity-0{--tw-text-opacity:0}.text-opacity-5{--tw-text-opacity:.05}.text-opacity-10{--tw-text-opacity:.1}.text-opacity-20{--tw-text-opacity:.2}.text-opacity-25{--tw-text-opacity:.25}.text-opacity-30{--tw-text-opacity:.3}.text-opacity-40{--tw-text-opacity:.4}.text-opacity-50{--tw-text-opacity:.5}.text-opacity-60{--tw-text-opacity:.6}.text-opacity-70{--tw-text-opacity:.7}.text-opacity-80{--tw-text-opacity:.8}.text-opacity-90{--tw-text-opacity:.9}.text-opacity-95{--tw-text-opacity:.95}.text-opacity-100{--tw-text-opacity:1}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.list-unstyled{list-style-type:none;padding-left:0}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.bg-primary{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity))}.bg-secondary{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-500-rgb),var(--tw-bg-opacity))}.bg-success{--tw-bg-opacity:1;background-color:rgba(var(--color-success-500-rgb),var(--tw-bg-opacity))}.bg-warning{--tw-bg-opacity:1;background-color:rgba(var(--color-warning-500-rgb),var(--tw-bg-opacity))}.bg-danger{--tw-bg-opacity:1;background-color:rgba(var(--color-danger-500-rgb),var(--tw-bg-opacity))}.bg-important{--tw-bg-opacity:1;background-color:rgba(var(--color-important-500-rgb),var(--tw-bg-opacity))}.bg-special{--tw-bg-opacity:1;background-color:rgba(var(--color-special-500-rgb),var(--tw-bg-opacity))}.bg-primary-50{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-50-rgb),var(--tw-bg-opacity))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-100-rgb),var(--tw-bg-opacity))}.bg-primary-200{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-200-rgb),var(--tw-bg-opacity))}.bg-primary-300{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-300-rgb),var(--tw-bg-opacity))}.bg-primary-400{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-400-rgb),var(--tw-bg-opacity))}.bg-primary-500{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-500-rgb),var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-600-rgb),var(--tw-bg-opacity))}.bg-primary-700{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-700-rgb),var(--tw-bg-opacity))}.bg-primary-800{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-800-rgb),var(--tw-bg-opacity))}.bg-primary-900{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-900-rgb),var(--tw-bg-opacity))}.bg-primary-950{--tw-bg-opacity:1;background-color:rgba(var(--color-primary-950-rgb),var(--tw-bg-opacity))}.bg-secondary-50{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-50-rgb),var(--tw-bg-opacity))}.bg-secondary-100{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-100-rgb),var(--tw-bg-opacity))}.bg-secondary-200{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-200-rgb),var(--tw-bg-opacity))}.bg-secondary-300{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-300-rgb),var(--tw-bg-opacity))}.bg-secondary-400{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-400-rgb),var(--tw-bg-opacity))}.bg-secondary-500{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-500-rgb),var(--tw-bg-opacity))}.bg-secondary-600{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-600-rgb),var(--tw-bg-opacity))}.bg-secondary-700{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-700-rgb),var(--tw-bg-opacity))}.bg-secondary-800{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-800-rgb),var(--tw-bg-opacity))}.bg-secondary-900{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-900-rgb),var(--tw-bg-opacity))}.bg-secondary-950{--tw-bg-opacity:1;background-color:rgba(var(--color-secondary-950-rgb),var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-50-rgb),var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-100-rgb),var(--tw-bg-opacity))}.bg-gray-200,.bg-lightest{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-200-rgb),var(--tw-bg-opacity))}.bg-gray-300,.bg-lighter{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-300-rgb),var(--tw-bg-opacity))}.bg-gray-400,.bg-light{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-400-rgb),var(--tw-bg-opacity))}.bg-gray,.bg-gray-500{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-500-rgb),var(--tw-bg-opacity))}.bg-darken,.bg-gray-600{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-600-rgb),var(--tw-bg-opacity))}.bg-darker,.bg-gray-700{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-700-rgb),var(--tw-bg-opacity))}.bg-darkest,.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-800-rgb),var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-900-rgb),var(--tw-bg-opacity))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgba(var(--color-gray-950-rgb),var(--tw-bg-opacity))}.bg-canvas{--tw-bg-opacity:1;background-color:rgba(var(--color-canvas-rgb),var(--tw-bg-opacity))}.bg-surface-light{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-light-rgb),var(--tw-bg-opacity))}.bg-surface{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-rgb),var(--tw-bg-opacity))}.bg-surface-strong{--tw-bg-opacity:1;background-color:rgba(var(--color-surface-strong-rgb),var(--tw-bg-opacity))}.bg-inverse{--tw-bg-opacity:1;background-color:rgba(var(--color-inverse-rgb),var(--tw-bg-opacity))}.bg-fore-in-light{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-in-light-rgb),var(--tw-bg-opacity))}.bg-fore-in-dark{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-in-dark-rgb),var(--tw-bg-opacity))}.bg-fore{--tw-bg-opacity:1;background-color:rgba(var(--color-fore-rgb),var(--tw-bg-opacity))}.bg-focus{--tw-bg-opacity:1;background-color:rgba(var(--color-focus-rgb),var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(var(--color-white-rgb),var(--tw-bg-opacity))}.bg-black{--tw-bg-opacity:1;background-color:rgba(var(--color-black-rgb),var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-current{background-color:currentColor}.bg-inherit{background-color:inherit}.bg-none{background-image:none}.bg-opacity-0{--tw-bg-opacity:0}.bg-opacity-5{--tw-bg-opacity:.05}.bg-opacity-10{--tw-bg-opacity:.1}.bg-opacity-20{--tw-bg-opacity:.2}.bg-opacity-25{--tw-bg-opacity:.25}.bg-opacity-30{--tw-bg-opacity:.3}.bg-opacity-40{--tw-bg-opacity:.4}.bg-opacity-50{--tw-bg-opacity:.5}.bg-opacity-60{--tw-bg-opacity:.6}.bg-opacity-70{--tw-bg-opacity:.7}.bg-opacity-80{--tw-bg-opacity:.8}.bg-opacity-90{--tw-bg-opacity:.9}.bg-opacity-100{--tw-bg-opacity:1}.bg-auto{background-size:auto}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.bg-repeat{background-repeat:repeat}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat-x{background-repeat:repeat-x}.bg-repeat-y{background-repeat:repeat-y}.bg-repeat-round{background-repeat:round}.bg-repeat-space{background-repeat:space}.bg-bottom{background-position:bottom}.bg-center{background-position:50%}.bg-left{background-position:0}.bg-left-bottom{background-position:0 100%}.bg-left-top{background-position:0 0}.bg-right{background-position:100%}.bg-right-bottom{background-position:100% 100%}.bg-right-top{background-position:100% 0}.bg-top{background-position:top}.bg-fixed{background-attachment:fixed}.bg-local{background-attachment:local}.bg-scroll{background-attachment:scroll}.divider{align-self:stretch;border-color:currentColor;border-left-width:1px;border-top-width:1px;opacity:.1}.border-0{border-width:0}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-t{border-top-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.border-t-0{border-top-width:0}.border-r-0{border-right-width:0}.border-b-0{border-bottom-width:0}.border-l-0{border-left-width:0}.border-t-2{border-top-width:2px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-b-2{border-bottom-width:2px}.border-t-4{border-top-width:4px}.border-l-4{border-left-width:4px}.border-r-4{border-right-width:4px}.border-b-4{border-bottom-width:4px}.border-light{--tw-border-opacity:1;border-color:rgba(var(--color-border-light-rgb),var(--tw-border-opacity))}.border-strong{--tw-border-opacity:1;border-color:rgba(var(--color-border-strong-rgb),var(--tw-border-opacity))}.border-primary{--tw-border-opacity:1;border-color:rgba(var(--color-primary-500-rgb),var(--tw-border-opacity))}.border-secondary{--tw-border-opacity:1;border-color:rgba(var(--color-secondary-500-rgb),var(--tw-border-opacity))}.border-success{--tw-border-opacity:1;border-color:rgba(var(--color-success-500-rgb),var(--tw-border-opacity))}.border-warning{--tw-border-opacity:1;border-color:rgba(var(--color-warning-500-rgb),var(--tw-border-opacity))}.border-danger{--tw-border-opacity:1;border-color:rgba(var(--color-danger-500-rgb),var(--tw-border-opacity))}.border-important{--tw-border-opacity:1;border-color:rgba(var(--color-important-500-rgb),var(--tw-border-opacity))}.border-special{--tw-border-opacity:1;border-color:rgba(var(--color-special-500-rgb),var(--tw-border-opacity))}.border-gray-50{--tw-border-opacity:1;border-color:rgba(var(--color-gray-50-rgb),var(--tw-border-opacity))}.border-gray-100{--tw-border-opacity:1;border-color:rgba(var(--color-gray-100-rgb),var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(var(--color-gray-200-rgb),var(--tw-border-opacity))}.border-gray-300{--tw-border-opacity:1;border-color:rgba(var(--color-gray-300-rgb),var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgba(var(--color-gray-400-rgb),var(--tw-border-opacity))}.border-gray,.border-gray-500{--tw-border-opacity:1;border-color:rgba(var(--color-gray-500-rgb),var(--tw-border-opacity))}.border-gray-600{--tw-border-opacity:1;border-color:rgba(var(--color-gray-600-rgb),var(--tw-border-opacity))}.border-gray-700{--tw-border-opacity:1;border-color:rgba(var(--color-gray-700-rgb),var(--tw-border-opacity))}.border-gray-800{--tw-border-opacity:1;border-color:rgba(var(--color-gray-800-rgb),var(--tw-border-opacity))}.border-gray-900{--tw-border-opacity:1;border-color:rgba(var(--color-gray-900-rgb),var(--tw-border-opacity))}.border-gray-950{--tw-border-opacity:1;border-color:rgba(var(--color-gray-950-rgb),var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgba(var(--color-white-rgb),var(--tw-border-opacity))}.border-black{--tw-border-opacity:1;border-color:rgba(var(--color-black-rgb),var(--tw-border-opacity))}.border-canvas{--tw-border-opacity:1;border-color:rgba(var(--color-canvas-rgb),var(--tw-border-opacity))}.border-surface-light{--tw-border-opacity:1;border-color:rgba(var(--color-surface-light-rgb),var(--tw-border-opacity))}.border-surface{--tw-border-opacity:1;border-color:rgba(var(--color-surface-rgb),var(--tw-border-opacity))}.border-surface-strong{--tw-border-opacity:1;border-color:rgba(var(--color-surface-strong-rgb),var(--tw-border-opacity))}.border-inverse{--tw-border-opacity:1;border-color:rgba(var(--color-inverse-rgb),var(--tw-border-opacity))}.border-fore-in-light{--tw-border-opacity:1;border-color:rgba(var(--color-fore-in-light-rgb),var(--tw-border-opacity))}.border-fore-in-dark{--tw-border-opacity:1;border-color:rgba(var(--color-fore-in-dark-rgb),var(--tw-border-opacity))}.border-fore{--tw-border-opacity:1;border-color:rgba(var(--color-fore-rgb),var(--tw-border-opacity))}.border-focus{--tw-border-opacity:1;border-color:rgba(var(--color-focus-rgb),var(--tw-border-opacity))}.border-link{--tw-border-opacity:1;border-color:rgba(var(--color-link-rgb),var(--tw-border-opacity))}.border-link-hover{--tw-border-opacity:1;border-color:rgba(var(--color-link-hover-rgb),var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-current{border-color:currentColor}.border-inherit{border-color:inherit}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-double{border-style:double}.border-hidden{border-style:hidden}.border-none{border-style:none}.border-opacity-0{--tw-border-opacity:0}.border-opacity-5{--tw-border-opacity:.05}.border-opacity-10{--tw-border-opacity:.1}.border-opacity-20{--tw-border-opacity:.2}.border-opacity-25{--tw-border-opacity:.25}.border-opacity-30{--tw-border-opacity:.3}.border-opacity-40{--tw-border-opacity:.4}.border-opacity-50{--tw-border-opacity:.5}.border-opacity-60{--tw-border-opacity:.6}.border-opacity-70{--tw-border-opacity:.7}.border-opacity-80{--tw-border-opacity:.8}.border-opacity-90{--tw-border-opacity:.9}.border-opacity-95{--tw-border-opacity:.95}.border-opacity-100{--tw-border-opacity:1}.rounded-none{border-radius:var(--radius-none)}.rounded-sm{border-radius:var(--radius-sm)}.rounded{border-radius:var(--radius)}.rounded-md{border-radius:var(--radius-md)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.circle,.rounded-full{border-radius:var(--radius-full)}.rounded-l-none{border-bottom-left-radius:var(--radius-none);border-top-left-radius:var(--radius-none)}.rounded-t-none{border-top-left-radius:var(--radius-none)}.rounded-r-none,.rounded-t-none{border-top-right-radius:var(--radius-none)}.rounded-b-none,.rounded-r-none{border-bottom-right-radius:var(--radius-none)}.rounded-b-none{border-bottom-left-radius:var(--radius-none)}.rounded-br-none{border-bottom-right-radius:var(--radius-none)}.rounded-bl-none{border-bottom-left-radius:var(--radius-none)}.rounded-tr-none{border-top-right-radius:var(--radius-none)}.rounded-tl-none{border-top-left-radius:var(--radius-none)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.ring-border-light{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-light-rgb),var(--tw-ring-opacity))}.ring-border{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-rgb),var(--tw-ring-opacity))}.ring-border-strong{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-border-strong-rgb),var(--tw-ring-opacity))}.ring-light{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.05}.ring-gray{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.1}.ring-dark{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.2}.ring-darker{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.3}.ring-darkest{--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity));--tw-ring-opacity:0.5}.ring-primary{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-primary-500-rgb),var(--tw-ring-opacity))}.ring-secondary{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-secondary-500-rgb),var(--tw-ring-opacity))}.ring-warning{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-warning-500-rgb),var(--tw-ring-opacity))}.ring-success{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-success-500-rgb),var(--tw-ring-opacity))}.ring-danger{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-danger-500-rgb),var(--tw-ring-opacity))}.ring-important{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-important-500-rgb),var(--tw-ring-opacity))}.ring-special{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-special-500-rgb),var(--tw-ring-opacity))}.ring-gray-50{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-50-rgb),var(--tw-ring-opacity))}.ring-gray-100{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-100-rgb),var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-200-rgb),var(--tw-ring-opacity))}.ring-gray-300{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-300-rgb),var(--tw-ring-opacity))}.ring-gray-400{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-400-rgb),var(--tw-ring-opacity))}.ring-gray-500{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-500-rgb),var(--tw-ring-opacity))}.ring-gray-600{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-600-rgb),var(--tw-ring-opacity))}.ring-gray-700{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-700-rgb),var(--tw-ring-opacity))}.ring-gray-800{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-800-rgb),var(--tw-ring-opacity))}.ring-gray-900{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-900-rgb),var(--tw-ring-opacity))}.ring-gray-950{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-gray-950-rgb),var(--tw-ring-opacity))}.ring-inverse{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-inverse-rgb),var(--tw-ring-opacity))}.ring-canvas{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-canvas-rgb),var(--tw-ring-opacity))}.ring-surface{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-surface-rgb),var(--tw-ring-opacity))}.ring-fore{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-fore-rgb),var(--tw-ring-opacity))}.ring-transparent{--tw-ring-color:transparent}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-black-rgb),var(--tw-ring-opacity))}.ring-white{--tw-ring-opacity:1;--tw-ring-color:rgba(var(--color-white-rgb),var(--tw-ring-opacity))}.ring-inherit{--tw-ring-color:inherit}.ring-current{--tw-ring-color:currentColor}.ring-opacity-0{--tw-ring-opacity:0}.ring-opacity-5{--tw-ring-opacity:.05}.ring-opacity-10{--tw-ring-opacity:.1}.ring-opacity-20{--tw-ring-opacity:.2}.ring-opacity-30{--tw-ring-opacity:.3}.ring-opacity-40{--tw-ring-opacity:.4}.ring-opacity-50{--tw-ring-opacity:.5}.ring-opacity-60{--tw-ring-opacity:.6}.ring-opacity-70{--tw-ring-opacity:.7}.ring-opacity-80{--tw-ring-opacity:.8}.ring-opacity-90{--tw-ring-opacity:.9}.ring-opacity-100{--tw-ring-opacity:1}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-2{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-3{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-3,.ring-4{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-4{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-8{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(8px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-inset{--tw-ring-inset:inset}.ring-offset-0{--tw-ring-offset-width:0px}.ring-offset-1{--tw-ring-offset-width:1px}.ring-offset-2{--tw-ring-offset-width:2px}.ring-offset-4{--tw-ring-offset-width:4px}.ring-offset-8{--tw-ring-offset-width:8px}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.04),0 0 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color),0 0 2px -1px var(--tw-shadow-color)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow{--tw-shadow:0 3px 8px 0 rgba(0,0,0,.04),0 1px 2px -1px rgba(0,0,0,.01);--tw-shadow-colored:0 3px 8px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 2px 6px -1px rgba(0,0,0,.2),0 1px 4px -2px rgba(0,0,0,.15);--tw-shadow-colored:0 2px 6px -1px var(--tw-shadow-color),0 1px 4px -2px var(--tw-shadow-color)}.shadow-lg,.shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 5px 15px -3px rgba(0,0,0,.2),0 2px 6px -4px rgba(0,0,0,.15);--tw-shadow-colored:0 5px 15px -3px var(--tw-shadow-color),0 2px 6px -4px var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 10px 25px -5px rgba(0,0,0,.2),0 4px 10px -6px rgba(0,0,0,.15);--tw-shadow-colored:0 10px 25px -5px var(--tw-shadow-color),0 4px 10px -6px var(--tw-shadow-color)}.shadow-2xl,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 10px 50px -10px rgba(0,0,0,.4),0 8px 20px -10px rgba(0,0,0,.3);--tw-shadow-colored:0 10px 50px -10px var(--tw-shadow-color),0 8px 20px -10px var(--tw-shadow-color)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.muted{opacity:var(--opacity-muted)}.opacity-0{opacity:0}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.blur-none{--tw-blur:blur(0)}.blur-none,.blur-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-sm{--tw-blur:blur(4px)}.blur{--tw-blur:blur(8px)}.blur,.blur-md{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-md{--tw-blur:blur(12px)}.blur-lg{--tw-blur:blur(16px)}.blur-lg,.blur-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-xl{--tw-blur:blur(24px)}.grayscale{--tw-grayscale:grayscale(100%)}.grayscale,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.filter-none{filter:none!important}.drop-shadow-none{--tw-drop-shadow:drop-shadow(0 0 #0000)}.drop-shadow-none,.drop-shadow-sm{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.drop-shadow{--tw-drop-shadow:drop-shadow(0 1px 2px rgba(0,0,0,.1)) drop-shadow(0 1px 1px rgba(0,0,0,.06))}.drop-shadow,.drop-shadow-md{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-md{--tw-drop-shadow:drop-shadow(0 4px 3px rgba(0,0,0,.07)) drop-shadow(0 2px 2px rgba(0,0,0,.06))}.drop-shadow-lg{--tw-drop-shadow:drop-shadow(0 10px 8px rgba(0,0,0,.04)) drop-shadow(0 4px 3px rgba(0,0,0,.1))}.drop-shadow-lg,.drop-shadow-xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-xl{--tw-drop-shadow:drop-shadow(0 20px 13px rgba(0,0,0,.03)) drop-shadow(0 8px 5px rgba(0,0,0,.08))}.drop-shadow-2xl{--tw-drop-shadow:drop-shadow(0 25px 25px rgba(0,0,0,.15));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-none{--tw-backdrop-blur:blur(0)}.backdrop-blur-none,.backdrop-blur-sm{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur{--tw-backdrop-blur:blur(8px)}.backdrop-blur,.backdrop-blur-md{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-lg{--tw-backdrop-blur:blur(16px)}.backdrop-blur-lg,.backdrop-blur-xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(40px)}.backdrop-blur-2xl,.backdrop-blur-3xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-3xl{--tw-backdrop-blur:blur(64px)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-none{transition-property:none}.fade,.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{opacity:0;transition-duration:.15s;transition-property:opacity,transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{--tw-scale-x:.9;--tw-scale-y:.9}.fade-from-bottom,.fade-from-center,.fade-from-left,.fade-from-right,.fade-from-top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-bottom{--tw-translate-y:25%}.fade-from-top{--tw-translate-y:-25%}.fade-from-left,.fade-from-top{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-left{--tw-translate-x:-25%}.fade-from-right{--tw-translate-x:25%}.fade-from-bottom.in,.fade-from-center.in,.fade-from-left.in,.fade-from-right,.fade-from-right.in,.fade-from-top.in,.fade.in{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.fade-from-bottom.in,.fade-from-center.in,.fade-from-left.in,.fade-from-right.in,.fade-from-top.in,.fade.in{--tw-translate-x:0px;--tw-translate-y:0px;--tw-scale-x:1;--tw-scale-y:1;opacity:1}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-1000{transition-duration:1s}@keyframes -spin{to{transform:rotate(1turn)}}.animate-spin,.spin{animation:-spin 1s linear infinite}@keyframes -ping{75%,to{opacity:0;transform:scale(2)}}.animate-ping,.ping{animation:-ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes -pulse{50%{opacity:.5}}.animate-pulse,.pulse{animation:-pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes -bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.animate-bounce,.bounce{animation:-bounce 1s infinite}.animate-highlight,.highlight{animation:-highlight 2s ease-in-out infinite;outline-color:#fde047;outline-offset:-1px;outline-style:solid;outline-width:1px}@keyframes -highlight{50%{--tw-bg-opacity:1;background-color:rgb(254 252 232/var(--tw-bg-opacity));outline-offset:-4px;outline-width:4px}}.scale-0{--tw-scale-x:0;--tw-scale-y:0}.scale-0,.scale-50{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-50{--tw-scale-x:.5;--tw-scale-y:.5}.scale-75{--tw-scale-x:.75;--tw-scale-y:.75}.scale-75,.scale-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-90{--tw-scale-x:.9;--tw-scale-y:.9}.scale-95{--tw-scale-x:.95;--tw-scale-y:.95}.scale-100,.scale-95{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x:1;--tw-scale-y:1}.scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05}.scale-105,.scale-110{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x:1.1;--tw-scale-y:1.1}.scale-125{--tw-scale-x:1.25;--tw-scale-y:1.25}.scale-125,.scale-150{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-150{--tw-scale-x:1.5;--tw-scale-y:1.5}.flip-x{--tw-scale-x:-1}.flip-x,.flip-y{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.flip-y{--tw-scale-y:-1}.rotate-0{--tw-rotate:0deg}.rotate-0,.rotate-1{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-1{--tw-rotate:1deg}.rotate-2{--tw-rotate:2deg}.rotate-2,.rotate-3{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-3{--tw-rotate:3deg}.rotate-6{--tw-rotate:6deg}.rotate-12,.rotate-6{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-12{--tw-rotate:12deg}.rotate-45{--tw-rotate:45deg}.rotate-45,.rotate-90{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg}.rotate-135{--tw-rotate:135deg}.rotate-135,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-270{--tw-rotate:270deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.basis-0{flex-basis:0px}.basis-1{flex-basis:0.25rem}.basis-2{flex-basis:0.5rem}.basis-3{flex-basis:0.75rem}.basis-4{flex-basis:1rem}.basis-5{flex-basis:1.25rem}.basis-6{flex-basis:1.5rem}.basis-7{flex-basis:1.75rem}.basis-8{flex-basis:2rem}.basis-9{flex-basis:2.25rem}.basis-10{flex-basis:2.5rem}.basis-11{flex-basis:2.75rem}.basis-12{flex-basis:3rem}.basis-14{flex-basis:3.5rem}.basis-16{flex-basis:4rem}.basis-20{flex-basis:5rem}.basis-24{flex-basis:6rem}.basis-28{flex-basis:7rem}.basis-32{flex-basis:8rem}.basis-36{flex-basis:9rem}.basis-40{flex-basis:10rem}.basis-44{flex-basis:11rem}.basis-48{flex-basis:12rem}.basis-52{flex-basis:13rem}.basis-56{flex-basis:14rem}.basis-60{flex-basis:15rem}.basis-64{flex-basis:16rem}.basis-72{flex-basis:18rem}.basis-80{flex-basis:20rem}.basis-96{flex-basis:24rem}.basis-auto{flex-basis:auto}.basis-px{flex-basis:1px}.basis-0\.5{flex-basis:0.125rem}.basis-1\.5{flex-basis:0.375rem}.basis-2\.5{flex-basis:0.625rem}.basis-3\.5{flex-basis:0.875rem}.basis-1\/2{flex-basis:50%}.basis-1\/3{flex-basis:33.333333%}.basis-2\/3{flex-basis:66.666667%}.basis-1\/4{flex-basis:25%}.basis-2\/4{flex-basis:50%}.basis-3\/4{flex-basis:75%}.basis-1\/5{flex-basis:20%}.basis-2\/5{flex-basis:40%}.basis-3\/5{flex-basis:60%}.basis-4\/5{flex-basis:80%}.basis-1\/6{flex-basis:16.666667%}.basis-2\/6{flex-basis:33.333333%}.basis-3\/6{flex-basis:50%}.basis-4\/6{flex-basis:66.666667%}.basis-5\/6{flex-basis:83.333333%}.basis-1\/12{flex-basis:8.333333%}.basis-2\/12{flex-basis:16.666667%}.basis-3\/12{flex-basis:25%}.basis-4\/12{flex-basis:33.333333%}.basis-5\/12{flex-basis:41.666667%}.basis-6\/12{flex-basis:50%}.basis-7\/12{flex-basis:58.333333%}.basis-8\/12{flex-basis:66.666667%}.basis-9\/12{flex-basis:75%}.basis-10\/12{flex-basis:83.333333%}.basis-11\/12{flex-basis:91.666667%}.basis-full{flex-basis:100%}.row{display:flex;flex-direction:row}.center,.col{display:flex;flex-direction:column}.center,.center-row{align-items:center;justify-content:center}.center-row{display:flex;flex-direction:row}.center-x,.center-y{align-items:center;display:flex}.center-y{flex-direction:column}.row-reverse{display:flex;flex-direction:row-reverse}.col-reverse{display:flex;flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.grow{flex-grow:1!important}.grow-0{flex-grow:0!important}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.gap-0{gap:0}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-y-0{row-gap:0}.gap-px{gap:1px}.gap-x-px{-moz-column-gap:1px;column-gap:1px}.gap-y-px{row-gap:1px}.gap-0\.5{gap:.125rem}.gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.gap-y-0\.5{row-gap:.125rem}.gap-3px{gap:3px}.gap-1{gap:.25rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-y-1{row-gap:.25rem}.gap-1\.5{gap:.375rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-y-1\.5{row-gap:.375rem}.gap-2{gap:.5rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-2{row-gap:.5rem}.gap-2\.5{gap:.625rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-y-2\.5{row-gap:.625rem}.gap-3{gap:.75rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-3{row-gap:.75rem}.gap-3\.5{gap:.875rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-y-3\.5{row-gap:.875rem}.gap-4{gap:1rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-4{row-gap:1rem}.gap-5{gap:1.25rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-5{row-gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-6{row-gap:1.5rem}.gap-7{gap:1.75rem}.gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.gap-y-7{row-gap:1.75rem}.gap-8{gap:2rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-y-8{row-gap:2rem}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.self-baseline{align-self:baseline}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}@font-face{font-display:fallback;font-family:D-DIN-PRO;font-weight:400;src:url(./fonts/D-DIN-PRO-400-Regular.otf)}@font-face{font-display:fallback;font-family:D-DIN-PRO;font-weight:500;src:url(./fonts/D-DIN-PRO-700-Bold.otf)}.num{font-family:D-DIN-PRO}@font-face{font-display:fallback;font-family:Nunito;font-weight:400;src:url(./fonts/Nunito-Regular.ttf)}@font-face{font-display:fallback;font-family:Nunito;font-weight:700;src:url(./fonts/Nunito-Bold.ttf)}@font-face{font-display:fallback;font-family:Nunito;font-weight:300;src:url(./fonts/Nunito-Light.ttf)}.font-brand{font-family:Nunito;font-weight:400}@supports not (gap:4px){.gap-px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1px*(1 - var(--tw-space-x-reverse)));margin-right:calc(1px*var(--tw-space-x-reverse))}.gap-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2px*(1 - var(--tw-space-x-reverse)));margin-right:calc(2px*var(--tw-space-x-reverse))}.gap-3px>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(3px*(1 - var(--tw-space-x-reverse)));margin-right:calc(3px*var(--tw-space-x-reverse))}.gap-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.gap-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(6px*(1 - var(--tw-space-x-reverse)));margin-right:calc(6px*var(--tw-space-x-reverse))}.gap-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.gap-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(10px*(1 - var(--tw-space-x-reverse)));margin-right:calc(10px*var(--tw-space-x-reverse))}.gap-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.gap-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(14px*(1 - var(--tw-space-x-reverse)));margin-right:calc(14px*var(--tw-space-x-reverse))}.gap-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.gap-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.25rem*var(--tw-space-x-reverse))}.gap-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.5rem*var(--tw-space-x-reverse))}.gap-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1.75rem*var(--tw-space-x-reverse))}.gap-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(2rem*var(--tw-space-x-reverse))}.col.gap-px>:not([hidden])~:not([hidden]),.gap-px.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1px*var(--tw-space-y-reverse));margin-top:calc(1px*(1 - var(--tw-space-y-reverse)))}.col.gap-0\.5>:not([hidden])~:not([hidden]),.gap-0\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2px*var(--tw-space-y-reverse));margin-top:calc(2px*(1 - var(--tw-space-y-reverse)))}.col.gap-3px>:not([hidden])~:not([hidden]),.gap-3px.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(3px*var(--tw-space-y-reverse));margin-top:calc(3px*(1 - var(--tw-space-y-reverse)))}.col.gap-1>:not([hidden])~:not([hidden]),.gap-1.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.col.gap-1\.5>:not([hidden])~:not([hidden]),.gap-1\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(6px*var(--tw-space-y-reverse));margin-top:calc(6px*(1 - var(--tw-space-y-reverse)))}.col.gap-2>:not([hidden])~:not([hidden]),.gap-2.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.col.gap-2\.5>:not([hidden])~:not([hidden]),.gap-2\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(10px*var(--tw-space-y-reverse));margin-top:calc(10px*(1 - var(--tw-space-y-reverse)))}.col.gap-3>:not([hidden])~:not([hidden]),.gap-3.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.col.gap-3\.5>:not([hidden])~:not([hidden]),.gap-3\.5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(14px*var(--tw-space-y-reverse));margin-top:calc(14px*(1 - var(--tw-space-y-reverse)))}.col.gap-4>:not([hidden])~:not([hidden]),.gap-4.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.col.gap-5>:not([hidden])~:not([hidden]),.gap-5.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.25rem*var(--tw-space-y-reverse));margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)))}.col.gap-6>:not([hidden])~:not([hidden]),.gap-6.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.col.gap-7>:not([hidden])~:not([hidden]),.gap-7.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.75rem*var(--tw-space-y-reverse));margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)))}.col.gap-8>:not([hidden])~:not([hidden]),.gap-8.flex-row>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.nav-item>a>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}} \ No newline at end of file diff --git a/www/js/zui3/zui.zentao.js b/www/js/zui3/zui.zentao.js index e09070006b..fd2bb5ac00 100644 --- a/www/js/zui3/zui.zentao.js +++ b/www/js/zui3/zui.zentao.js @@ -1,17 +1,17 @@ -var Ou=(I,st,Nt)=>{if(!st.has(I))throw TypeError("Cannot "+Nt)};var It=(I,st,Nt)=>(Ou(I,st,"read from private field"),Nt?Nt.call(I):st.get(I)),jt=(I,st,Nt)=>{if(st.has(I))throw TypeError("Cannot add the same private member more than once");st instanceof WeakSet?st.add(I):st.set(I,Nt)},Ut=(I,st,Nt,sl)=>(Ou(I,st,"write to private field"),sl?sl.call(I,Nt):st.set(I,Nt),Nt);var zu=(I,st,Nt)=>(Ou(I,st,"access private method"),Nt);(function(I,st){typeof exports=="object"&&typeof module<"u"?st(exports):typeof define=="function"&&define.amd?define(["exports"],st):(I=typeof globalThis<"u"?globalThis:I||self,st(I.zui={}))})(this,function(I){var Ta,Da,wr,Cr,xr,Sr,kr,Tr,$a,Kg,Ia,qg,Kn,qn;"use strict";const st="",Nt="",sl="",hC="",uC="",dC="",fC="",pC="",mC="",gC="",yC="",vC="",il="3.0.0",Jg="production",fn=document,Br=window,Bu=fn.documentElement,ss=fn.createElement.bind(fn),Uu=ss("div"),rl=ss("table"),Qg=ss("tbody"),Wu=ss("tr"),{isArray:Ur,prototype:Vu}=Array,{concat:ey,filter:ol,indexOf:Ku,map:qu,push:ty,slice:Gu,some:al,splice:ny}=Vu,sy=/^#(?:[\w-]|\\.|[^\x00-\xa0])*$/,iy=/^\.(?:[\w-]|\\.|[^\x00-\xa0])*$/,ry=/<.+>/,oy=/^\w+$/;function ll(s,e){const t=ay(e);return!s||!t&&!is(e)&&!rt(e)?[]:!t&&iy.test(s)?e.getElementsByClassName(s.slice(1).replace(/\\/g,"")):!t&&oy.test(s)?e.getElementsByTagName(s):e.querySelectorAll(s)}class Wr{constructor(e,t){if(!e)return;if(cl(e))return e;let n=e;if(bt(e)){const i=t||fn;if(n=sy.test(e)&&is(i)?i.getElementById(e.slice(1).replace(/\\/g,"")):ry.test(e)?ed(e):cl(i)?i.find(e):bt(i)?y(i).find(e):ll(e,i),!n)return}else if(rs(e))return this.ready(e);(n.nodeType||n===Br)&&(n=[n]),this.length=n.length;for(let i=0,r=this.length;i{for(;e.firstChild;)e.removeChild(e.firstChild)})};function Vr(...s){const e=cy(s[0])?s.shift():!1,t=s.shift(),n=s.length;if(!t)return{};if(!n)return Vr(e,y,t);for(let i=0;i{rt(r)&&dt(t,(o,a)=>{n?e?r.classList.add(a):r.classList.remove(a):r.classList.toggle(a)})})},se.addClass=function(s){return this.toggleClass(s,!0)},se.removeAttr=function(s){const e=Kr(s);return this.each((t,n)=>{rt(n)&&dt(e,(i,r)=>{n.removeAttribute(r)})})};function uy(s,e){if(s){if(bt(s)){if(arguments.length<2){if(!this[0]||!rt(this[0]))return;const t=this[0].getAttribute(s);return xi(t)?void 0:t}return Et(e)?this:xi(e)?this.removeAttr(s):this.each((t,n)=>{rt(n)&&n.setAttribute(s,e)})}for(const t in s)this.attr(t,s[t]);return this}}se.attr=uy,se.removeClass=function(s){return arguments.length?this.toggleClass(s,!1):this.attr("class","")},se.hasClass=function(s){return!!s&&al.call(this,e=>rt(e)&&e.classList.contains(s))},se.get=function(s){return Et(s)?Gu.call(this):(s=Number(s),this[s<0?s+this.length:s])},se.eq=function(s){return y(this.get(s))},se.first=function(){return this.eq(0)},se.last=function(){return this.eq(-1)};function dy(s){return Et(s)?this.get().map(e=>rt(e)||ly(e)?e.textContent:"").join(""):this.each((e,t)=>{rt(t)&&(t.textContent=s)})}se.text=dy;function pn(s,e,t){if(!rt(s))return;const n=Br.getComputedStyle(s,null);return t?n.getPropertyValue(e)||void 0:n[e]||s.style[e]}function en(s,e){return parseInt(pn(s,e),10)||0}function Xu(s,e){return en(s,`border${e?"Left":"Top"}Width`)+en(s,`padding${e?"Left":"Top"}`)+en(s,`padding${e?"Right":"Bottom"}`)+en(s,`border${e?"Right":"Bottom"}Width`)}const ul={};function fy(s){if(ul[s])return ul[s];const e=ss(s);fn.body.insertBefore(e,null);const t=pn(e,"display");return fn.body.removeChild(e),ul[s]=t!=="none"?t:"block"}function Zu(s){return pn(s,"display")==="none"}function Ju(s,e){const t=s&&(s.matches||s.webkitMatchesSelector||s.msMatchesSelector);return!!t&&!!e&&t.call(s,e)}function qr(s){return bt(s)?(e,t)=>Ju(t,s):rs(s)?s:cl(s)?(e,t)=>s.is(t):s?(e,t)=>t===s:()=>!1}se.filter=function(s){const e=qr(s);return y(ol.call(this,(t,n)=>e.call(t,n,t)))};function Nn(s,e){return e?s.filter(e):s}se.detach=function(s){return Nn(this,s).each((e,t)=>{t.parentNode&&t.parentNode.removeChild(t)}),this};const py=/^\s*<(\w+)[^>]*>/,my=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,Qu={"*":Uu,tr:Qg,td:Wu,th:Wu,thead:rl,tbody:rl,tfoot:rl};function ed(s){if(!bt(s))return[];if(my.test(s))return[ss(RegExp.$1)];const e=py.test(s)&&RegExp.$1,t=Qu[e]||Qu["*"];return t.innerHTML=s,y(t.childNodes).detach().get()}y.parseHTML=ed,se.has=function(s){const e=bt(s)?(t,n)=>ll(s,n).length:(t,n)=>n.contains(s);return this.filter(e)},se.not=function(s){const e=qr(s);return this.filter((t,n)=>(!bt(s)||rt(n))&&!e.call(n,t,n))};function mn(s,e,t,n){const i=[],r=rs(e),o=n&&qr(n);for(let a=0,l=s.length;ae.selected&&!e.disabled&&!e.parentNode.disabled),"value"):s.value||""}function gy(s){return arguments.length?this.each((e,t)=>{const n=t.multiple&&t.options;if(n||dd.test(t.type)){const i=Ur(s)?qu.call(s,String):xi(s)?[]:[String(s)];n?dt(t.options,(r,o)=>{o.selected=i.indexOf(o.value)>=0},!0):t.checked=i.indexOf(t.value)>=0}else t.value=Et(s)||xi(s)?"":s}):this[0]&&td(this[0])}se.val=gy,se.is=function(s){const e=qr(s);return al.call(this,(t,n)=>e.call(t,n,t))},y.guid=1;function tn(s){return s.length>1?ol.call(s,(e,t,n)=>Ku.call(n,e)===t):s}y.unique=tn,se.add=function(s,e){return y(tn(this.get().concat(y(s,e).get())))},se.children=function(s){return Nn(y(tn(mn(this,e=>e.children))),s)},se.parent=function(s){return Nn(y(tn(mn(this,"parentNode"))),s)},se.index=function(s){const e=s?y(s)[0]:this[0],t=s?this:y(e).parent().children();return Ku.call(t,e)},se.closest=function(s){const e=this.filter(s);if(e.length)return e;const t=this.parent();return t.length?t.closest(s):e},se.siblings=function(s){return Nn(y(tn(mn(this,e=>y(e).parent().children().not(e)))),s)},se.find=function(s){return y(tn(mn(this,e=>ll(s,e))))};const yy=/^\s*\s*$/g,vy=/^$|^module$|\/(java|ecma)script/i,_y=["type","src","nonce","noModule"];function by(s,e){const t=y(s);t.filter("script").add(t.find("script")).each((n,i)=>{if(vy.test(i.type)&&Bu.contains(i)){const r=ss("script");r.text=i.textContent.replace(yy,""),dt(_y,(o,a)=>{i[a]&&(r[a]=i[a])}),e.head.insertBefore(r,null),e.head.removeChild(r)}})}function wy(s,e,t,n,i){n?s.insertBefore(e,t?s.firstChild:null):s.nodeName==="HTML"?s.parentNode.replaceChild(e,s):s.parentNode.insertBefore(e,t?s:s.nextSibling),i&&by(e,s.ownerDocument)}function En(s,e,t,n,i,r,o,a){return dt(s,(l,c)=>{dt(y(c),(u,h)=>{dt(y(e),(p,m)=>{const v=t?h:m,w=t?m:h,x=t?u:p;wy(v,x?w.cloneNode(!0):w,n,i,!x)},a)},o)},r),e}se.after=function(){return En(arguments,this,!1,!1,!1,!0,!0)},se.append=function(){return En(arguments,this,!1,!1,!0)};function Cy(s){if(!arguments.length)return this[0]&&this[0].innerHTML;if(Et(s))return this;const e=/]/.test(s);return this.each((t,n)=>{rt(n)&&(e?y(n).empty().append(s):n.innerHTML=s)})}se.html=Cy,se.appendTo=function(s){return En(arguments,this,!0,!1,!0)},se.wrapInner=function(s){return this.each((e,t)=>{const n=y(t),i=n.contents();i.length?i.wrapAll(s):n.append(s)})},se.before=function(){return En(arguments,this,!1,!0)},se.wrapAll=function(s){let e=y(s),t=e[0];for(;t.children.length;)t=t.firstElementChild;return this.first().before(e),this.appendTo(t)},se.wrap=function(s){return this.each((e,t)=>{const n=y(s)[0];y(t).wrapAll(e?n.cloneNode(!0):n)})},se.insertAfter=function(s){return En(arguments,this,!0,!1,!1,!1,!1,!0)},se.insertBefore=function(s){return En(arguments,this,!0,!0)},se.prepend=function(){return En(arguments,this,!1,!0,!0,!0,!0)},se.prependTo=function(s){return En(arguments,this,!0,!0,!0,!1,!1,!0)},se.contents=function(){return y(tn(mn(this,s=>s.tagName==="IFRAME"?[s.contentDocument]:s.tagName==="TEMPLATE"?s.content.childNodes:s.childNodes)))},se.next=function(s,e,t){return Nn(y(tn(mn(this,"nextElementSibling",e,t))),s)},se.nextAll=function(s){return this.next(s,!0)},se.nextUntil=function(s,e){return this.next(e,!0,s)},se.parents=function(s,e){return Nn(y(tn(mn(this,"parentElement",!0,e))),s)},se.parentsUntil=function(s,e){return this.parents(e,s)},se.prev=function(s,e,t){return Nn(y(tn(mn(this,"previousElementSibling",e,t))),s)},se.prevAll=function(s){return this.prev(s,!0)},se.prevUntil=function(s,e){return this.prev(e,!0,s)},se.map=function(s){return y(ey.apply([],qu.call(this,(e,t)=>s.call(e,t,e))))},se.clone=function(){return this.map((s,e)=>e.cloneNode(!0))},se.offsetParent=function(){return this.map((s,e)=>{let t=e.offsetParent;for(;t&&pn(t,"position")==="static";)t=t.offsetParent;return t||Bu})},se.slice=function(s,e){return y(Gu.call(this,s,e))};const xy=/-([a-z])/g;function dl(s){return s.replace(xy,(e,t)=>t.toUpperCase())}se.ready=function(s){const e=()=>setTimeout(s,0,y);return fn.readyState!=="loading"?e():fn.addEventListener("DOMContentLoaded",e),this},se.unwrap=function(){return this.parent().each((s,e)=>{if(e.tagName==="BODY")return;const t=y(e);t.replaceWith(t.children())}),this},se.offset=function(){const s=this[0];if(!s)return;const e=s.getBoundingClientRect();return{top:e.top+Br.pageYOffset,left:e.left+Br.pageXOffset}},se.position=function(){const s=this[0];if(!s)return;const e=pn(s,"position")==="fixed",t=e?s.getBoundingClientRect():this.offset();if(!e){const n=s.ownerDocument;let i=s.offsetParent||n.documentElement;for(;(i===n.body||i===n.documentElement)&&pn(i,"position")==="static";)i=i.parentNode;if(i!==s&&rt(i)){const r=y(i).offset();t.top-=r.top+en(i,"borderTopWidth"),t.left-=r.left+en(i,"borderLeftWidth")}}return{top:t.top-en(s,"marginTop"),left:t.left-en(s,"marginLeft")}};const nd={class:"className",contenteditable:"contentEditable",for:"htmlFor",readonly:"readOnly",maxlength:"maxLength",tabindex:"tabIndex",colspan:"colSpan",rowspan:"rowSpan",usemap:"useMap"};se.prop=function(s,e){if(s){if(bt(s))return s=nd[s]||s,arguments.length<2?this[0]&&this[0][s]:this.each((t,n)=>{n[s]=e});for(const t in s)this.prop(t,s[t]);return this}},se.removeProp=function(s){return this.each((e,t)=>{delete t[nd[s]||s]})};const Sy=/^--/;function fl(s){return Sy.test(s)}const pl={},{style:ky}=Uu,Ty=["webkit","moz","ms"];function Dy(s,e=fl(s)){if(e)return s;if(!pl[s]){const t=dl(s),n=`${t[0].toUpperCase()}${t.slice(1)}`,i=`${t} ${Ty.join(`${n} `)}${n}`.split(" ");dt(i,(r,o)=>{if(o in ky)return pl[s]=o,!1})}return pl[s]}const $y={animationIterationCount:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0};function sd(s,e,t=fl(s)){return!t&&!$y[s]&&Yu(e)?`${e}px`:e}function Iy(s,e){if(bt(s)){const t=fl(s);return s=Dy(s,t),arguments.length<2?this[0]&&pn(this[0],s,t):s?(e=sd(s,e,t),this.each((n,i)=>{rt(i)&&(t?i.style.setProperty(s,e):i.style[s]=e)})):this}for(const t in s)this.css(t,s[t]);return this}se.css=Iy;function id(s,e){try{return s(e)}catch{return e}}const Ny=/^\s+|\s+$/;function rd(s,e){const t=s.dataset[e]||s.dataset[dl(e)];return Ny.test(t)?t:id(JSON.parse,t)}function Ey(s,e,t){t=id(JSON.stringify,t),s.dataset[dl(e)]=t}function My(s,e){if(!s){if(!this[0])return;const t={};for(const n in this[0].dataset)t[n]=rd(this[0],n);return t}if(bt(s))return arguments.length<2?this[0]&&rd(this[0],s):Et(e)?this:this.each((t,n)=>{Ey(n,s,e)});for(const t in s)this.data(t,s[t]);return this}se.data=My;function od(s,e){const t=s.documentElement;return Math.max(s.body[`scroll${e}`],t[`scroll${e}`],s.body[`offset${e}`],t[`offset${e}`],t[`client${e}`])}dt([!0,!1],(s,e)=>{dt(["Width","Height"],(t,n)=>{const i=`${e?"outer":"inner"}${n}`;se[i]=function(r){if(this[0])return Rs(this[0])?e?this[0][`inner${n}`]:this[0].document.documentElement[`client${n}`]:is(this[0])?od(this[0],n):this[0][`${e?"offset":"client"}${n}`]+(r&&e?en(this[0],`margin${t?"Top":"Left"}`)+en(this[0],`margin${t?"Bottom":"Right"}`):0)}})}),dt(["Width","Height"],(s,e)=>{const t=e.toLowerCase();se[t]=function(n){if(!this[0])return Et(n)?void 0:this;if(!arguments.length)return Rs(this[0])?this[0].document.documentElement[`client${e}`]:is(this[0])?od(this[0],e):this[0].getBoundingClientRect()[t]-Xu(this[0],!s);const i=parseInt(n,10);return this.each((r,o)=>{if(!rt(o))return;const a=pn(o,"boxSizing");o.style[t]=sd(t,i+(a==="border-box"?Xu(o,!s):0))})}});const ad="___cd";se.toggle=function(s){return this.each((e,t)=>{if(!rt(t))return;const n=Zu(t);(Et(s)?n:s)?(t.style.display=t[ad]||"",Zu(t)&&(t.style.display=fy(t.tagName))):n||(t[ad]=pn(t,"display"),t.style.display="none")})},se.hide=function(){return this.toggle(!1)},se.show=function(){return this.toggle(!0)};const ld="___ce",ml=".",gl={focus:"focusin",blur:"focusout"},cd={mouseenter:"mouseover",mouseleave:"mouseout"},Ay=/^(mouse|pointer|contextmenu|drag|drop|click|dblclick)/i;function yl(s){return cd[s]||gl[s]||s}function vl(s){const e=s.split(ml);return[e[0],e.slice(1).sort()]}se.trigger=function(s,e){if(bt(s)){const[n,i]=vl(s),r=yl(n);if(!r)return this;const o=Ay.test(r)?"MouseEvents":"HTMLEvents";s=fn.createEvent(o),s.initEvent(r,!0,!0),s.namespace=i.join(ml),s.___ot=n}s.___td=e;const t=s.___ot in gl;return this.each((n,i)=>{t&&rs(i[s.___ot])&&(i[`___i${s.type}`]=!0,i[s.___ot](),i[`___i${s.type}`]=!1),i.dispatchEvent(s)})};function hd(s){return s[ld]=s[ld]||{}}function Py(s,e,t,n,i){const r=hd(s);r[e]=r[e]||[],r[e].push([t,n,i]),s.addEventListener(e,i)}function ud(s,e){return!e||!al.call(e,t=>s.indexOf(t)<0)}function Gr(s,e,t,n,i){const r=hd(s);if(e)r[e]&&(r[e]=r[e].filter(([o,a,l])=>{if(i&&l.guid!==i.guid||!ud(o,t)||n&&n!==a)return!0;s.removeEventListener(e,l)}));else for(e in r)Gr(s,e,t,n,i)}se.off=function(s,e,t){if(Et(s))this.each((n,i)=>{!rt(i)&&!is(i)&&!Rs(i)||Gr(i)});else if(bt(s))rs(e)&&(t=e,e=""),dt(Kr(s),(n,i)=>{const[r,o]=vl(i),a=yl(r);this.each((l,c)=>{!rt(c)&&!is(c)&&!Rs(c)||Gr(c,a,o,e,t)})});else for(const n in s)this.off(n,s[n]);return this},se.remove=function(s){return Nn(this,s).detach().off(),this},se.replaceWith=function(s){return this.before(s).remove()},se.replaceAll=function(s){return y(s).replaceWith(this),this};function Ly(s,e,t,n,i){if(!bt(s)){for(const r in s)this.on(r,e,t,s[r],i);return this}return bt(e)||(Et(e)||xi(e)?e="":Et(t)?(t=e,e=""):(n=t,t=e,e="")),rs(n)||(n=t,t=void 0),n?(dt(Kr(s),(r,o)=>{const[a,l]=vl(o),c=yl(a),u=a in cd,h=a in gl;c&&this.each((p,m)=>{if(!rt(m)&&!is(m)&&!Rs(m))return;const v=function(w){if(w.target[`___i${w.type}`])return w.stopImmediatePropagation();if(w.namespace&&!ud(l,w.namespace.split(ml))||!e&&(h&&(w.target!==m||w.___ot===c)||u&&w.relatedTarget&&m.contains(w.relatedTarget)))return;let x=m;if(e){let D=w.target;for(;!Ju(D,e);)if(D===m||(D=D.parentNode,!D))return;x=D}Object.defineProperty(w,"currentTarget",{configurable:!0,get(){return x}}),Object.defineProperty(w,"delegateTarget",{configurable:!0,get(){return m}}),Object.defineProperty(w,"data",{configurable:!0,get(){return t}});const S=n.call(x,w,w.___td);i&&Gr(m,c,l,e,v),S===!1&&(w.preventDefault(),w.stopPropagation())};v.guid=n.guid=n.guid||y.guid++,Py(m,c,l,e,v)})}),this):this}se.on=Ly;function Ry(s,e,t,n){return this.on(s,e,t,n,!0)}se.one=Ry;const Oy=/\r?\n/g;function zy(s,e){return`&${encodeURIComponent(s)}=${encodeURIComponent(e.replace(Oy,`\r -`))}`}const Fy=/file|reset|submit|button|image/i,dd=/radio|checkbox/i;se.serialize=function(){let s="";return this.each((e,t)=>{dt(t.elements||[t],(n,i)=>{if(i.disabled||!i.name||i.tagName==="FIELDSET"||Fy.test(i.type)||dd.test(i.type)&&!i.checked)return;const r=td(i);if(!Et(r)){const o=Ur(r)?r:[r];dt(o,(a,l)=>{s+=zy(i.name,l)})}})}),s.slice(1)},window.$=y;function fd(s,e){if(s==null)return[s,void 0];typeof e=="string"&&(e=e.split("."));const t=e.join(".");let n=s;const i=[n];for(;typeof n=="object"&&n!==null&&e.length;){let r=e.shift(),o;const a=r.indexOf("[");if(a>0&&a{const i=t[n]??"";s=s.replace(new RegExp(`\\{${n}\\}`,"g"),`${i}`)}),s}for(let t=0;t(s[s.B=1]="B",s[s.KB=1024]="KB",s[s.MB=1048576]="MB",s[s.GB=1073741824]="GB",s[s.TB=1099511627776]="TB",s))(_l||{});function pt(s,e=2,t){return Number.isNaN(s)?"?KB":(t||(s<1024?t="B":s<1048576?t="KB":s<1073741824?t="MB":s<1099511627776?t="GB":t="TB"),(s/_l[t]).toFixed(e)+t)}const gn=s=>{const e=/^[0-9]*(B|KB|MB|GB|TB)$/;s=s.toUpperCase(),s.endsWith("B")||(s+="B");const t=s.match(e);if(!t)return 0;const n=t[1];return s=s.replace(n,""),Number.parseInt(s,10)*_l[n]};let bl=(document.documentElement.getAttribute("lang")||"zh_cn").toLowerCase().replace("-","_"),yn;function pd(){return bl}function Hy(s){bl=s.toLowerCase().replace("-","_")}function md(s,e){yn||(yn={}),typeof s=="string"&&(s={[s]:e??{}}),y.extend(!0,yn,s)}function Ee(s,e,t,n,i,r){Array.isArray(s)?yn&&s.unshift(yn):s=yn?[yn,s]:[s],typeof t=="string"&&(r=i,i=n,n=t,t=void 0);const o=i||bl;let a;for(const l of s){if(!l)continue;const c=l[o]||l.default;if(!c)continue;const u=r&&l===yn?`${r}.${e}`:e;if(a=Si(c,u),a!==void 0)break}return a===void 0?n:t?be(a,...Array.isArray(t)?t:[t]):a}function By(s,e,t,n){return Ee(void 0,s,e,t,n)}Ee.addLang=md,Ee.getLang=By,Ee.getCode=pd,Ee.setCode=Hy,Ee.map=yn,md({zh_cn:{confirm:"确定",save:"保存",cancel:"取消",delete:"删除",reset:"重置",add:"添加",copy:"复制",close:"关闭"},zh_tw:{confirm:"確定",save:"儲存",cancel:"取消",delete:"刪除",reset:"重置",add:"添加",Copy:"複製",close:"關閉"},en:{confirm:"Confirm",save:"Save",cancel:"Cancel",delete:"Delete",reset:"Reset",add:"Add",copy:"Copy",close:"Close"}});function os(s,e,t){t!=null&&(Array.isArray(t)?t.forEach(n=>os(s,e,n)):!(t instanceof Blob)&&y.isPlainObject(t)?Object.entries(t).forEach(([n,i])=>{os(s,`${e}[${n}]`,i)}):s.append(e,t instanceof Blob?t:String(t)))}function Yr(s,e){const t=e||new FormData;return s&&(typeof s=="string"&&(s=new URLSearchParams(s)),s instanceof URLSearchParams?s.forEach((n,i)=>{os(t,i,n)}):Array.isArray(s)?s.forEach(([n,i])=>{os(t,n,i)}):s instanceof FormData?s.forEach((n,i)=>{os(t,i,n)}):typeof s=="object"&&s&&Object.entries(s).forEach(([n,i])=>{os(t,n,i)})),t}function gd(s,e,t){s instanceof Headers?s.set(e,t):Array.isArray(s)?s.push([e,t]):s[e]=t}function Uy(s,e){if(s){const t={text:"text/plain",html:"text/html",json:"application/json",...e};for(const[n,i]of Object.entries(t))if(i.split(",").map(r=>r.trim()).includes(s))return n}return"text"}class ki{get completed(){return this.data!==void 0||this.error!==void 0}get[Symbol.toStringTag](){return"Ajax"}constructor(e){this.setting=e,this._controller=new AbortController,this._callbacks={success:[],error:[],complete:[]}}on(e,t){return this._callbacks[e].push(t),this}success(e){return this.on("success",e)}done(e){return this.success(e)}fail(e){return this.on("error",e)}complete(e){return this.on("complete",e)}always(e){return this.complete(e)}then(e,t){return this.completed?t&&this.error?t(this.error):e(this.data):(this.success(n=>e(n)),t&&this.fail(t)),this}catch(e){return this.error?(e(this.error),this):this.on("error",t=>e(t))}finally(e){return this.completed?(e(),this):this.complete(()=>e())}abort(e){return this.completed?!1:(this._abortError=e,this._controller.abort(),!0)}getResponseHeader(e){var t;return(t=this.response)==null?void 0:t.headers.get(e)}_init(){if(this.completed)return;const{url:e,type:t,data:n,processData:i=!0,contentType:r,crossDomain:o,accepts:a,dataType:l,timeout:c,dataFilter:u,beforeSend:h,success:p,error:m,complete:v,...w}=this.setting;t&&(w.method=t);let x=n;x&&(i&&(x=Yr(x)),w.body=x),o&&(w.mode="cors");const S=w.headers||{};gd(S,"X-Requested-With","XMLHttpRequest"),r&&gd(S,"Content-Type",r),w.headers=S,w.signal&&w.signal.addEventListener("abort",()=>{this.abort()});const D=[...this.constructor.globalBeforeSends,h];for(const M of D){if(!M)continue;const P=M.call(this,w);if(P===!1)return;P&&Object.assign(w,P)}p&&this.success(p),m&&this.fail(m),v&&this.complete(v),w.signal=this._controller.signal,this.url=e,this.request=w}_emit(e,...t){this._callbacks[e].forEach(n=>{n.call(this,...t)})}async send(){var u;if(this.completed)return[];this._init();const{timeout:e,dataType:t,accepts:n,dataFilter:i,throws:r,jsonParser:o}=this.setting;e&&(this._timeoutID=window.setTimeout(()=>{this.abort(new Error("timeout"))},e));let a,l,c;try{a=await fetch(this.url,this.request),this.response=a;const{statusText:h}=a;if(a.ok){const p=(u=a.headers.get("Content-Disposition"))==null?void 0:u.startsWith("attachment"),m=p?"blob":t||Uy(a.headers.get("Content-Type"),n);p||m==="blob"||m==="file"?c=await a.blob():m==="json"?typeof o=="function"?(c=await a.text(),c=o(c)):c=await a.json():c=await a.text(),this.data=c;const v=(i==null?void 0:i(c,m))??c;this._emit("success",v,h,a)}else throw this.data=await a.text(),new Error(h)}catch(h){this.data===void 0&&c!==void 0&&(this.data=c),l=h;let p=!1;l.name==="AbortError"&&(this._abortError?l=this._abortError:p=!0),this.error=l,p||this._emit("error",l,a==null?void 0:a.statusText,l.message)}if(this._timeoutID&&clearTimeout(this._timeoutID),this._emit("complete",a,a==null?void 0:a.statusText),l&&r)throw l;return[c,l,a]}}ki.globalBeforeSends=[],y.ajax=(s,e)=>{e=e||{},typeof s=="string"?e.url=s:y.extend(e,s);const t=new ki(e);return t.send(),t},y.getJSON=(s,e,t)=>(typeof e=="function"&&(t=e,e=void 0),y.ajax({url:s,data:e,success:t,dataType:"json"})),y.get=(s,e,t,n,i="GET")=>{let r,o;return typeof e=="function"?(r=e,o=void 0):o=e,typeof t=="function"?(r=t,n=void 0):n=t,y.ajax({method:i,url:s,data:o,success:r,dataType:n})},y.post=(s,e,t,n)=>y.get(s,e,t,n,"POST"),y.fn.load=function(s,e,t){typeof e=="function"&&(t=e,e=void 0);const[n,i]=s.split(" ");return y.get(n,e,(r,o,a)=>{i&&(r=y(r).find(i).html()),y(this).html(r).zuiInit(),t==null||t.call(this,r,o,a)},"html"),this};async function mt(s,e=[],t,n,i){const r={throws:!0,dataType:"json"};if(typeof s=="string")r.url=s;else if(typeof s=="object")y.extend(r,s);else if(typeof s=="function"){const l=s.call(n,...e);return l instanceof Promise?await l:l}t&&y.extend(r,typeof t=="function"?t(r):t),r.url&&(r.url=be(r.url,...e));const o=new ki(r);i==null||i(o);const[a]=await o.send();return a}function wl(s){return!!(s&&(typeof s=="string"||typeof s=="object"&&s.url||typeof s=="function"))}y.fetch=mt;function wt(){return y.guid++}function Xr(s,e){if(s===e)return!1;if(s&&e){const t=typeof s,n=typeof e;if(t!==n)return!0;if(t==="object"&&n==="object"){const i=Array.isArray(s),r=Array.isArray(e);if(i!==r)return!0;if(i&&r){if(s.length!==e.length)return!0;for(let l=0;ln instanceof as?n.value!==t[i]:Xr(n,t[i])))&&(this._value=this._compute(),this._lastDependencies=e.map(n=>n instanceof as?n.cache:n)),this._value}}function Cl(...s){const e=[],t=new Map,n=(i,r)=>{if(Array.isArray(i)&&(r=i[1],i=i[0]),!i.length)return;const o=t.get(i);typeof o=="number"?e[o][1]=!!r:(t.set(i,e.length),e.push([i,!!r]))};return s.forEach(i=>{typeof i=="function"&&(i=i()),Array.isArray(i)?Cl(...i).forEach(n):i&&typeof i=="object"?Object.entries(i).forEach(n):typeof i=="string"&&i.split(" ").forEach(r=>n(r,!0))}),e.sort((i,r)=>(t.get(i[0])||0)-(t.get(r[0])||0))}const V=(...s)=>Cl(...s).reduce((e,[t,n])=>(n&&e.push(t),e),[]).join(" ");y.classes=V,y.fn.setClass=function(s,...e){return this.each((t,n)=>{const i=y(n);s===!0?i.attr("class",V(i.attr("class"),...e)):i.addClass(V(s,...e))})};const Os=new WeakMap;function Zr(s,e,t){const n=Os.has(s),i=n?Os.get(s):{};typeof e=="string"?i[e]=t:e===null?Object.keys(i).forEach(r=>{delete i[r]}):Object.assign(i,e),Object.keys(i).forEach(r=>{i[r]===void 0&&delete i[r]}),Object.keys(i).length?(!n&&s instanceof Element&&Object.assign(i,y(s).dataset(),i),Os.set(s,i)):Os.delete(s)}function Ti(s,e,t){let n=Os.get(s)||{};return t&&s instanceof Element&&(n=Object.assign({},y(s).dataset(),n)),e===void 0?n:n[e]}function Wy(s){Os.delete(s)}y.fn.dataset=y.fn.data,y.fn.data=function(...s){const[e,t]=s;return!s.length||s.length===1&&typeof e=="string"?this.length?Ti(this[0],e,!0):void 0:this.each((n,i)=>Zr(i,e,t))},y.fn.removeData=function(s=null){return this.each((e,t)=>Zr(t,s))};function ls(s,...e){return s.includes("RAWJS")&&(s=s.split('"RAWJS<').join("").split('>RAWJS"').join("").split("").join('"').split("").join(` -`)),new Function(`return ${s}`)(...e)}function xl(s,...e){return s.includes("RAWJS")?ls(s,...e):JSON.parse(s)}function Vy(s){return JSON.stringify(s,(e,t)=>{if(typeof t=="function")return`RAWJS<${t.toString().split('"').join("").split(` -`).join("")}>RAWJS`})}function zs(s,e){const t=y(s)[0];if(!t)return;const{prefix:n,getter:i,evalValue:r,json:o=!0,evalArgs:a=[]}={prefix:"z-",...typeof e=="string"?{prefix:e}:e},l=Array.isArray(r)?new Set(r):void 0;return Array.from(t.attributes).reduce((c,u)=>{let{name:h}=u;const{value:p}=u;let m=p;if(h.startsWith(n)){if(h=h.slice(n.length).replace(/-([a-z])/g,v=>v[1].toUpperCase()),i)m=i(h,p);else try{r&&(!l||l.has(h))||r===void 0&&p.includes("RAWJS")?m=ls(p,...a):o&&(m=JSON.parse(p))}catch{}c[h]=m}return c},{})}function Sl(s,e,t="z-"){const n=y(s);Object.keys(e).forEach(i=>{let r=e[i];typeof r=="function"&&(r=`RAWJS<${r}>RAWJS`),typeof r!="string"&&(r=JSON.stringify(r)),i=i.replace(/[A-Z]/g,o=>`-${o.toLowerCase()}`),n.attr(`${t}${i}`,r)})}function Ky(...s){var t;const e=s.length;if(!e)return zs(this);if(e===1){const[n]=s;return typeof n=="string"?(t=zs(this))==null?void 0:t[n]:(y.isPlainObject(n)&&Sl(this,n),this)}return Sl(this,{[s[0]]:s[1]}),this}y.fn.z=Ky,y.fn._attr=y.fn.attr,y.fn.extend({attr(...s){const[e,t]=s;return!s.length||s.length===1&&typeof e=="string"?this._attr.apply(this,s):typeof e=="object"?(e&&Object.keys(e).forEach(n=>{const i=e[n];i===null?this.removeAttr(n):this._attr(n,i)}),this):t===null?this.removeAttr(e):this._attr(e,t)}}),y.Event||(y.Event=(s,e)=>{const[t,...n]=s.split("."),i=new Event(t,{bubbles:!0,cancelable:!0});return i.namespace=n.join("."),i.___ot=t,i.___td=e,i});const cs=(s,e)=>new Promise(t=>{const n=window.setTimeout(t,s);e&&e(n)}),yd={};y.share=yd;var Jr,Be,vd;I.isValidElement=void 0;var hs,_d,bd,kl,Tl,Dl,$l,Di={},wd=[],qy=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,Qr=Array.isArray;function An(s,e){for(var t in e)s[t]=e[t];return s}function Cd(s){s&&s.parentNode&&s.parentNode.removeChild(s)}function b(s,e,t){var n,i,r,o={};for(r in e)r=="key"?n=e[r]:r=="ref"?i=e[r]:o[r]=e[r];if(arguments.length>2&&(o.children=arguments.length>3?Jr.call(arguments,2):t),typeof s=="function"&&s.defaultProps!=null)for(r in s.defaultProps)o[r]===void 0&&(o[r]=s.defaultProps[r]);return eo(s,o,n,i,null)}function eo(s,e,t,n,i){var r={type:s,props:e,key:t,ref:n,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:i??++vd,__i:-1,__u:0};return i==null&&Be.vnode!=null&&Be.vnode(r),r}function ue(){return{current:null}}function vn(s){return s.children}function pe(s,e){this.props=s,this.context=e}function Fs(s,e){if(e==null)return s.__?Fs(s.__,s.__i+1):null;for(var t;ee&&hs.sort(kl));to.__r=0}function kd(s,e,t,n,i,r,o,a,l,c,u){var h,p,m,v,w,x=n&&n.__k||wd,S=e.length;for(t.__d=l,Gy(t,e,x),l=t.__d,h=0;h0?eo(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i).__=s,i.__b=s.__b+1,r=null,(a=i.__i=Yy(i,t,o,u))!==-1&&(u--,(r=t[a])&&(r.__u|=131072)),r==null||r.__v===null?(a==-1&&h--,typeof i.type!="function"&&(i.__u|=65536)):a!==o&&(a==o-1?h--:a==o+1?h++:(a>o?h--:h++,i.__u|=65536))):i=s.__k[n]=null;if(u)for(n=0;n(l!=null&&!(131072&l.__u)?1:0))for(;o>=0||a=0){if((l=e[o])&&!(131072&l.__u)&&i==l.key&&r===l.type)return o;o--}if(a{!t||typeof t!="object"||Object.keys(t).forEach(n=>{let i=t[n];const r=s[n];i!==r&&(r!==void 0&&(n==="className"||n.endsWith("Class")?i=[r,i]:n==="children"?i=[...no(r),...no(i)]:typeof r=="object"&&(n==="style"||n.endsWith("Style")||n==="attrs"||n.endsWith("Attrs")||n==="props")&&(i=y.extend(r,i))),s[n]=i)})}),s}function El(s){return Object.keys(s).forEach(e=>{s[e]===void 0&&delete s[e]}),s}function Ed(s,e=!0){const t=y(s),n=t[0],i="zui-disable-scroll";if(e){if(t.data(i))return;if((t.css("scrollbar-gutter")||"").includes("stable")){t.data(i,{overflow:t.css("overflow")}).css("overflow","hidden");return}const r=n===document.body||t.is("html")?window.innerWidth-document.body.clientWidth:n.offsetWidth-n.clientWidth;if(!r)return;const o=t.css("paddingRight")||"0";t.data(i,{paddingRight:o,overflow:t.css("overflow")}).css({paddingRight:`${r+Number.parseInt(o,10)}px`,overflow:"hidden"})}else{const r=t.data(i);if(!r)return;t.css(r).removeData(i)}}y.fn.disableScroll=function(s=!0){return this.each((e,t)=>{Ed(t,s)})},y.fn.enableScroll=function(s=!0){return this.disableScroll(!s)};function Ml(s,e,t){if(!(t.on||"click").split(" ").includes(e.type))return;const n=t.selector?y(e.target).closest(t.selector):s;if(!n.length)return;const i=c=>c===""?!0:c,r=c=>{if(typeof c=="string")try{c=JSON.parse(c)}catch{}return c};if(i(t.once)){if(t.onceCalled)return;s.dataset("once-called",!0)}if(i(t.prevent)&&e.preventDefault(),i(t.stop)&&e.stopPropagation(),i(t.self)&&e.currentTarget!==e.target)return;const o=[["$element",s],["event",e],["options",t],["$target",n]],a=c=>typeof c=="function"?c(...o):y.runJS(c,...o);if(t.if!==void 0&&!a(t.if))return;const l=t.call;if(l){let c;if(typeof l=="string"?c=/^[$A-Z_][0-9A-Z_$.]*$/i.test(l)?Si(window,l):a(l):c=l,typeof c=="function"){const u=[],h=t.params;t.params=u,typeof h=="string"&&h.length?h[0]==="["?u.push(...r(h)):u.push(...h.split(", ").map(p=>(p=p.trim(),p==="$element"?s:p==="event"?e:p==="options"?t:p.startsWith("$element.")||p.startsWith("event.")||p.startsWith("options.")?a(p):r(p)))):Array.isArray(h)?u.push(...h):u.push(h),c(...u)}}t.do&&a(t.do)}function Jy(s){const e=y(this),t=s.type,n=e.attr("zui-on");if(n){const[o,a]=n.split("~").map(l=>l.trim());o&&o.split(" ").includes(t)&&Ml(e,s,y.extend({on:o},a?a.startsWith("{")?ls(a):{do:a}:zs(e,{prefix:"data-",evalValue:["call","if","do"]})))}const i=e.attr(`zui-on-${t}`);i&&Ml(e,s,y.extend({on:t},i.startsWith("{")?ls(i):{do:i}));const r=e.attr("data-on");r&&r.split(" ").includes(t)&&Ml(e,s,zs(e,{prefix:"data-",evalValue:["call","if","do"]}))}function Md(s){y(document).off(".zui.global").on(s.map(e=>`${e}.zui.global`).join(" "),`[zui-on],${s.map(e=>`[zui-on-${e}]`)},[data-on]`,Jy)}y(()=>{Md(["click","change","inited"])});function ds(s,e){if(typeof s=="function")return ds(s(...e||[]));if(typeof s=="number")return[s];let t=s.match(/(\d+)(%|px)?/);return t?[parseInt(t[1]),t[2]]:(t=s.match(/(\d+)\/(\d+)/),t?[100*parseInt(t[1])/parseInt(t[2]),"%"]:[NaN])}function qe(s,e){if(s==null)return null;const[t,n="px"]=ds(s,e);return Number.isNaN(t)?typeof s=="string"?s:null:`${t}${n}`}async function js(s,e){var n,i,r;if(s instanceof Blob){const o=document.createElement("a");return o.href=window.URL.createObjectURL(s),e&&(o.download=decodeURIComponent(e)),o.click(),o.remove(),s}if(s instanceof Response){const o=await s.blob();return e=e||((r=(i=(n=s.headers.get("Content-Disposition"))==null?void 0:n.split(";")[1])==null?void 0:i.split("=")[1])==null?void 0:r.replace(/"/g,"")),js(o,e)}const t=await fetch(s);return js(t)}class Ad{constructor(e){this._$target=y(e)}on(...e){return this._$target.on(...e),this}one(...e){return this._$target.one(...e),this}off(...e){return this._$target.off(...e),this}trigger(...e){return this._$target.trigger(...e),this}}const nn=new Ad(document);y.bus=nn,y.on=nn.on.bind(nn),y.one=nn.one.bind(nn),y.off=nn.off.bind(nn),y.trigger=nn.trigger.bind(nn);var Qy=["Shift","Meta","Alt","Control"],Pd=typeof navigator=="object"?navigator.platform:"",Ld=/Mac|iPod|iPhone|iPad/.test(Pd),ev=Ld?"Meta":"Control",tv=Pd==="Win32"?["Control","Alt"]:Ld?["Alt"]:[];function Al(s,e){return typeof s.getModifierState=="function"&&(s.getModifierState(e)||tv.includes(e)&&s.getModifierState("AltGraph"))}function nv(s){return s.trim().split(" ").map(function(e){var t=e.split(/\b\+/),n=t.pop();return[t=t.map(function(i){return i==="$mod"?ev:i}),n]})}function Rd(s,e){var t;e===void 0&&(e={});var n=(t=e.timeout)!=null?t:1e3,i=Object.keys(s).map(function(a){return[nv(a),s[a]]}),r=new Map,o=null;return function(a){a instanceof KeyboardEvent&&(i.forEach(function(l){var c=l[0],u=l[1],h=r.get(c)||c;(function(p,m){return!(m[1].toUpperCase()!==p.key.toUpperCase()&&m[1]!==p.code||m[0].find(function(v){return!Al(p,v)})||Qy.find(function(v){return!m[0].includes(v)&&m[1]!==v&&Al(p,v)}))})(a,h[0])?h.length>1?r.set(c,h.slice(1)):(r.delete(c),u(a)):Al(a,a.key)||r.delete(c)}),o&&clearTimeout(o),o=setTimeout(r.clear.bind(r),n))}}function sv(s,e,t){var n;t===void 0&&(t={});var i=(n=t.event)!=null?n:"keydown",r=Rd(e,t);return s.addEventListener(i,r),function(){s.removeEventListener(i,r)}}function Pl(s,e={}){if(!s)return;const t=Object.keys(e).reduce((n,i)=>(e[i].optional||(n[i]={...e[i]}),n),{});return Object.keys(s).forEach(n=>{const i=s[n];i?i===!0?e[n]&&(t[n]={...e[n]}):t[n]=i:delete t[n]}),Object.keys(t).reduce((n,i)=>{const{keys:r,handler:o}=t[i];return typeof r=="string"?n[r]=o:r.forEach(a=>{n[a]=o}),n},{})}function Ll(s,e,t){const{timeout:n,event:i="keydown",scope:r,when:o}=t||{},a=Rd(e,{timeout:n}),l=`.zui.hotkeys${r?`.${r}`:""}`,c="zui-hotkeys-composing";return y(s).on(`${i}${l}`,function(u){o&&o(u)===!1||y(u.target).data(c)||a(u)}).on(`compositionstart${l}`,u=>{y(u.target).data(c,!0)}).on(`compositionend${l}`,u=>{y(u.target).removeData(c)})}function Rl(s,e){return y(s).off(`.zui.hotkeys${e?`.${e}`:""}`)}const iv=sv;y.fn.hotkeys=function(s,e){return Ll(this,s,e)},y.fn.unbindHotkeys=function(s){return Rl(this,s)},y.hotkeys=function(s,e){Ll(window,s,e)},y.unbindHotkeys=function(s){Rl(window,s)};function io(){return document.fullscreenElement||document.webkitFullscreenElement||document.mozFullScreenElement}async function Od(s){(typeof s=="string"||s instanceof Element||s instanceof y)&&(s={target:s});const{target:e,onError:t,onSuccess:n,afterExit:i,afterEnter:r}=s,o=y(e),a=o[0];if(!a)return;const l=a.requestFullscreen||a.webkitRequestFullscreen||a.mozRequestFullScreen;if(!l){t==null||t.call(a,new Error("[ZUI] The browser does not support full screen feature."));return}try{await l.call(a),n==null||n.call(a),y(a).off(".zui.fullscreen"),i&&o.on("exitFullscreen.zui.fullscreen",i),r&&o.on("enterFullscreen.zui.fullscreen",r)}catch(c){t==null||t.call(a,c)}document.zuiBindFullscreenChange||(document.zuiBindFullscreenChange=!0,y(document).on("fullscreenchange.zui webkitfullscreenchange.zui mozfullscreenchange.zui",c=>{const u=io();let h=u;u?y(u).addClass("is-in-fullscreen"):(h=y(document).find(".is-in-fullscreen")[0]||document,y(h).removeClass("is-in-fullscreen")),y("body").toggleClass("has-in-fullscreen",!!u);const p={event:c,target:h,fullscreenElement:u};y(h).trigger(u?"enterFullscreen":"exitFullscreen",p).trigger("toggleFullscreen",p)}))}async function Ol(s){const e=io();return s===!1&&!!e===s?s:e?(document.exitFullscreen(),!1):(await Od(s),!0)}y.fn.fullscreen=function(s){return Ol({target:this,...s})},y.getFullscreenElement=io,y.toggleFullscreen=Ol;function Pn(s){return!s||s.parentNode===document?!1:s.parentNode?Pn(s.parentNode):!0}y.isDetached=Pn,y.fn.isDetached=function(){const s=this[0];return!s||Pn(s)};const fs=class jg{constructor(e,t){var v;this._inited=!1,this._autoDestory=0,this._destroyed=!1;const{KEY:n,DATA_KEY:i,MULTI_INSTANCE:r,NAME:o,ATTR_KEY:a,ALL:l,TYPED_ALL:c}=this.constructor;if(!o)throw new Error('[ZUI] The component must have a "NAME" static property.');const u=y(e);if(u.data(n)&&!r)throw new Error(`[ZUI] The component "${o}" has been initialized on element.`);const h=u[0];if(!h)throw new Error(`[ZUI] Invalid selector "${e}" for component "${o}", can not find the element matched.`);const p=wt();this._gid=p,this._element=h,this.resetOptions(t),this._key=this.options.key??`__${p}`;let m=l.get(h);if(m?m.add(this):(m=new Set([this]),l.set(h,m)),c.has(o)?c.get(o).add(this):c.set(o,new Set([this])),u.data(n,this).attr(a,"").attr(i,`${p}`).attr("z-use",[...new Set([...m].map(w=>w.constructor.NAME))].join(",")),r){const w=`${n}:ALL`;let x=u.data(w);x||(x=new Map,u.data(w,x)),x.set(this._key,this)}this.init(),(v=this.options.$onCreate)==null||v.call(this),requestAnimationFrame(async()=>{var w;this._inited=!0,await this.afterInit(),this.emit("inited",this.options),(w=this.options.$onInited)==null||w.call(this)})}static get ZUI(){return this.NAME.replace(/(^[A-Z]+)/,e=>e.toLowerCase())}static get KEY(){return`zui.${this.NAME}`}static get NAMESPACE(){return`.zui.${this.ZUI}`}static get DATA_KEY(){return`data-zui-${this.NAME}`}static get ATTR_KEY(){return`z-use-${this.NAME}`}static get SELECTOR(){return`[${this.DATA_KEY}]`}get inited(){return this._inited}get destroyed(){return this._destroyed}get element(){return this._element}get key(){return this._key}get options(){return this._options}get gid(){return this._gid}get $element(){return y(this.element)}get $emitter(){return this.$element}get i18nData(){return[this.options.i18n,this.constructor.i18n]}init(){}afterInit(){}render(e,t){this.setOptions(e,t)}destroy(){var m;const{KEY:e,DATA_KEY:t,ALL:n,TYPED_ALL:i,NAME:r,MULTI_INSTANCE:o,ATTR_KEY:a}=this.constructor,{$element:l,element:c}=this;if(this.emit("destroyed"),this._destroyed=!0,l.off(this.namespace).removeData(e).removeAttr(a).removeAttr(t),o){const v=this.$element.data(`${e}:ALL`);if(v)if(v.delete(this._key),v.size===0)this.$element.removeData(`${e}:ALL`);else{const w=v.values().next().value;l.data(e,w).attr(t,String(w==null?void 0:w.gid))}}const u=n.get(c);u&&(u.delete(this),u.size===0&&n.delete(c));const h=i.get(r);h&&(h.delete(this),h.size===0&&i.delete(r));const p=n.get(c);p!=null&&p.size?l.attr("z-use",[...new Set([...p].map(v=>v.constructor.NAME))].join(",")):l.removeAttr("z-use"),(m=this.options.$onDestroy)==null||m.call(this)}autoDestroy(e=100){this._autoDestory&&clearTimeout(this._autoDestory),this._autoDestory=window.setTimeout(()=>{this._autoDestory=0,Pn(this.element)&&this.destroy()},e)}setOptions(e,t){if(t){const n={...this.constructor.DEFAULT,...(e==null?void 0:e.$optionsFromDataset)!==!1?this.$element.dataset():{},...e},{$options:i}=n;if(i){const r=typeof i=="function"?i.call(this,this.element,n):i;r&&y.extend(n,r),delete n.$options}this._options=n}else e&&y.extend(this._options,e);return this._options}resetOptions(e){return this.setOptions(e,!0)}emit(e,...t){const n=y.Event(e);return n.__src=this,this.$emitter.trigger(n,[this,...t]),n}on(e,t,n){const i=this;this.$element[n!=null&&n.once?"one":"on"](this._wrapEvent(e),function(r,o){(!r.__src||r.__src===i)&&t.call(this,r,o)})}one(e,t){this.on(e,t,{once:!0})}off(e){this.$element.off(this._wrapEvent(e))}i18n(e,t,n){const{i18nData:i}=this;return Ee(i,e,t,n,this.options.lang,this.constructor.NAME)??Ee(i,e,t,n,this.options.lang)??`{i18n:${e}}`}get namespace(){return`${this.constructor.NAMESPACE}.${this._key}`}_wrapEvent(e){return e.split(" ").map(t=>t.includes(".")?t:`${t}${this.namespace}`).join(" ")}static get(e,t){const n=y(e);if(this.MULTI_INSTANCE&&t!==void 0){const i=n.data(`${this.KEY}:ALL`);return i?i.get(t):void 0}return n.data(this.KEY)}static isValid(e){return!0}static ensure(e,t){const n=this.get(e,t==null?void 0:t.key);if(n){if(this.isValid(n))return t&&n.setOptions(t),n;n.destroy()}return new this(e,t)}static getAll(e,t){var l;const{SELECTOR:n,ALL:i,TYPED_ALL:r}=this,o=[],a=c=>{c instanceof this&&(!t||t(c)!==!1)&&o.push(c)};return e?y(e).find(n).each((c,u)=>{var h;(h=i.get(u))==null||h.forEach(a)}):this!==jg?(l=r.get(this.NAME))==null||l.forEach(a):i.forEach(c=>{c.forEach(a)}),o.sort((c,u)=>c.gid-u.gid)}static query(e,t,n){return e===void 0?this.getAll(void 0,n).pop():this.get(y(e).closest(this.SELECTOR),t)}static defineFn(e){let t=e||this.ZUI;y.fn[t]&&(t=`zui${this.NAME}`);const n=this;y.fn.extend({[t](i,...r){const o=typeof i=="object"?i:void 0,a=typeof i=="string"?i:void 0;let l;return this.each((c,u)=>{let h=n.get(u);if(h)o&&h.render(o);else{if(a)return;h=new n(u,o)}if(a){let p=h[a],m=h;p===void 0&&(m=h.$,p=m[a]),typeof p=="function"?l=p.call(m,...r):l=p}}),l!==void 0?l:this}})}static register(e,t){var i,r;e=e||this,t=(t??e.NAME).toLowerCase(),this.map.set(t,e);const n=(r=(i=e.toggle)==null?void 0:i.name)==null?void 0:r.toLowerCase();n&&n!==t&&this.toggleMap.set(n,e)}};fs.DEFAULT={},fs.MULTI_INSTANCE=!1,fs.ALL=new Map,fs.TYPED_ALL=new Map,fs.map=new Map,fs.toggleMap=new Map;let Ue=fs;function $i(s){return Ue.map.get(s.toLowerCase())}function ro(s,e,t={}){let n=$i(s);if(n||(n=zl(s)),!n)return null;const{$update:i,...r}=t;if(!n.MULTI_INSTANCE){const o=n.get(e);if(o)return i&&o.render(r,i==="reset"),o}return new n(e,r)}function rv(s,e,t={}){requestAnimationFrame(()=>ro(s,e,t))}function zd(s,e){Ue.register(s,e)}function zl(s){const{zui:e}=window;if(e){s=s==null?void 0:s.toLowerCase();for(const t in e){const n=t.toLowerCase()===s;if(s&&!n)continue;const i=e[t];if(!(typeof i!="function"||!i.NAME||!i.ZUI)&&(Ue.map.has(t.toLowerCase())||zd(i),n))return i}}}function ov(s){var e;s?(e=$i(s))==null||e.defineFn():window._zuiDefined||(zl(),Ue.map.forEach(t=>{t.defineFn()}),Object.assign(window,{_zuiDefined:!0}))}function av(s,e={}){const t=y(s);let n=t.attr("zui-create");const{update:i,onCreate:r}=e,o=(a,l)=>{if(l={$update:i,$optionsFromDataset:!1,...l},r){const u=r(a,l);if(u===!1)return;u&&(l=u)}const c=l.$lib;if(c){delete l.$lib,y.getLib(c).then(()=>ro(a,s,l));return}rv(a,s,l)};if(typeof n=="string"){n=n.trim();const a=n.length?n.split(",").map(u=>u.trim()):[],l=zs(s,{prefix:"zui-create-",evalValue:!0}),c=Object.keys(l);if(!c.length&&a.length===1)o(a[0],t.dataset());else{const u=new Set;[...a,...c].forEach(h=>{if(u.has(h))return;const p=l[h];o(h,p),delete l[h],u.add(h)})}}else{const a=t.dataset(),l=a==null?void 0:a.zui;if(!l)return;console.warn("[ZUI] create component instance with [data-zui] is deprecated, use [zui-create] instead.",{element:s,options:e}),delete a.zui,o(l,a)}}function lv(){y(document).on("click.zui.toggle mouseenter.zui.toggle","[data-toggle],[zui-toggle]",function(s){const e=y(this),t=e.dataset("toggle")||e.attr("zui-toggle");if(!t)return;const n=Ue.toggleMap.get(t)||$i(t),i=n==null?void 0:n.toggle;if(!i)return;const{trigger:r="click",skip:o="[disabled],.disabled",check:a}=i,l=s.type==="mouseover"?"hover":"click";if(!r.includes(l)||a&&!a.call(n,this,l,s)||o&&e.is(o))return;const{onGet:c,onCreate:u,setOptions:h=!0,getOptions:p,prevent:m=!0,handler:v,onToggle:w,convertHref:x}=i;let S=e.dataset();const D=e.attr(`zui-toggle-${t}`);if(D&&(S=y.extend(S,ls(D))),x&&e.is("a")){const P=e.attr("href");if(P){const B=x===!0?{selector:"target",url:"url"}:x;"#.".includes(P[0])?B.selector&&S[B.selector]===void 0&&(S[B.selector]=P):B.url&&S[B.url]===void 0&&(S[B.url]=P)}}if(p&&(S=p.call(n,this,S,s)),v){v.call(n,this,S,l,s),m&&s.preventDefault();return}let M=c?c.call(n,this):n.get(this);if(M)h&&M.setOptions(S);else{const P=u?u.call(n,this,s,S):new n(this,S);if(!P)return;M=P}if(w){if(w.call(n,M,this,s)===!1)return}else{const{shown:P,show:B,hide:q,toggle:Y}=M;let Z;if(Y?Z=Y:B&&q?P?Z=q:Z=B:B&&(Z=B),Z)Z.call(M);else return}m&&s.preventDefault()})}function cv(s,e){const t=Ti(s),n=[];return Object.keys(t).forEach(i=>{if(!i.startsWith("zui."))return;const r=t[i];(e==null?void 0:e(r,i))!==!1&&n.push(t[i])}),n}let oo=0;function Fd(s=100){if(oo&&clearTimeout(oo),s){oo=window.setTimeout(()=>Fd(0),s);return}oo=0,Ue.ALL.forEach(e=>{e.forEach(t=>t.autoDestroy())})}function hv(){if(!document.body||Ti(document.body,"_autoDestoryMob"))return;const s=new MutationObserver(e=>{let t=!1;for(const n of e)if(n.removedNodes.length){t=!0;break}t&&Fd()});s.observe(document.body,{childList:!0,subtree:!0}),Zr(document.body,"_autoDestoryMob",s)}function Fl(s,e){const t=y(s);t.find("[zui-create],[data-zui]").each(function(){var n;((n=e==null?void 0:e.beforeCreate)==null?void 0:n.call(e,this))!==!1&&av(this,e)}),t.find("[zui-init]").each(function(){this.hasAttribute("z-zui-inited")||(this.setAttribute("z-zui-inited",""),y.runJS(this.getAttribute("zui-init"),["$element",y(this)]))}),t.find(".hide-before-init").removeClass("invisible hidden opacity-0"),t.find(".scroll-into-view").scrollIntoView(),t.find('[data-on="inited"],[zui-on-inited]').each((n,i)=>{const r=y(i);r.zui()||r.trigger("inited")}),e!=null&&e.runJS&&t.runJS()}y.fn.zuiInit=function(s){return Fl(this,s),this},y.fn.zui=function(s,e){const t=this[0];if(!t)return;if(typeof s!="string"){const i={};let r;return cv(t,(o,a)=>{i[a]=o,(!r||r.gid1?t[0]:void 0,i=t[t.length>1?1:0],r=y(this).zui(n),o=r==null?void 0:r[i];typeof o=="function"&&o.apply(r,e)}),this},y(()=>{y("body").zuiInit({update:!0}),lv(),hv()});class ao extends Ue{get $targets(){const{$element:e}=this,{targets:t}=this.options;return t?e.find(t):e}_handleScroll(e,t,n){const{offset:i=1}=this.options,r=this.$targets,o=e.getBoundingClientRect(),{scrollTop:a,scrollLeft:l}=e;r.each((c,u)=>{const h=u.getBoundingClientRect(),p=t==="top"&&a>0&&h.top<=o.top+i||t==="bottom"&&h.bottom>=o.bottom-i||t==="left"&&l>0&&h.left<=o.left+i||t==="right"&&l{this._raf&&cancelAnimationFrame(this._raf),this._raf=requestAnimationFrame(()=>{this._raf=0,this._handleScroll(l,t,i)})};this._scrollListener=c,l.addEventListener("scroll",c)}this._container=l,requestAnimationFrame(()=>{this._handleScroll(l,t,i)})}else this._ob=new IntersectionObserver(l=>{l.forEach(c=>{c.target.classList.toggle(i,c.intersectionRatiothis._ob.observe(c))}destroy(){var e;(e=this._ob)==null||e.disconnect(),this._container&&(this._container.removeEventListener("scroll",this._scrollListener),this._raf&&cancelAnimationFrame(this._raf))}}ao.NAME="Sticky";const Hs=24*60*60*1e3,We=s=>s===void 0?new Date:(s instanceof Date||(typeof s=="string"&&(s=s.trim(),/^\d+$/.test(s)&&(s=Number.parseInt(s,10))),typeof s=="number"&&s<1e10&&(s*=1e3),s=new Date(s)),s),jd=(s,e,t="day")=>{if(typeof e=="string"){const n=Number.parseInt(e,10);t=e.replace(n.toString(),""),e=n}return s=new Date(We(s).getTime()),t==="month"?s.setMonth(s.getMonth()+e):t==="year"?s.setFullYear(s.getFullYear()+e):t==="week"?s.setDate(s.getDate()+e*7):t==="hour"?s.setHours(s.getHours()+e):t==="minute"?s.setMinutes(s.getMinutes()+e):t==="second"?s.setSeconds(s.getSeconds()+e):s.setDate(s.getDate()+e),s},Ln=(s,e=new Date)=>We(s).toDateString()===We(e).toDateString(),Ii=(s,e=new Date)=>We(s).getFullYear()===We(e).getFullYear(),jl=(s,e=new Date)=>(s=We(s),e=We(e),s.getFullYear()===e.getFullYear()&&s.getMonth()===e.getMonth()),uv=(s,e=new Date)=>{s=We(s),e=We(e);const t=1e3*60*60*24,n=Math.floor(s.getTime()/t),i=Math.floor(e.getTime()/t);return Math.floor((n+4)/7)===Math.floor((i+4)/7)},dv=(s,e)=>Ln(We(e),s),fv=(s,e)=>Ln(We(e).getTime()-Hs,s),pv=(s,e)=>Ln(We(e).getTime()+Hs,s),Hl=s=>s!=null&&!isNaN(We(s).getTime()),Je=(s,e="yyyy-MM-dd hh:mm",t="")=>{if(s=We(s),!Hl(s))return t;if(typeof e=="function")return e(s);const n={"M+":s.getMonth()+1,"d+":s.getDate(),"h+":s.getHours(),"H+":s.getHours()%12,"m+":s.getMinutes(),"s+":s.getSeconds(),"S+":s.getMilliseconds()};return/(y+)/i.test(e)&&(e.includes("[yyyy-]")&&(e=e.replace("[yyyy-]",Ii(s)?"":"yyyy-")),e=e.replace(RegExp.$1,`${s.getFullYear()}`.substring(4-RegExp.$1.length))),Object.keys(n).forEach(i=>{if(new RegExp(`(${i})`).test(e)){const r=`${n[i]}`;e=e.replace(RegExp.$1,RegExp.$1.length===1?r:`00${r}`.substring(r.length))}}),e},mv=(s,e,t)=>{const n={full:"yyyy-M-d",month:"M-d",day:"d",str:"{0} ~ {1}",...t},i=Je(s,Ii(s)?n.month:n.full);if(Ln(s,e))return i;const r=Je(e,Ii(s,e)?jl(s,e)?n.day:n.month:n.full);return n.str.replace("{0}",i).replace("{1}",r)};function Bl(s){let e=0;if(typeof s!="string"&&(s=String(s)),s&&s.length)for(let t=0;t{try{a.includes("%")&&(a=decodeURIComponent(a)),a=JSON.parse(a)}catch{}return[o,a]})),params:n.map(o=>{if(o!=="undefined"){if(o==="null")return null;try{return o.includes("%")&&(o=decodeURIComponent(o)),JSON.parse(o)}catch{return o}}})}}function Hd(s){if(Array.isArray(s))return{commands:s.map(lo).filter(Boolean)};if(typeof s=="object")return s;s=s.replace(/^#!?/,"");const e=s.includes(">"),t=s.split(e?">":"|").map(lo);return{async:e,commands:t.filter(Boolean)}}function Ul(s,e,t){if(typeof s=="string"&&(s=lo(s)),!s)return;const{execute:n,event:i,scope:r}=e;if(!(r&&s.scope&&s.scope!==r))return n({name:s.name,options:{...e.options,...s.options},event:i,scope:s.scope,prevResult:t},s.params)}async function Bd(s,e){const{async:t,commands:n}=Hd(s);if(!n.length)return[];const{signal:i}=e;if(t){const o=[];let a;for(const l of n){if(!(i!=null&&i.aborted))break;a=await Ul(l,e,a),i!=null&&i.aborted&&(a=void 0),o.push(a)}return o}return await Promise.all(n.map(o=>{if(!(i!=null&&i.aborted))return Ul(o,e)}))}const Bs="zui.commands",Us="z-commands",Wl="zui-commands-proxy",Ud="zui-command",co={};function Wd(s,e){typeof s=="string"&&e?co[s]=e:typeof s=="object"&&Object.assign(co,s)}function ho(s,e){typeof e=="string"?e={scope:e}:typeof e=="function"&&(e={onCommand:e});const{scope:t="",events:n="click"}=e??{},i=y(s),r=(i.attr(Us)||"").split(",");t&&!r.includes(t)&&r.push(t),i.attr(Us,r.join(",")).data(Bs,{[t]:{...e,scope:t,events:n,gid:wt()},...i.data(Bs)})}function uo(s,e=!0){const t=y(s);if(e===!0)t.removeAttr(Us),t.removeData(Bs);else if(e.length){const n=t.data(Bs)||{};e.split(",").forEach(r=>{delete n[r]});const i=Object.keys(n);i.length?t.attr(Us,i.join(",")).data(Bs,ho):uo(t,!0)}}function Vd(s,e){let t=s.closest(`[${Us}],[${Wl}]`).first();if(t.attr(Wl)!==void 0&&(t=y(t.data("zui.commandProxy")||t.attr(Wl)).closest(`[${Us}]`)),!t.length)return;const n=t.data(Bs)||{},i=Object.values(n).sort((o,a)=>a.gid-o.gid);let r;return e!=null&&e.length?(r=i.find(o=>o.scope===e),r||(r=i.find(o=>{var a;return!((a=o.scope)!=null&&a.length)&&!o.scoped})),r):(r=i.find(o=>{var a;return!((a=o.scope)!=null&&a.length)&&!o.scoped}),r||(r=i.find(o=>!o.scoped)),r?r.element=t[0]:r=Vd(s.parent(),e),r)}function gv(s){if(!s.currentTarget)return;const e=y(s.currentTarget);if(e.closest(".disabled,[disabled]").length)return;const t=e.attr(Ud)||(e.is('a[href^="#!"]')?e.attr("href"):"");if(!t)return;const n=new AbortController,i=()=>n.abort();Bd(t,{signal:n.signal,execute:(r,o)=>{const{scope:a,name:l}=r,c={...r,abort:i};let u;const h=Vd(e,a);if(h){c.element=h.element;const m=(h.commands?h.commands[`${a}~${l}`]||h.commands[l]:null)||h.onCommand;if(m&&(u=m(c,o),s.commandHandled))return u}const p=[c,o];if(e.trigger("command",p).trigger(`command:${a?`${l}.${a}`:l}`,p),a&&e.trigger(`command:.${a}`,p),s.commandHandled)return u;if(a==="event"){l==="stop"?s.stopPropagation():l==="prevent"?s.preventDefault():Mn(s,l,o);return}return a==="window"?Mn(window,l,o):a==="zui"?Mn(window.zui,l,o):a==="target"?Mn(e[0],l,o):a==="$target"?Mn(e,l,o):a==="$"?Mn(y,l,o):a===""&&co[l]!==void 0?co[l](c,o):u},event:s})}y.fn.command=function(s,e){return this.on(`command:${s}`,e)},y.fn.offCommand=function(s,e){return this.off(`command:${s}`,e)},y.fn.commands=function(s){return this.each((e,t)=>ho(t,s)),this},y.fn.unbindCommands=function(s){return this.each((e,t)=>uo(t,s)),this},y(()=>{y(document).on("click.zui.command",`[${Ud}],a[href^="#!"]`,gv)});function Ni(s,e,t=!1){var i;const n=y(s);if(e!==void 0){if(typeof e=="string"&&e.length){const r=`zui-runjs-${wt()}`;n.append(`"; +?> + +
IDDuration (ms)QueryIDDuration (ms)Query
${detail.Query_ID}${detail.Duration * (oldVersion ? 1000 : 1)}${detail.Query}', + `
${detail.Query}
`, + detail.Code ? `
${detail.Code}
` : '', + '