diff --git a/.gitfox/CODEOWNERS b/.gitfox/CODEOWNERS
index a0484e1136..0360e4d6c5 100644
--- a/.gitfox/CODEOWNERS
+++ b/.gitfox/CODEOWNERS
@@ -1,3 +1,5 @@
+config/cache.php liugang@easycorp.ltd zhujinyong@easycorp.ltd
framework/** liugang@easycorp.ltd zhujinyong@easycorp.ltd
lib/base/** liugang@easycorp.ltd zhujinyong@easycorp.ltd
+lib/cache/** liugang@easycorp.ltd zhujinyong@easycorp.ltd
CODEOWNERS liugang@easycorp.ltd zhujinyong@easycorp.ltd qishiyao@easycorp.ltd
diff --git a/VERSION b/VERSION
index 74623ac8d7..90cd64c4fa 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-21.0
\ No newline at end of file
+21.1
\ No newline at end of file
diff --git a/config/config.php b/config/config.php
index 4492008fab..7e4c05d0cc 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.0'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
+$config->version = '21.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/db/standard/zentao21.1.sql b/db/standard/zentao21.1.sql
new file mode 100644
index 0000000000..f7c44f0133
--- /dev/null
+++ b/db/standard/zentao21.1.sql
@@ -0,0 +1,4464 @@
+CREATE TABLE `im_chat` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `gid` char(40) NOT NULL DEFAULT '',
+ `name` varchar(60) NOT NULL DEFAULT '',
+ `type` varchar(20) NOT NULL DEFAULT 'group',
+ `admins` varchar(255) NOT NULL DEFAULT '',
+ `committers` varchar(255) NOT NULL DEFAULT '',
+ `subject` mediumint(8) unsigned NOT NULL DEFAULT 0,
+ `public` enum('0','1') NOT NULL DEFAULT '0',
+ `createdBy` varchar(30) NOT NULL DEFAULT '',
+ `createdDate` datetime DEFAULT NULL,
+ `ownedBy` varchar(30) NOT NULL DEFAULT '',
+ `editedBy` varchar(30) NOT NULL DEFAULT '',
+ `editedDate` datetime DEFAULT NULL,
+ `mergedDate` datetime DEFAULT NULL,
+ `lastActiveTime` datetime DEFAULT NULL,
+ `lastMessage` int(11) unsigned NOT NULL DEFAULT 0,
+ `lastMessageIndex` int(11) unsigned NOT NULL DEFAULT 0,
+ `dismissDate` datetime DEFAULT NULL,
+ `pinnedMessages` text DEFAULT NULL,
+ `mergedChats` text DEFAULT NULL,
+ `adminInvite` enum('0','1') NOT NULL DEFAULT '0',
+ `avatar` text DEFAULT NULL,
+ `archiveDate` datetime DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `gid` (`gid`),
+ KEY `name` (`name`),
+ KEY `type` (`type`),
+ KEY `public` (`public`),
+ KEY `createdBy` (`createdBy`),
+ KEY `editedBy` (`editedBy`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_chat_message_index` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `gid` char(40) NOT NULL,
+ `tableName` char(64) NOT NULL,
+ `start` int(11) unsigned NOT NULL,
+ `end` int(11) unsigned NOT NULL,
+ `startIndex` int(11) unsigned NOT NULL,
+ `endIndex` int(11) unsigned NOT NULL,
+ `startDate` datetime DEFAULT NULL,
+ `endDate` datetime DEFAULT NULL,
+ `count` mediumint(8) unsigned NOT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `chattable` (`gid`,`tableName`),
+ KEY `start` (`start`),
+ KEY `end` (`end`),
+ KEY `startDate` (`startDate`),
+ KEY `endDate` (`endDate`),
+ KEY `chatstartindex` (`gid`,`startIndex`),
+ KEY `chatendindex` (`gid`,`endIndex`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_chatuser` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `cgid` char(40) NOT NULL DEFAULT '',
+ `user` mediumint(8) NOT NULL DEFAULT 0,
+ `order` smallint(5) NOT NULL DEFAULT 0,
+ `star` enum('0','1') NOT NULL DEFAULT '0',
+ `hide` enum('0','1') NOT NULL DEFAULT '0',
+ `mute` enum('0','1') NOT NULL DEFAULT '0',
+ `freeze` enum('0','1') NOT NULL DEFAULT '0',
+ `join` datetime DEFAULT NULL,
+ `quit` datetime DEFAULT NULL,
+ `category` varchar(40) NOT NULL DEFAULT '',
+ `lastReadMessage` int(11) unsigned NOT NULL DEFAULT 0,
+ `lastReadMessageIndex` int(11) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `chatuser` (`cgid`,`user`),
+ KEY `cgid` (`cgid`),
+ KEY `user` (`user`),
+ KEY `order` (`order`),
+ KEY `star` (`star`),
+ KEY `hide` (`hide`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_client` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `version` char(30) NOT NULL DEFAULT '',
+ `desc` varchar(100) NOT NULL DEFAULT '',
+ `changeLog` text DEFAULT NULL,
+ `strategy` varchar(10) NOT NULL DEFAULT '',
+ `downloads` text DEFAULT NULL,
+ `createdDate` datetime DEFAULT NULL,
+ `createdBy` varchar(30) NOT NULL DEFAULT '',
+ `editedDate` datetime DEFAULT NULL,
+ `editedBy` varchar(30) NOT NULL DEFAULT '',
+ `status` enum('released','wait') NOT NULL DEFAULT 'wait',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_conference` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `rid` char(40) NOT NULL DEFAULT '',
+ `cgid` char(40) NOT NULL DEFAULT '',
+ `status` enum('closed','open','notStarted','canceled') NOT NULL DEFAULT 'closed',
+ `participants` text DEFAULT NULL,
+ `subscribers` text DEFAULT NULL,
+ `invitee` text DEFAULT NULL,
+ `openedBy` mediumint(8) NOT NULL DEFAULT 0,
+ `openedDate` datetime DEFAULT NULL,
+ `topic` text DEFAULT NULL,
+ `startTime` datetime DEFAULT NULL,
+ `endTime` datetime DEFAULT NULL,
+ `password` char(20) NOT NULL DEFAULT '',
+ `type` enum('default','periodic','scheduled') NOT NULL DEFAULT 'default',
+ `number` char(20) NOT NULL DEFAULT '',
+ `note` text DEFAULT NULL,
+ `sentNotify` tinyint(1) NOT NULL DEFAULT 0,
+ `reminderTime` int(11) NOT NULL DEFAULT 0,
+ `moderators` text DEFAULT NULL,
+ `isPrivate` enum('0','1') NOT NULL DEFAULT '0',
+ `isInner` enum('0','1') NOT NULL DEFAULT '1',
+ PRIMARY KEY (`id`),
+ KEY `status` (`status`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_conferenceaction` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `rid` char(40) NOT NULL DEFAULT '',
+ `type` enum('create','invite','join','leave','close','publish') NOT NULL DEFAULT 'create',
+ `data` text DEFAULT NULL,
+ `user` mediumint(8) NOT NULL DEFAULT 0,
+ `date` datetime DEFAULT NULL,
+ `device` char(40) NOT NULL DEFAULT 'default',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_conferenceinvite` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `conferenceID` mediumint(8) unsigned NOT NULL,
+ `inviteeID` mediumint(8) unsigned NOT NULL,
+ `status` enum('pending','accepted','rejected') NOT NULL DEFAULT 'pending',
+ `createdDate` datetime DEFAULT NULL,
+ `updatedDate` datetime DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `conference_user` (`conferenceID`,`inviteeID`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_conferenceuser` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `conference` mediumint(8) NOT NULL DEFAULT 0,
+ `user` mediumint(8) NOT NULL DEFAULT 0,
+ `hide` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `conferenceuser` (`conference`,`user`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_message` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `gid` char(40) NOT NULL DEFAULT '',
+ `cgid` char(40) NOT NULL DEFAULT '',
+ `user` varchar(30) NOT NULL DEFAULT '',
+ `date` datetime DEFAULT NULL,
+ `index` int(11) unsigned NOT NULL DEFAULT 0,
+ `type` enum('normal','broadcast','notify','bulletin','botcommand') NOT NULL DEFAULT 'normal',
+ `content` text DEFAULT NULL,
+ `contentType` enum('text','plain','emotion','image','file','object','code') NOT NULL DEFAULT 'text',
+ `data` text DEFAULT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ `legacy` tinyint(1) NOT NULL DEFAULT 0,
+ `uniqueIndex` int(11) GENERATED ALWAYS AS (case when `legacy` = 1 then NULL when `cgid` = 'notification' then NULL else `index` end) STORED,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uniqueIndexInChat` (`cgid`,`uniqueIndex`),
+ KEY `mgid` (`gid`),
+ KEY `mcgid` (`cgid`),
+ KEY `muser` (`user`),
+ KEY `mtype` (`type`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_message_backup` (
+ `id` int(11) unsigned NOT NULL,
+ `gid` char(40) NOT NULL DEFAULT '',
+ `cgid` char(40) NOT NULL DEFAULT '',
+ `user` varchar(30) NOT NULL DEFAULT '',
+ `date` datetime DEFAULT NULL,
+ `index` int(11) unsigned NOT NULL DEFAULT 0,
+ `type` enum('normal','broadcast','notify') NOT NULL DEFAULT 'normal',
+ `content` text DEFAULT NULL,
+ `contentType` enum('text','plain','emotion','image','file','object','code') NOT NULL DEFAULT 'text',
+ `data` text DEFAULT NULL,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_message_index` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `tableName` char(64) NOT NULL,
+ `start` int(11) unsigned NOT NULL,
+ `end` int(11) unsigned NOT NULL,
+ `startDate` datetime DEFAULT NULL,
+ `endDate` datetime DEFAULT NULL,
+ `chats` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ KEY `tableName` (`tableName`),
+ KEY `start` (`start`),
+ KEY `end` (`end`),
+ KEY `startDate` (`startDate`),
+ KEY `endDate` (`endDate`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_messagestatus` (
+ `user` mediumint(8) NOT NULL DEFAULT 0,
+ `message` int(11) unsigned NOT NULL,
+ `status` enum('waiting','sent','readed','deleted') NOT NULL DEFAULT 'waiting',
+ UNIQUE KEY `user` (`user`,`message`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_queue` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `type` char(30) NOT NULL,
+ `content` text DEFAULT NULL,
+ `addDate` datetime DEFAULT NULL,
+ `processDate` datetime DEFAULT NULL,
+ `result` text DEFAULT NULL,
+ `status` char(30) NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `im_userdevice` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `user` mediumint(8) NOT NULL DEFAULT 0,
+ `device` char(40) NOT NULL DEFAULT 'default',
+ `deviceID` char(40) NOT NULL DEFAULT '',
+ `token` char(64) NOT NULL DEFAULT '',
+ `validUntil` datetime DEFAULT NULL,
+ `lastLogin` datetime DEFAULT NULL,
+ `lastLogout` datetime DEFAULT NULL,
+ `online` tinyint(1) NOT NULL DEFAULT 0,
+ `version` char(10) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `userdevice` (`user`,`device`),
+ KEY `user` (`user`),
+ KEY `lastLogin` (`lastLogin`),
+ KEY `lastLogout` (`lastLogout`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+CREATE TABLE `zt_account` (
+ `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(255) NOT NULL DEFAULT '',
+ `type` varchar(255) NOT NULL DEFAULT '',
+ `provider` varchar(255) NOT NULL DEFAULT '',
+ `adminURI` varchar(255) NOT NULL DEFAULT '',
+ `account` varchar(255) NOT NULL DEFAULT '',
+ `password` varchar(255) NOT NULL DEFAULT '',
+ `email` varchar(255) NOT NULL DEFAULT '',
+ `mobile` varchar(255) NOT NULL DEFAULT '',
+ `extra` text DEFAULT NULL,
+ `createdBy` varchar(30) NOT NULL DEFAULT '',
+ `createdDate` datetime DEFAULT NULL,
+ `editedBy` varchar(30) NOT NULL DEFAULT '',
+ `editedDate` datetime DEFAULT NULL,
+ `status` varchar(30) NOT NULL DEFAULT '',
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`),
+ KEY `name` (`name`),
+ KEY `provider` (`provider`),
+ KEY `status` (`status`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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,
+ `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;
+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,
+ `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;
+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;
+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;
+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=utf8;
+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=utf8;
+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=utf8;
+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=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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 '',
+ `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;
+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;
+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;
+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;
+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;
+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,
+ `extra` varchar(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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 '',
+ `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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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,
+ PRIMARY KEY (`execution`,`date`,`task`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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,
+ `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;
+CREATE TABLE `zt_charter` (
+ `id` int(8) NOT NULL AUTO_INCREMENT,
+ `name` varchar(255) NOT NULL DEFAULT '',
+ `level` int(8) NOT NULL DEFAULT 0,
+ `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,
+ `budget` char(30) NOT NULL DEFAULT '',
+ `budgetUnit` char(30) NOT NULL DEFAULT '',
+ `product` text DEFAULT NULL,
+ `roadmap` 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,
+ `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,
+ `reviewedBy` varchar(255) NOT NULL DEFAULT '',
+ `reviewedResult` char(30) NOT NULL DEFAULT '',
+ `reviewedDate` datetime 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;
+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;
+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;
+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(255) 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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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` enum('text','builder') NOT NULL DEFAULT 'builder',
+ `view` varchar(57) NOT NULL DEFAULT '',
+ `sql` text DEFAULT NULL,
+ `fields` mediumtext DEFAULT NULL,
+ `langs` text DEFAULT NULL,
+ `objects` mediumtext 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;
+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;
+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;
+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;
+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;
+CREATE TABLE `zt_deploy` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `begin` datetime DEFAULT NULL,
+ `end` 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;
+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;
+CREATE TABLE `zt_deploystep` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `deploy` mediumint(8) unsigned NOT NULL DEFAULT 0,
+ `title` varchar(255) NOT NULL DEFAULT '',
+ `begin` datetime DEFAULT NULL,
+ `end` datetime DEFAULT NULL,
+ `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;
+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;
+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 '',
+ `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;
+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;
+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;
+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;
+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;
+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,
+ `files` text DEFAULT NULL,
+ `type` varchar(10) NOT NULL DEFAULT '',
+ `version` smallint(6) unsigned NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `doc_version` (`doc`,`version`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+CREATE TABLE `zt_domain` (
+ `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
+ `domain` varchar(255) NOT NULL DEFAULT '',
+ `adminURI` varchar(255) NOT NULL DEFAULT '',
+ `resolverURI` varchar(255) NOT NULL DEFAULT '',
+ `register` varchar(255) NOT NULL DEFAULT '',
+ `expiredDate` datetime DEFAULT NULL,
+ `renew` varchar(255) NOT NULL DEFAULT '',
+ `account` 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`),
+ KEY `domain` (`domain`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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,
+ `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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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 '',
+ `provider` varchar(255) 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,
+ `sshPort` mediumint(9) 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,
+ `serverModel` varchar(256) NOT NULL DEFAULT '',
+ `hardwareType` varchar(64) NOT NULL DEFAULT '',
+ `cpuBrand` varchar(128) NOT NULL DEFAULT '',
+ `cpuModel` varchar(128) NOT NULL DEFAULT '',
+ `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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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(255) 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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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` enum('text','builder') 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` mediumtext DEFAULT NULL,
+ `fields` mediumtext DEFAULT NULL,
+ `langs` mediumtext DEFAULT NULL,
+ `vars` mediumtext DEFAULT NULL,
+ `objects` mediumtext DEFAULT NULL,
+ `settings` mediumtext DEFAULT NULL,
+ `filters` mediumtext 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',
+ `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;
+CREATE TABLE `zt_pivotdrill` (
+ `pivot` mediumint(9) NOT NULL,
+ `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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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',
+ `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;
+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;
+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;
+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 '',
+ PRIMARY KEY (`project`,`product`,`branch`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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 '',
+ `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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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,
+ `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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+CREATE TABLE `zt_searchdict` (
+ `key` smallint(6) unsigned NOT NULL DEFAULT 0,
+ `value` char(3) NOT NULL DEFAULT '',
+ PRIMARY KEY (`key`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+CREATE TABLE `zt_service` (
+ `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(255) NOT NULL DEFAULT '',
+ `external` enum('0','1') NOT NULL DEFAULT '0',
+ `port` smallint(5) unsigned NOT NULL DEFAULT 0,
+ `entry` varchar(255) NOT NULL DEFAULT '',
+ `deploy` varchar(255) NOT NULL DEFAULT '',
+ `version` varchar(64) NOT NULL DEFAULT '',
+ `color` char(7) NOT NULL DEFAULT '',
+ `desc` mediumtext DEFAULT NULL,
+ `dept` varchar(128) NOT NULL DEFAULT '',
+ `devel` varchar(30) NOT NULL DEFAULT '',
+ `qa` varchar(30) NOT NULL DEFAULT '',
+ `ops` varchar(30) NOT NULL DEFAULT '',
+ `hosts` text DEFAULT NULL,
+ `softName` varchar(128) NOT NULL DEFAULT '',
+ `softVersion` varchar(128) NOT NULL DEFAULT '',
+ `type` varchar(20) NOT NULL DEFAULT '',
+ `createdBy` char(30) NOT NULL DEFAULT '',
+ `createdDate` datetime DEFAULT NULL,
+ `editedBy` char(30) NOT NULL DEFAULT '',
+ `editedDate` datetime DEFAULT NULL,
+ `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,
+ `deleted` enum('0','1') NOT NULL DEFAULT '0',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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,
+ `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;
+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;
+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;
+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',
+ `order` int(8) NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ KEY `task` (`task`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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 '',
+ PRIMARY KEY (`user`,`objectId`,`objectType`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+CREATE TABLE `zt_userview` (
+ `account` char(30) NOT NULL DEFAULT '',
+ `programs` mediumtext DEFAULT NULL,
+ `products` mediumtext DEFAULT NULL,
+ `projects` mediumtext DEFAULT NULL,
+ `sprints` mediumtext DEFAULT NULL,
+ UNIQUE KEY `account` (`account`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+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;
+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;
+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;
+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;
+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;
+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;
+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(100) 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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
+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;
diff --git a/db/update21.0.sql b/db/update21.0.sql
index fb8c127455..e49bf87888 100644
--- a/db/update21.0.sql
+++ b/db/update21.0.sql
@@ -4,8 +4,6 @@ ALTER TABLE `zt_host` DROP COLUMN `hardwareType`;
ALTER TABLE `zt_host` DROP COLUMN `cpuBrand`;
ALTER TABLE `zt_host` DROP COLUMN `cpuModel`;
ALTER TABLE `zt_host` DROP COLUMN `provider`;
-ALTER TABLE `zt_host` ADD `CD` varchar(32) NOT NULL DEFAULT 'manual' AFTER `name`;
-ALTER TABLE `zt_host` ADD `sshPort` mediumint NOT NULL DEFAULT 0 AFTER `ssh`;
ALTER TABLE `zt_deploystep` DROP COLUMN `begin`;
ALTER TABLE `zt_deploystep` DROP COLUMN `end`;
@@ -40,3 +38,8 @@ REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`, `
('zh-tw', 'custom', 'relationList', '2', '{\"relation\":\"\\u4f9d\\u8cf4\",\"relativeRelation\":\"\\u88ab\\u4f9d\\u8cf4\"}', '0', 'all'),
('zh-tw', 'custom', 'relationList', '3', '{\"relation\":\"\\u91cd\\u8907\",\"relativeRelation\":\"\\u91cd\\u8907\"}', '0', 'all'),
('zh-tw', 'custom', 'relationList', '4', '{\"relation\":\"\\u5f15\\u7528\",\"relativeRelation\":\"\\u88ab\\u5f15\\u7528\"}', '0', 'all');
+
+UPDATE `zt_action` SET `action` = 'canceled' WHERE `objectType` = 'deploy' AND `action` = 'activated';
+
+DROP TABLE IF EXISTS `zt_account`;
+DELETE FROM `zt_lang` WHERE `module` = 'host' AND `section` = 'cpuBrandList';
\ No newline at end of file
diff --git a/db/zentao.sql b/db/zentao.sql
index 5512a65189..1c2049c65a 100755
--- a/db/zentao.sql
+++ b/db/zentao.sql
@@ -2656,30 +2656,6 @@ CREATE TABLE IF NOT EXISTS `zt_serverroom` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--- DROP TABLE IF EXISTS `zt_account`;
-CREATE TABLE IF NOT EXISTS `zt_account` (
- `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
- `name` varchar(255) NOT NULL DEFAULT '',
- `type` varchar(255) NOT NULL DEFAULT '',
- `provider` varchar(255) NOT NULL DEFAULT '',
- `adminURI` varchar(255) NOT NULL DEFAULT '',
- `account` varchar(255) NOT NULL DEFAULT '',
- `password` varchar(255) NOT NULL DEFAULT '',
- `email` varchar(255) NOT NULL DEFAULT '',
- `mobile` varchar(255) NOT NULL DEFAULT '',
- `extra` text NULL,
- `createdBy` varchar(30) NOT NULL DEFAULT '',
- `createdDate` datetime NULL,
- `editedBy` varchar(30) NOT NULL DEFAULT '',
- `editedDate` datetime NULL,
- `status` varchar(30) NOT NULL DEFAULT '',
- `deleted` enum('0','1') NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-CREATE INDEX `name` ON `zt_account` (`name`);
-CREATE INDEX `provider` ON `zt_account` (`provider`);
-CREATE INDEX `status` ON `zt_account` (`status`);
-
-- DROP TABLE IF EXISTS `zt_host`;
CREATE TABLE `zt_host` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
@@ -2698,20 +2674,14 @@ CREATE TABLE `zt_host` (
`vsoft` varchar(30) NOT NULL DEFAULT '',
`heartbeat` datetime NULL,
`zap` varchar(10) NOT NULL DEFAULT '',
- `provider` varchar(255) 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',
- `sshPort` mediumint 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',
- `serverModel` varchar(256) NOT NULL DEFAULT '',
- `hardwareType` varchar(64) NOT NULL DEFAULT '',
- `cpuBrand` varchar(128) NOT NULL DEFAULT '',
- `cpuModel` varchar(128) NOT NULL DEFAULT '',
`cpuNumber` varchar(16) NOT NULL DEFAULT '',
`cpuCores` varchar(30) NOT NULL DEFAULT '',
`intranet` varchar(128) NOT NULL DEFAULT '',
diff --git a/doc/CHANGELOG b/doc/CHANGELOG
index c05679164e..4d5a5b29cc 100644
--- a/doc/CHANGELOG
+++ b/doc/CHANGELOG
@@ -1,3 +1,7 @@
+2024-11-15 21.1
+完成的需求
+修复的Bug
+
2024-11-01 21.0
完成的需求
开源版:
diff --git a/framework/api/entry.class.php b/framework/api/entry.class.php
index e31f5f07d2..11d18c6448 100644
--- a/framework/api/entry.class.php
+++ b/framework/api/entry.class.php
@@ -344,7 +344,7 @@ class baseEntry
{
$this->app->loadModuleConfig($moduleName, $appName);
$this->app->loadLang($moduleName, $appName);
- $this->dao = new dao($this->dao);
+ $this->dao = new dao($this->app);
return false;
}
diff --git a/framework/base/helper.class.php b/framework/base/helper.class.php
index 0c93c75a4a..1ba6537af3 100644
--- a/framework/base/helper.class.php
+++ b/framework/base/helper.class.php
@@ -1093,6 +1093,21 @@ class baseHelper
{
throw EndResponseException::create($content);
}
+
+ /**
+ * 将科学计数法转化为两位小数。
+ * Convert scientific notation to two decimal places.
+ *
+ * @param int|float|string $hours
+ * @param string $characters
+ * @static
+ * @access public
+ * @return float
+ */
+ public static function formatHours($hours, $characters = '.0'): float
+ {
+ return (float)rtrim(number_format((float)$hours, 2, '.', ''), $characters);
+ }
}
//------------------------------- 常用函数。Some tool functions.-------------------------------//
diff --git a/framework/helper.class.php b/framework/helper.class.php
index 06cb6c422b..47fff7cde1 100644
--- a/framework/helper.class.php
+++ b/framework/helper.class.php
@@ -433,21 +433,6 @@ class helper extends baseHelper
$checkFunc = 'check' . $operator;
return validater::$checkFunc($value1, $value2);
}
-
- /**
- * 将科学计数法转化为两位小数。
- * Convert scientific notation to two decimal places.
- *
- * @param int|float|string $hours
- * @param string $characters
- * @static
- * @access public
- * @return float
- */
- public static function formatHours($hours, $characters = '.0'): float
- {
- return (float)rtrim(number_format((float)$hours, 2, '.', ''), $characters);
- }
}
/**
diff --git a/lib/trace/trace.class.php b/lib/trace/trace.class.php
index c351d3895b..e5c209c661 100644
--- a/lib/trace/trace.class.php
+++ b/lib/trace/trace.class.php
@@ -87,7 +87,7 @@ class trace
$profiling = $this->dao->dbh->query('SHOW PROFILES')->fetchAll(PDO::FETCH_ASSOC);
- foreach($profiling as $key => $profile) $profiling[$key]['Duration'] = number_format($profile['Duration'], 4);
+ foreach($profiling as $key => $profile) $profiling[$key]['Duration'] = round($profile['Duration'], 4);
$this->trace['profiles'] = $profiling;
}
diff --git a/lib/zin/wg/backbtn/v1.php b/lib/zin/wg/backbtn/v1.php
index 9d6055ec00..b15d0281dd 100644
--- a/lib/zin/wg/backbtn/v1.php
+++ b/lib/zin/wg/backbtn/v1.php
@@ -93,7 +93,8 @@ class backBtn extends btn
'charter' => 'charter-browse',
'roadmap' => 'charter-view',
'approvalflow' => 'approvalflow-browse',
- 'host' => 'host-browse,my-index'
+ 'host' => 'host-browse,my-index',
+ 'deploy' => 'deploy-browse',
);
$props = parent::getProps();
diff --git a/lib/zin/wg/docapp/css/v1.css b/lib/zin/wg/docapp/css/v1.css
new file mode 100644
index 0000000000..1cde5981e6
--- /dev/null
+++ b/lib/zin/wg/docapp/css/v1.css
@@ -0,0 +1,29 @@
+.doc-app-header > .nav {--nav-active-bg: var(--color-primary-100); --nav-active-color: var(--color-fore); --nav-item-height: 24px; --nav-divider-margin: 8px;}
+
+.icon-api {text-align: center; --api-color-rgb: var(--color-success-500-rgb); color: rgba(var(--api-color-rgb), 1); margin: 0 3px;}
+.icon-api::before {content: ' '; display: inline-block; width: 8px; height: 8px; border-radius: 2px; background-color: currentColor; min-width: 0;}
+
+.api-list-item.is-GET, .icon-api.is-GET {--api-color-rgb: var(--color-success-500-rgb)}
+.api-list-item.is-POST, .icon-api.is-POST {--api-color-rgb: var(--color-important-500-rgb)}
+.api-list-item.is-DELETE, .icon-api.is-DELETE {--api-color-rgb: var(--color-danger-500-rgb)}
+.api-list-item.is-PUT, .icon-api.is-PUT {--api-color-rgb: var(--color-important-500-rgb)}
+.api-list-item.is-PATCH, .icon-api.is-PATCH {--api-color-rgb: var(--color-special-500-rgb)}
+.api-list-item.is-OPTIONS, .icon-api.is-OPTIONS {--api-color-rgb: var(--color-special-500-rgb)}
+.api-list-item.is-HEAD, .icon-api.is-HEAD {--api-color-rgb: var(--color-gray-500-rgb)}
+
+.api-list-item {background-color: rgba(var(--api-color-rgb), .1);}
+.api-list-item .api-method {background-color: rgba(var(--api-color-rgb), 1); color: var(--color-canvas)}
+.api-list-item .api-title {color: rgba(var(--api-color-rgb), 1)}
+
+.doc-app-mode-edit[data-lib-type="api"], .doc-app-mode-create {--doc-view-max-width: 1100px}
+.doc-app-mode-edit[data-lib-type="api"] .doc-view-content,
+.doc-app-mode-create[data-lib-type="api"] .doc-view-content {padding: 0 24px;}
+.doc-app-mode-edit[data-lib-type="api"] form .form-actions,
+.doc-app-mode-create[data-lib-type="api"] form .form-actions {display: none;}
+
+.doc-tree .item-inner>.item-icon {margin-right: -4px;}
+.doc-list > .dtable {--dtable-border-color: transparent}
+.api-lib-menu + .doc-tree > .tree {padding-top: 0;}
+
+.dropdown-menu .divider + .divider {display: none;}
+.dropmenu-item .tree-item-inner[data-type="lib"] {padding-left: 8px;}
diff --git a/lib/zin/wg/docapp/js/v1.js b/lib/zin/wg/docapp/js/v1.js
index 2a84b34a6c..fecec316c6 100644
--- a/lib/zin/wg/docapp/js/v1.js
+++ b/lib/zin/wg/docapp/js/v1.js
@@ -61,6 +61,19 @@ function hasPriv(priv, value)
return value !== undefined ? setting === value : !!setting;
}
+function isApiLib(lib)
+{
+ if(typeof lib === 'number') lib = getDocApp().getLib(lib);
+ lib = lib || getDocApp().lib;
+ return lib && lib.data.type === 'api';
+}
+
+function isApiDoc(doc)
+{
+ const id = typeof doc === 'object' ? doc.id : doc;
+ return String(id).startsWith('api.');
+}
+
/**
* 处理对话框的操作,执行文档应用实例上的方法。
* Process dialog actions, execute methods on the doc app instance.
@@ -346,7 +359,7 @@ function handleSaveDoc(doc)
*/
function canMoveDoc(doc)
{
- return getDocApp().props.privs.moveDoc;
+ return !String(doc.id).startsWith('api.') && getDocApp().props.privs.moveDoc;
}
/**
@@ -471,7 +484,8 @@ const actionsMap =
const lang = getLang();
const doc = info.data;
const canModify = canModifySpace();
- const canEditDoc = canModify && hasPriv('edit');
+ const isApi = isApiDoc(doc);
+ const canEditDoc = canModify && hasPriv(isApi ? 'editApi' : 'edit');
/* 侧边栏上的文档操作按钮。Doc actions in sidebar. */
if(info.ui === 'sidebar')
@@ -491,14 +505,16 @@ const actionsMap =
const moreItems = [];
if(canModify && canMoveDoc(doc)) moreItems.push({icon: 'folder-move', text: lang.moveDoc, command: `moveDoc/${doc.id}`});
if(canModify && hasPriv('delete')) moreItems.push({icon: 'trash', text: lang.delete, command: `deleteDoc/${doc.id}`});
- if(canModify && hasPriv('effort')) moreItems.push({icon: 'time', text: lang.effort, command: `effortDoc/${doc.id}`});
- if(hasPriv('exportDoc')) moreItems.push({icon: 'export', text: lang.export, command: 'exportDoc'});
+ if(!isApi && canModify && hasPriv('effort')) moreItems.push({icon: 'time', text: lang.effort, command: `effortDoc/${doc.id}`});
+ if(!isApi && hasPriv('exportDoc')) moreItems.push({icon: 'export', text: lang.export, command: 'exportDoc'});
- return [
- hasPriv('collect', 'no') ? null : {icon: doc.isCollector ? 'star text-warning' : 'star-empty', text: doc.collects || null, hint: doc.isCollector ? lang.cancelCollection : lang.collect, rounded: 'lg', textClass: 'text-gray', type: 'ghost', command: hasPriv('collect') ? `collectDoc/${doc.id}` : null},
+ const actions = [
+ isApi ? null : (hasPriv('collect', 'no') ? null : {icon: doc.isCollector ? 'star text-warning' : 'star-empty', text: doc.collects || null, hint: doc.isCollector ? lang.cancelCollection : lang.collect, rounded: 'lg', textClass: 'text-gray', type: 'ghost', command: hasPriv('collect') ? `collectDoc/${doc.id}` : null}),
canEditDoc ? {icon: 'edit', type: 'ghost text-primary', hint: lang.edit, rounded: 'lg', command: 'startEditDoc'} : null,
moreItems.length ? {icon: 'icon-ellipsis-v', type: 'dropdown', rounded: 'lg', placement: 'bottom-end', caret: false, items: moreItems} : null,
];
+
+ return actions;
},
/**
@@ -596,9 +612,29 @@ const actionsMap =
*/
'doc-list': function(info)
{
- const lang = getLang();
- const docApp = getDocApp();
- const canModify = canModifySpace();
+ const docApp = getDocApp();
+ const lib = docApp.lib;
+ const lang = getLang();
+ const canModify = canModifySpace();
+
+ if(isApiLib(docApp.lib))
+ {
+ if(!canModify) return;
+
+ const canCreateApi = hasPriv('createApi');
+ const canCreateLib = hasPriv('createLib');
+ const items =
+ [
+ canCreateApi ? {icon: 'plus', text: lang.createApi, command: 'startCreateDoc'} : null,
+ (canCreateApi && canCreateLib) ? {type: 'divider'} : null,
+ canCreateLib ? {icon: 'wiki-lib', text: lang.createLib, command: 'createLib'} : null,
+ ].filter(Boolean);
+ if(!items.length) return;
+ return [
+ {icon: 'plus', type: 'dropdown', btnType: 'primary', size: 'md', text: lang.create, items: items},
+ ];
+ }
+
const canCreateDoc = canModify && hasPriv('create');
const canCreateLib = canModify && hasPriv('createLib');
const canCreateSpace = canModify && hasPriv('createSpace');
@@ -641,6 +677,15 @@ const actionsMap =
if(!doc) return;
const lang = getLang();
+
+ if(isApiLib())
+ {
+ return [
+ {text: lang.save, size: 'md', className: 'btn-wide', type: 'primary', command: 'saveApiDoc'},
+ {text: lang.cancel, size: 'md', className: 'btn-wide', type: 'primary-outline', command: 'cancelEditDoc'},
+ ];
+ }
+
return [
doc.status === 'draft' ? {text: lang.saveDraft, size: 'md', className: 'btn-wide', type: 'secondary', command: 'saveDoc/draft'} : null,
{text: lang.release, size: 'md', className: 'btn-wide', type: 'primary', command: 'saveDoc'},
@@ -656,6 +701,13 @@ const actionsMap =
'doc-create': function()
{
const lang = getLang();
+ if(isApiLib())
+ {
+ return [
+ {text: lang.save, size: 'md', className: 'btn-wide', type: 'primary', command: 'saveApiDoc'},
+ {text: lang.cancel, size: 'md', className: 'btn-wide', type: 'primary-outline', command: 'cancelCreateDoc'},
+ ];
+ }
return [
{text: lang.saveDraft, size: 'md', className: 'btn-wide', type: 'secondary', command: 'saveNewDoc/draft'},
{text: lang.release, size: 'md', className: 'btn-wide', type: 'primary', command: 'saveNewDoc'},
@@ -991,6 +1043,290 @@ const commands =
$.post($.createLink('doc', 'edit', `docID=${docID}`), docData);
}
});
+ },
+
+ /**
+ * 保存 API 文档数据。
+ * Save the API doc data.
+ */
+ saveApiDoc: function()
+ {
+ /* 触发 API 表单的提交事件。 */
+ $('#docApp .doc-view form').trigger('submit');
+ },
+
+ /**
+ * 加载指定的 API 文档。
+ * Load the specified API doc.
+ */
+ loadApi: function(_, args)
+ {
+ const apiID = getApiID(args[0] || this.docID);
+ const version = args[1] || 0;
+ const release = args[2] || 0;
+ const select = !!args[3];
+ $.getJSON($.createLink('api', 'ajaxGetApi', `apiID=${apiID}&version=${version}&release=${release}`), function(result)
+ {
+ if(!result || typeof result !== 'object') return;
+ result.id = `api.${apiID}`;
+ const docApp = getDocApp();
+ docApp.update('doc', result);
+ if(select) docApp.selectDoc(result.id);
+ });
+ },
+
+ /**
+ * 选择 API 文档。
+ * Select the specified API doc.
+ */
+ selectApi: function(_, args)
+ {
+ const apiID = args[0];
+ console.log('> selectApi', apiID, `api.${getApiID(apiID)}`);
+ getDocApp().selectDoc(`api.${getApiID(apiID)}`);
+ },
+
+ /**
+ * 显示结构列表。
+ * Show the struct list.
+ */
+ showStructs: function()
+ {
+ getDocApp().changeState(
+ {
+ mode: 'list',
+ moduleID: 0,
+ docID: 0,
+ listType: 'structs',
+ });
+ },
+
+ /**
+ * 显示版本列表。
+ * Show the release list.
+ */
+ showReleases: function()
+ {
+ getDocApp().changeState(
+ {
+ mode: 'list',
+ moduleID: 0,
+ docID: 0,
+ listType: 'releases',
+ });
+ },
+
+ /**
+ * 显示API 目录。
+ * Show the api catalog.
+ */
+ showModules: function()
+ {
+ getDocApp().changeState(
+ {
+ mode: 'list',
+ moduleID: 0,
+ docID: 0,
+ listType: '',
+ });
+ },
+
+ /**
+ * 更改当前库的发布版本。
+ * Change the release of the current library.
+ */
+ changeLibRelease: function(_, args)
+ {
+ const docApp = getDocApp();
+ const libID = args[0];
+ const release = args[1];
+ const libReleaseMap = docApp.signals.libReleaseMap.value;
+ libReleaseMap[libID] = release;
+ docApp.signals.libReleaseMap.value = $.extend({}, libReleaseMap);
+ const doc = docApp.doc;
+ if(doc && doc.data.lib === libID) docApp.executeCommand('loadApi', [doc.data.id, 0, release]);
+ },
+
+ /**
+ * 加载懒加载内容。
+ * Load the lazy content.
+ */
+ loadLazyContent: function(_, args)
+ {
+ const selector = args[0];
+ if(!selector) return;
+ $(selector).closest('.lazy-content').trigger('loadContent');
+ },
+
+ /**
+ * 更新懒加载内容。
+ * Update the lazy content.
+ */
+ updateLazyContent: function(context, args)
+ {
+ const event = context.event;
+ const $element = $(event.currentTarget);
+ const selector = args[0] || $element.data('lazyTarget');
+ const $lazy = (selector ? $(selector) : $element).closest('.lazy-content');
+ const url = $element.data('url') || $element.attr('href');
+ if(url) $lazy.trigger('loadContent', url);
+ event.preventDefault();
+ event.stopPropagation();
+ },
+};
+
+function getApiID(id)
+{
+ if(typeof id === 'number') return id;
+ if(String(+id) === id) return +id;
+ return +id.replace('api.', '');
+}
+
+/**
+ * 定义页面上的自定义渲染器。
+ * Define the custom renderers on the page.
+ */
+const customRenders =
+{
+ /**
+ * 定义 API 文档编辑器渲染,包括查看、编辑和创建。
+ * Define the API doc editor render, including view, edit and create.
+ */
+ editor: function()
+ {
+ if(!isApiLib()) return;
+
+ const mode = this.mode;
+ if(mode === 'create')
+ {
+ const libID = this.libID;
+ const moduleID = this.moduleID;
+ return {fetcher: $.createLink('api', 'create', `libID=${libID}&moduleID=${moduleID}&space=api`), loadingText: getDocAppLang('loading')};
+ }
+ if(mode === 'edit')
+ {
+ const doc = this.doc.data;
+ return {fetcher: $.createLink('api', 'edit', `apiID=${getApiID(doc.id)}`), loadingText: getDocAppLang('loading')};
+ }
+ const doc = this.doc.data;
+ const release = this.signals.libReleaseMap.value[doc.lib] || 0;
+ const version = this.signals.docVersion.value || 0;
+ return {fetcher: $.createLink('api', 'view', `libID=${doc.lib}&apiID=${getApiID(doc.id)}&moduleID=${doc.module}&version=${version}&release=${release}`), loadingText: getDocAppLang('loadingDocsData'), className: 'doc-editor-content'};
+ },
+
+ /**
+ * 定义 API 文档列表渲染,包括结构和版本。
+ * Define the API doc list render, including structs and releases.
+ */
+ list: function()
+ {
+ if(!isApiLib()) return;
+ const listType = this.signals.listType.value;
+ const libID = getApiID(this.libID);
+ const releaseID = this.signals.libReleaseMap.value[libID] || 0;
+ if(listType === 'structs') return {fetcher: $.createLink('api', 'struct', `libID=${this.libID}&releaseID=${releaseID}`), loadingText: getDocAppLang('loading'), className: 'api-struct-list'};
+ if(listType === 'releases') return {fetcher: $.createLink('api', 'releases', `libID=${this.libID}`), loadingText: getDocAppLang('loading'), className: 'api-release-list'};
+ },
+
+ /**
+ * 定义 API 文档列表筛选菜单渲染,当展示结构和版本时不显示筛选菜单。
+ * Define the API doc list filter menu render, not show the filter menu when showing structs and releases.
+ */
+ filters: function()
+ {
+ if(!isApiLib()) return;
+ const listType = this.signals.listType.value;
+ if(this.mode !== 'list' || !listType) return;
+ return null;
+ },
+
+ /**
+ * 定义 API 文档列表工具栏渲染。
+ * Define the API doc list toolbar render.
+ */
+ toolbar: function()
+ {
+ if(!isApiLib()) return;
+ const listType = this.signals.listType.value;
+ if(this.mode === 'list' && listType)
+ {
+ const libID = getApiID(this.libID);
+ const items = [];
+ if(hasPriv('createStruct') && listType === 'structs') items.push({text: getDocAppLang('createStruct'), icon: 'plus', btnType: 'primary', 'data-toggle': 'modal', 'data-size': 'lg', url: $.createLink('api', 'createStruct', `libID=${libID}`)});
+ if(hasPriv('createRelease') && listType === 'releases') items.push({text: getDocAppLang('createRelease'), icon: 'plus', btnType: 'primary', 'data-toggle': 'modal', url: $.createLink('api', 'createRelease', `libID=${libID}`)});
+ if(!items.length) return null;
+ return {component: 'toolbar', props: {items: items}};
+ }
+ },
+
+ /**
+ * 定义顶部面包屑导航渲染。
+ * Define the top breadcrumb render.
+ */
+ 'app-nav': function(items)
+ {
+ const lib = this.lib;
+ if(!lib || !isApiLib(lib)) return items;
+ const versions = lib.data.versions;
+ if(versions && versions.length)
+ {
+ const viewIndex = items.findIndex(item => item[0] === 'lib');
+ if(viewIndex >= 0)
+ {
+ const libView = items[viewIndex][1];
+ const libID = getApiID(lib.data.id);
+ const release = this.signals.libReleaseMap.value[libID] || 0;
+ const options = [{text: getDocAppLang('defaultVersion'), value: 0, selected: !release, command: `changeLibRelease/${libID}/0`}];
+ versions.forEach(version => options.push({selected: release === version.id, text: `v${version.version}`, value: version.id, command: `changeLibRelease/${libID}/${version.version}`}));
+ const currentVersion = versions.find(x => x.id === release);
+ const versionPicker = zui.renderCustomContent(
+ {
+ content:
+ {
+ component: 'DropdownButton',
+ props:
+ {
+ text : currentVersion ? currentVersion.version : getDocAppLang('version'),
+ size : 'xs',
+ type : 'gray-pale',
+ rounded : 'full',
+ className: 'h-4 gap-1 mr-2',
+ items : options,
+ }
+ }
+ });
+ items[viewIndex] = ['lib', [libView, versionPicker]];
+ }
+ }
+ const listType = this.signals.listType.value;
+ if(this.mode !== 'list' || !listType) return items;
+ if(listType === 'structs') items.push([listType, zui.renderCustomContent({className: 'mx-2', content: getDocAppLang('struct')})]);
+ if(listType === 'releases') items.push([listType, zui.renderCustomContent({className: 'mx-2', content: getDocAppLang('releases')})]);
+ return items;
+ },
+
+ /**
+ * 定义侧边栏渲染,显示结构、版本和模块。
+ * Define the sidebar render, show structs, releases and modules.
+ */
+ 'sidebar-before': function()
+ {
+ if(!isApiLib()) return;
+ const isListMode = this.mode === 'list';
+ const lang = getDocAppLang();
+ const listType = this.signals.listType.value;
+ const items = [
+ {text: lang.struct, selected: listType === 'structs' && isListMode, icon: 'treemap muted', command: 'showStructs'},
+ {type: 'divider', className: 'my-1'},
+ {text: lang.releases, selected: listType === 'releases' && isListMode, icon: 'version muted', command: 'showReleases'},
+ {type: 'divider', className: 'my-1'},
+ {text: lang.module, icon: 'list muted', command: 'showModules'}
+ ];
+ return {
+ component: 'tree',
+ className: 'p-2 pb-0 api-lib-menu',
+ props: {items: items, itemProps: {className: 'state'}}
+ };
}
};
@@ -1007,6 +1343,24 @@ function getTableOptions(options, info)
const lang = getLang();
if(info.type === 'doc-list')
{
+ if(isApiLib())
+ {
+ return $.extend(options, {
+ cols: [{name: 'title', onRenderCell: function(result, info)
+ {
+ const doc = info.row.data;
+ return [{className: `api-list-item row items-center my-0.5 mx-1 gap-2 flex-auto is-${doc.method} cursor-pointer rounded`, html: [
+ `
${doc.method}
`,
+ `${doc.path}
`,
+ `${doc.originTitle}
`,
+ ].join('')}]
+ }}],
+ header: false,
+ checkable: false,
+ footer: ['flex', 'pager'],
+ });
+ }
+
const tableCols = lang.tableCols;
const canModify = canModifySpace(this.space);
options.cols.forEach(col =>
@@ -1054,7 +1408,12 @@ function getFilterTypes(mode)
if(currentSpaceType === 'product') return getLang('productFilterTypes');
return getLang('spaceFilterTypes');
}
- if(mode === 'list') return getLang('filterTypes');
+ if(mode === 'list')
+ {
+ const lib = getDocApp().lib;
+ if(lib && lib.data.type === 'api') return getLang('apifilterTypes');
+ return getLang('filterTypes');
+ }
if(mode === 'files') return getLang('fileFilterTypes');
}
@@ -1175,6 +1534,17 @@ function getSortableOptions(type)
*/
window.getDocViewSidebarTabs = function(doc, info)
{
+ if(isApiLib())
+ {
+ const lang = getDocAppLang();
+ if(info.isNewDoc || info.mode === 'create') return [];
+ return [
+ {key: 'info', icon: 'info', title: lang.docInfo},
+ info.mode === 'edit' ? null : {key: 'outline', icon: 'list-box', title: lang.docOutline},
+ {key: 'history', icon: 'history', title: lang.history},
+ ].filter(Boolean);
+ }
+
if(info.isNewDoc) return [{key: 'outline', icon: 'list-box', title: getLang('docOutline')}];
return [
{key: 'info', icon: 'info', title: getLang('docInfo')},
@@ -1235,9 +1605,11 @@ window.setDocAppOptions = function(_, options)
return $.extend(
{
+ defaultState : {listType: '', libReleaseMap: {}},
commands : commands,
- onCreateDoc : userPrivs.create ? handleCreateDoc: null,
- onSaveDoc : userPrivs.edit ? handleSaveDoc : null,
+ customRenders : customRenders,
+ onCreateDoc : userPrivs.create ? handleCreateDoc : null,
+ onSaveDoc : userPrivs.edit ? handleSaveDoc : null,
canMoveDoc : canMoveDoc,
onSwitchView : handleSwitchView,
getActions : getActions,
@@ -1250,8 +1622,9 @@ window.setDocAppOptions = function(_, options)
}, window.docAppOptions, options);
};
-window.docAppActions = actionsMap;
-window.docAppCommands = commands;
-window.getDocApp = getDocApp;
-window.getDocAppLang = getLang;
-window.docAppHasPriv = hasPriv;
+window.docAppActions = actionsMap;
+window.docAppCommands = commands;
+window.docAppCustomRenders = customRenders;
+window.getDocApp = getDocApp;
+window.getDocAppLang = getLang;
+window.docAppHasPriv = hasPriv;
diff --git a/lib/zin/wg/docapp/v1.php b/lib/zin/wg/docapp/v1.php
index 01d805b460..cb0a1a5de4 100644
--- a/lib/zin/wg/docapp/v1.php
+++ b/lib/zin/wg/docapp/v1.php
@@ -52,6 +52,7 @@ class docApp extends wg
'search' => '?string', // 搜索关键字。
'filterType' => '?string', // 过滤类型。
'pager' => '?PagerInfo', // 分页信息。
+ 'params' => '?string', // 额外参数信息。
'orderBy' => '?string', // 排序字段。
'langData' => '?array', // 语言数据。
'showLibFiles' => '?boolean|array|string',// 是否显示库文件。
@@ -78,6 +79,11 @@ class docApp extends wg
return file_get_contents(__DIR__ . DS . 'js' . DS . 'v1.js');
}
+ public static function getPageCSS(): ?string
+ {
+ return file_get_contents(__DIR__ . DS . 'css' . DS . 'v1.css');
+ }
+
protected function build()
{
global $app, $lang;
@@ -111,13 +117,24 @@ class docApp extends wg
* 设置前端语言数据。 在 js/app.ui.js 中使用 getLang('xxx') 来访问语言数据。
*/
$app->loadLang('file');
+ $app->loadLang('api');
$langData = $lang->doc->docLang;
- $langData->filePreview = $lang->file->preview;
- $langData->fileDownload = $lang->file->download;
- $langData->fileDelete = $lang->file->delete;
- $langData->fileRename = $lang->file->edit;
- $langData->fileConfirmDelete = $lang->file->confirmDelete;
- $langData->deleted = $lang->file->deleted;
+ $langData->filePreview = $lang->file->preview;
+ $langData->fileDownload = $lang->file->download;
+ $langData->fileDelete = $lang->file->delete;
+ $langData->fileRename = $lang->file->edit;
+ $langData->fileConfirmDelete = $lang->file->confirmDelete;
+ $langData->deleted = $lang->file->deleted;
+ $langData->createApi = $lang->api->createApi;
+ $langData->apifilterTypes = $lang->api->filterTypes;
+ $langData->module = $lang->api->module;
+ $langData->struct = $lang->api->struct;
+ $langData->releases = $lang->api->releases;
+ $langData->noApi = $lang->api->noApi;
+ $langData->version = $lang->api->version;
+ $langData->defaultVersion = $lang->api->defaultVersion;
+ $langData->createStruct = $lang->api->createStruct;
+ $langData->createRelease = $lang->api->createRelease;
/**
* 通过语言项定义文档表格列显示名称。
diff --git a/lib/zin/wg/filter/v1.php b/lib/zin/wg/filter/v1.php
index 9c35ddb10e..a463de43b0 100644
--- a/lib/zin/wg/filter/v1.php
+++ b/lib/zin/wg/filter/v1.php
@@ -38,7 +38,11 @@ class filter extends wg
set::items($items),
set::menu($menu),
set::multiple($multiple),
- on::change("$onChange(e, '$name')"),
+ on::change()->do(<< \$this.zui().\$.props.items.hasOwnProperty('url');
+ if(hasUrl()) \$this.zui().\$.props.items.data.values = \$this.zui().\$.value;
+ $onChange(event, '$name');
+ JS),
on::inited()->do(<< \$this.zui().\$.state.items;
const hasUrl = () => \$this.zui().\$.state.items.hasOwnProperty('url');
diff --git a/lib/zin/wg/productsbox/js/v1.js b/lib/zin/wg/productsbox/js/v1.js
index eaf4aee9fb..a88661672b 100644
--- a/lib/zin/wg/productsbox/js/v1.js
+++ b/lib/zin/wg/productsbox/js/v1.js
@@ -7,7 +7,7 @@ window.branchChange = function(e)
{
let $product = $(e.target).closest('.productBox').find("[name^='products']");
- if($('[name="charter"]').length && $('[name="charter"]').val())
+ if($('[name="charter"]').length && $('[name="charter"]').val() > 0)
{
loadRoadmaps($product, $(e.target));
}
@@ -79,7 +79,7 @@ window.addNewLine = function(e)
{
const obj = e.target
const newLine = $(obj).closest('.productBox').clone();
- const objectType = $('[name="charter"]').length && $('[name="charter"]').val() ? 'roadmap' : 'plan';
+ const objectType = $('[name="charter"]').length && $('[name="charter"]').val() > 0 ? 'roadmap' : 'plan';
let index = 0;
let chosenProducts = [];
@@ -128,7 +128,7 @@ window.addNewLine = function(e)
new zui.Picker(`#branch${index}`, {name: `branch[${index}]`, multiple: true, items: []});
new zui.Picker(`#${objectType}s${index}`, {items:[], multiple: true, name: `${objectType}s[${index}]`});
- if($('[name="charter"]').length && $('[name="charter"]').val())
+ if($('[name="charter"]').length && $('[name="charter"]').val() > 0)
{
if(options.items.length == $('.productBox').length) $('.addLine').addClass('hidden');
}
@@ -151,7 +151,7 @@ window.removeLine = function(e)
$(obj).closest('.productBox').remove();
if(typeof toggleStageBy == 'function') toggleStageBy();
- if($('[name="charter"]').length && $('[name="charter"]').val())
+ if($('[name="charter"]').length && $('[name="charter"]').val() > 0)
{
$('.addLine').removeClass('hidden');
}
diff --git a/lib/zin/wg/thinkmulticolumn/v1.php b/lib/zin/wg/thinkmulticolumn/v1.php
index 4a4fc98a39..187d0e243a 100644
--- a/lib/zin/wg/thinkmulticolumn/v1.php
+++ b/lib/zin/wg/thinkmulticolumn/v1.php
@@ -99,7 +99,7 @@ class thinkMulticolumn extends thinkQuestion
if(empty($fields)) $fields = array($defalutField, $defalutField, $defalutField, $defalutField);
foreach($fields as $key => $field) $batchItems[] = $this->buildFormBatchItem($field, (int)$key, $isRun, $quotedQuestions, !empty($result));
- if($isResult || $isRun) $result = $this->processResult($result);
+ if($isResult || $isRun || !empty($result)) $result = $this->processResult($result);
$detailWg[] = formBatch
(
setClass('think-form-batch'),
@@ -228,4 +228,4 @@ class thinkMulticolumn extends thinkQuestion
);
return $formItems;
}
-}
\ No newline at end of file
+}
diff --git a/lib/zin/wg/thinkstepbase/v1.php b/lib/zin/wg/thinkstepbase/v1.php
index 3ef9af292f..2e78a6c4dc 100644
--- a/lib/zin/wg/thinkstepbase/v1.php
+++ b/lib/zin/wg/thinkstepbase/v1.php
@@ -44,7 +44,7 @@ class thinkStepBase extends wg
if($mode != 'detail') return array();
$options = $step->options;
- if($options)
+ if($step->type == 'questions')
{
$questionType = $options->questionType;
$tips = $lang->thinkstep->$questionType;
@@ -111,7 +111,7 @@ class thinkStepBase extends wg
if(!empty($step->options->fields)) $step->options->fields = is_string($step->options->fields) ? explode(', ', $step->options->fields) : array_values((array)$step->options->fields);
- $questionType = !empty($step) && !empty($step->options) ? $step->options->questionType : '';
+ $questionType = !empty($step) && $step->type == 'questions' ? $step->options->questionType : '';
$isCheckBox = !empty($step) && $step->type == 'question' && in_array($questionType, $config->thinkstep->quoteQuestionType);
$isQuoteItem = $isCheckBox && !empty($step->options->setOption) && $step->options->setOption == 1;
$detailTip = array();
diff --git a/module/account/config.php b/module/account/config.php
deleted file mode 100644
index 46a33bf32e..0000000000
--- a/module/account/config.php
+++ /dev/null
@@ -1,10 +0,0 @@
-account->create = new stdclass;
-$config->account->create->requiredFields = 'name,account,provider';
-
-$config->account->edit = new stdclass;
-$config->account->edit->requiredFields = 'name,account,provider';
-
-$config->account->actions = new stdclass();
-$config->account->actions->view = array();
-$config->account->actions->view['suffixActions'] = array('edit');
diff --git a/module/account/config/dtable.php b/module/account/config/dtable.php
deleted file mode 100644
index 696c01de3e..0000000000
--- a/module/account/config/dtable.php
+++ /dev/null
@@ -1,69 +0,0 @@
-loadLang('serverroom');
-
-$config->account->dtable = new stdclass();
-
-$config->account->dtable->fieldList['id']['title'] = 'ID';
-$config->account->dtable->fieldList['id']['name'] = 'id';
-$config->account->dtable->fieldList['id']['type'] = 'id';
-
-$config->account->dtable->fieldList['name']['title'] = $lang->account->name;
-$config->account->dtable->fieldList['name']['name'] = 'name';
-$config->account->dtable->fieldList['name']['type'] = 'desc';
-$config->account->dtable->fieldList['name']['sortType'] = true;
-$config->account->dtable->fieldList['name']['flex'] = 4;
-$config->account->dtable->fieldList['name']['hint'] = true;
-$config->account->dtable->fieldList['name']['link'] = array('module' => 'account', 'method' => 'view', 'params' => 'id={id}');
-$config->account->dtable->fieldList['name']['data-toggle'] = 'modal';
-
-$config->account->dtable->fieldList['provider']['title'] = $lang->account->provider;
-$config->account->dtable->fieldList['provider']['name'] = 'provider';
-$config->account->dtable->fieldList['provider']['type'] = 'text';
-$config->account->dtable->fieldList['provider']['sortType'] = true;
-$config->account->dtable->fieldList['provider']['width'] = 80;
-$config->account->dtable->fieldList['provider']['map'] = $lang->serverroom->providerList;
-
-$config->account->dtable->fieldList['account']['title'] = $lang->account->account;
-$config->account->dtable->fieldList['account']['name'] = 'account';
-$config->account->dtable->fieldList['account']['type'] = 'text';
-$config->account->dtable->fieldList['account']['sortType'] = true;
-
-$config->account->dtable->fieldList['email']['title'] = $lang->account->email;
-$config->account->dtable->fieldList['email']['name'] = 'email';
-$config->account->dtable->fieldList['email']['type'] = 'text';
-$config->account->dtable->fieldList['email']['sortType'] = true;
-
-$config->account->dtable->fieldList['mobile']['title'] = $lang->account->mobile;
-$config->account->dtable->fieldList['mobile']['name'] = 'mobile';
-$config->account->dtable->fieldList['mobile']['type'] = 'text';
-$config->account->dtable->fieldList['mobile']['sortType'] = true;
-
-$config->account->dtable->fieldList['createdBy']['title'] = $lang->account->createdBy;
-$config->account->dtable->fieldList['createdBy']['name'] = 'createdBy';
-$config->account->dtable->fieldList['createdBy']['type'] = 'user';
-$config->account->dtable->fieldList['createdBy']['width'] = '100px';
-$config->account->dtable->fieldList['createdBy']['sortType'] = true;
-
-$config->account->actionList = array();
-$config->account->actionList['edit']['icon'] = 'edit';
-$config->account->actionList['edit']['text'] = $lang->edit;
-$config->account->actionList['edit']['hint'] = $lang->edit;
-$config->account->actionList['edit']['data-toggle'] = 'modal';
-$config->account->actionList['edit']['data-size'] = 'sm';
-$config->account->actionList['edit']['showText'] = true;
-$config->account->actionList['edit']['url'] = array('module' => 'account', 'method' => 'edit', 'params' => 'id={id}');
-
-$config->account->actionList['delete']['icon'] = 'trash';
-$config->account->actionList['delete']['text'] = $lang->delete;
-$config->account->actionList['delete']['hint'] = $lang->delete;
-$config->account->actionList['delete']['ajaxSubmit'] = true;
-$config->account->actionList['delete']['url'] = array('module' => 'account', 'method' => 'delete', 'params' => 'id={id}');
-
-$config->account->dtable->fieldList['actions']['name'] = 'actions';
-$config->account->dtable->fieldList['actions']['title'] = $lang->actions;
-$config->account->dtable->fieldList['actions']['type'] = 'actions';
-$config->account->dtable->fieldList['actions']['sortType'] = false;
-$config->account->dtable->fieldList['actions']['fixed'] = 'right';
-$config->account->dtable->fieldList['actions']['menu'] = array('edit', 'delete');
-$config->account->dtable->fieldList['actions']['list'] = $config->account->actionList;
diff --git a/module/account/config/form.php b/module/account/config/form.php
deleted file mode 100644
index fc30a45e93..0000000000
--- a/module/account/config/form.php
+++ /dev/null
@@ -1,27 +0,0 @@
-account->form = new stdclass();
-$config->account->form->create = array();
-$config->account->form->create['name'] = array('type' => 'string', 'required' => true, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['provider'] = array('type' => 'string', 'required' => true, 'default' => '');
-$config->account->form->create['adminURI'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['account'] = array('type' => 'string', 'required' => true, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['password'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['email'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['mobile'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['type'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['status'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['extra'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->create['createdDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now());
-
-$config->account->form->edit = array();
-$config->account->form->edit['name'] = array('type' => 'string', 'required' => true, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['provider'] = array('type' => 'string', 'required' => true, 'default' => '');
-$config->account->form->edit['adminURI'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['account'] = array('type' => 'string', 'required' => true, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['password'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['email'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['mobile'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['type'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['status'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['extra'] = array('type' => 'string', 'required' => false, 'default' => '', 'filter' => 'trim');
-$config->account->form->edit['editedDate'] = array('type' => 'string', 'required' => false, 'default' => helper::now());
diff --git a/module/account/config/search.php b/module/account/config/search.php
deleted file mode 100644
index 2e4df204de..0000000000
--- a/module/account/config/search.php
+++ /dev/null
@@ -1,25 +0,0 @@
-account->search['module'] = 'account';
-$config->account->search['fields']['name'] = $lang->account->name;
-$config->account->search['fields']['id'] = 'ID';
-$config->account->search['fields']['provider'] = $lang->account->provider;
-$config->account->search['fields']['account'] = $lang->account->account;
-$config->account->search['fields']['email'] = $lang->account->email;
-$config->account->search['fields']['mobile'] = $lang->account->mobile;
-$config->account->search['fields']['createdBy'] = $lang->account->createdBy;
-$config->account->search['fields']['createdDate'] = $lang->account->createdDate;
-$config->account->search['fields']['editedBy'] = $lang->account->editedBy;
-$config->account->search['fields']['editedDate'] = $lang->account->editedDate;
-
-$config->account->search['params']['name'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
-$config->account->search['params']['id'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
-$config->account->search['params']['provider'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
-$config->account->search['params']['account'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
-$config->account->search['params']['email'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
-$config->account->search['params']['mobile'] = array('operator' => 'include', 'control' => 'input', 'values' => '');
-$config->account->search['params']['createdBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
-$config->account->search['params']['createdDate'] = array('operator' => '=', 'control' => 'date', 'values' => '');
-$config->account->search['params']['editedBy'] = array('operator' => '=', 'control' => 'select', 'values' => 'users');
-$config->account->search['params']['editedDate'] = array('operator' => '=', 'control' => 'date', 'values' => '');
diff --git a/module/account/control.php b/module/account/control.php
deleted file mode 100644
index 6f26839022..0000000000
--- a/module/account/control.php
+++ /dev/null
@@ -1,157 +0,0 @@
-
- * @package account
- * @link https://www.zentao.net
- */
-class account extends control
-{
- /**
- * 查看账号列表。
- * Browse accouts page.
- *
- * @param string $browseType
- * @param string $param
- * @param string $orderBy
- * @param int $recTotal
- * @param int $recPerPage
- * @param int $pageID
- * @access public
- * @return void
- */
- public function browse(string $browseType = 'all', string $param = '', string $orderBy = 'id_desc', int $recTotal = 0, int $recPerPage = 20, int $pageID = 1)
- {
- $this->app->loadLang('serverroom');
- $browseType = strtolower($browseType);
-
- $this->session->set('accountList', $this->app->getURI(true));
- $this->app->loadClass('pager', true);
- $pager = pager::init($recTotal, $recPerPage, $pageID);
-
- $accountList = $this->account->getList($browseType, $param, $orderBy, $pager);
-
- /* Build the search form. */
- $this->config->account->search['actionURL'] = $this->createLink('account', 'browse', "browseType=bySearch&queryID=myQueryID");
- $this->config->account->search['queryID'] = $param;
- $this->config->account->search['onMenuBar'] = 'no';
- $this->loadModel('search')->setSearchParams($this->config->account->search);
-
- $this->view->title = $this->lang->account->common;
- $this->view->accountList = $accountList;
- $this->view->users = $this->loadModel('user')->getPairs('noletter,noempty,noclosed');
- $this->view->pager = $pager;
- $this->view->param = $param;
- $this->view->orderBy = $orderBy;
- $this->view->browseType = $browseType;
-
- $this->display();
- }
-
- /**
- * 创建一个账号。
- * Create account.
- *
- * @access public
- * @return void
- */
- public function create()
- {
- if($_POST)
- {
- $account = form::data($this->config->account->form->create)
- ->add('createdBy', $this->app->user->account)
- ->get();
- if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
-
- $this->account->create($account);
- if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
-
- if(isInModal()) return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'load' => true));
- return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => helper::createLink('account', 'browse')));
- }
-
- $this->app->loadLang('serverroom');
- $this->view->title = $this->lang->account->create;
- $this->display();
- }
-
- /**
- * 编辑一个账号。
- * Edit one account.
- *
- * @param int $accountID
- * @access public
- * @return void
- */
- public function edit(int $accountID)
- {
- if($_POST)
- {
- $account = form::data($this->config->account->form->edit)
- ->add('editedBy', $this->app->user->account)
- ->get();
- if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
-
- $this->account->update($accountID, $account);
- if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
-
- return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browse'), 'closeModal' => true));
- }
-
- $this->view->title = $this->lang->account->edit;
- $this->view->account = $this->account->fetchByID($accountID);
- $this->view->rooms = $this->loadModel('serverroom')->getPairs();
-
- $this->display();
- }
-
- /**
- * 查看账号信息。
- * View account.
- *
- * @param int $accountID
- * @access public
- * @return void
- */
- public function view(int $accountID)
- {
- $this->view->title = $this->lang->account->view;
- $this->view->account = $this->account->fetchByID($accountID);
- $this->view->rooms = $this->loadModel('serverroom')->getPairs();
- $this->view->actions = $this->loadModel('action')->getList('account', $accountID);
- $this->view->users = $this->loadModel('user')->getPairs('noletter');
- $this->view->optionMenu = $this->loadModel('tree')->getOptionMenu(0, 'account');
- $this->display();
- }
-
- /**
- * 删除一个账号。
- * Delete Account.
- *
- * @param int $accountID
- * @access public
- * @return void
- */
- public function delete(int $accountID)
- {
- $this->account->delete(TABLE_ACCOUNT, $accountID);
-
- if(dao::isError())
- {
- $response['result'] = 'fail';
- $response['message'] = dao::getError(true);
- }
- else
- {
- $response['result'] = 'success';
- $response['message'] = '';
- $response['load'] = true;
- }
- return $this->send($response);
- }
-}
diff --git a/module/account/css/common.ui.css b/module/account/css/common.ui.css
deleted file mode 100644
index 47fa6a4e50..0000000000
--- a/module/account/css/common.ui.css
+++ /dev/null
@@ -1 +0,0 @@
-#accountCreateForm .form-row {max-width: 500px;}
diff --git a/module/account/lang/de.php b/module/account/lang/de.php
deleted file mode 100644
index 74379aadd4..0000000000
--- a/module/account/lang/de.php
+++ /dev/null
@@ -1,33 +0,0 @@
-account = new stdclass;
-$lang->account->common = 'account';
-$lang->account->all = 'All account';
-$lang->account->browse = 'browse account';
-$lang->account->create = 'create account';
-$lang->account->edit = 'edit account';
-$lang->account->view = 'view account';
-
-$lang->account->editAction = 'edit account';
-$lang->account->deleteAction = 'delete account';
-
-$lang->account->id = 'id';
-$lang->account->provider = 'provider';
-$lang->account->type = 'type';
-$lang->account->name = 'name';
-$lang->account->adminURI = 'admin url';
-$lang->account->account = 'account';
-$lang->account->email = 'email';
-$lang->account->mobile = 'mobile';
-$lang->account->password = 'pasword';
-$lang->account->createdBy = 'created by';
-$lang->account->createdDate = 'created date';
-$lang->account->editedBy = 'edited by';
-$lang->account->editedDate = 'edited date';
-$lang->account->confirmDelete = 'confirm delete';
-$lang->account->byQuery = 'search';
-
-$lang->account->empty = 'No Account';
-
-$lang->account->typeList = array();
-
-$lang->account->featureBar['browse']['all'] = $lang->account->all;
diff --git a/module/account/lang/en.php b/module/account/lang/en.php
deleted file mode 100644
index 74379aadd4..0000000000
--- a/module/account/lang/en.php
+++ /dev/null
@@ -1,33 +0,0 @@
-account = new stdclass;
-$lang->account->common = 'account';
-$lang->account->all = 'All account';
-$lang->account->browse = 'browse account';
-$lang->account->create = 'create account';
-$lang->account->edit = 'edit account';
-$lang->account->view = 'view account';
-
-$lang->account->editAction = 'edit account';
-$lang->account->deleteAction = 'delete account';
-
-$lang->account->id = 'id';
-$lang->account->provider = 'provider';
-$lang->account->type = 'type';
-$lang->account->name = 'name';
-$lang->account->adminURI = 'admin url';
-$lang->account->account = 'account';
-$lang->account->email = 'email';
-$lang->account->mobile = 'mobile';
-$lang->account->password = 'pasword';
-$lang->account->createdBy = 'created by';
-$lang->account->createdDate = 'created date';
-$lang->account->editedBy = 'edited by';
-$lang->account->editedDate = 'edited date';
-$lang->account->confirmDelete = 'confirm delete';
-$lang->account->byQuery = 'search';
-
-$lang->account->empty = 'No Account';
-
-$lang->account->typeList = array();
-
-$lang->account->featureBar['browse']['all'] = $lang->account->all;
diff --git a/module/account/lang/fr.php b/module/account/lang/fr.php
deleted file mode 100644
index 74379aadd4..0000000000
--- a/module/account/lang/fr.php
+++ /dev/null
@@ -1,33 +0,0 @@
-account = new stdclass;
-$lang->account->common = 'account';
-$lang->account->all = 'All account';
-$lang->account->browse = 'browse account';
-$lang->account->create = 'create account';
-$lang->account->edit = 'edit account';
-$lang->account->view = 'view account';
-
-$lang->account->editAction = 'edit account';
-$lang->account->deleteAction = 'delete account';
-
-$lang->account->id = 'id';
-$lang->account->provider = 'provider';
-$lang->account->type = 'type';
-$lang->account->name = 'name';
-$lang->account->adminURI = 'admin url';
-$lang->account->account = 'account';
-$lang->account->email = 'email';
-$lang->account->mobile = 'mobile';
-$lang->account->password = 'pasword';
-$lang->account->createdBy = 'created by';
-$lang->account->createdDate = 'created date';
-$lang->account->editedBy = 'edited by';
-$lang->account->editedDate = 'edited date';
-$lang->account->confirmDelete = 'confirm delete';
-$lang->account->byQuery = 'search';
-
-$lang->account->empty = 'No Account';
-
-$lang->account->typeList = array();
-
-$lang->account->featureBar['browse']['all'] = $lang->account->all;
diff --git a/module/account/lang/zh-cn.php b/module/account/lang/zh-cn.php
deleted file mode 100644
index 7a62474833..0000000000
--- a/module/account/lang/zh-cn.php
+++ /dev/null
@@ -1,33 +0,0 @@
-account = new stdclass;
-$lang->account->common = '运维账号';
-$lang->account->all = '全部账号';
-$lang->account->browse = '账号列表';
-$lang->account->create = '添加账号';
-$lang->account->edit = '编辑账号';
-$lang->account->view = '账号详情';
-
-$lang->account->editAction = '编辑账号';
-$lang->account->deleteAction = '删除账号';
-
-$lang->account->id = 'id';
-$lang->account->provider = '服务商';
-$lang->account->type = '类型';
-$lang->account->name = '名称';
-$lang->account->adminURI = '登录地址';
-$lang->account->account = '账户';
-$lang->account->email = '邮件';
-$lang->account->mobile = '手机';
-$lang->account->password = '密码';
-$lang->account->createdBy = '由谁添加';
-$lang->account->createdDate = '添加时间';
-$lang->account->editedBy = '由谁编辑';
-$lang->account->editedDate = '编辑时间';
-$lang->account->confirmDelete = '确定删除';
-$lang->account->byQuery = '搜索';
-
-$lang->account->empty = '暂时没有账号';
-
-$lang->account->typeList = array();
-
-$lang->account->featureBar['browse']['all'] = $lang->account->all;
diff --git a/module/account/model.php b/module/account/model.php
deleted file mode 100644
index 6e1aa4590f..0000000000
--- a/module/account/model.php
+++ /dev/null
@@ -1,121 +0,0 @@
-
- * @package account
- * @link https://www.zentao.net
- */
-class accountModel extends model
-{
- /**
- * 获取账号列表。
- * Get account list.
- *
- * @param string $browseType
- * @param int $param
- * @param string $orderBy
- * @param object $pager
- * @access public
- * @return array
- */
- public function getList(string $browseType = 'all', string $param = '', string $orderBy = 'id_desc', object|null $pager = null): array
- {
- $query = '';
- if($browseType == 'bysearch')
- {
- /* Concatenate the conditions for the query. */
- if(!$this->session->accountQuery) $this->session->set('accountQuery', ' 1 = 1');
- if($param)
- {
- $query = $this->loadModel('search')->getQuery((int)$param);
- if($query)
- {
- $this->session->set('accountQuery', $query->sql);
- $this->session->set('accountForm', $query->form);
- }
- }
- $query = $this->session->accountQuery;
- }
-
- $accounts = $this->dao->select('*')->from(TABLE_ACCOUNT)
- ->where('deleted')->eq('0')
- ->beginIF($query)->andWhere($query)->fi()
- ->orderBy($orderBy)
- ->page($pager)
- ->fetchAll();
-
- $users = $this->loadModel('user')->getPairs('noclosed|nodeleted|noletter');
- foreach($accounts as $account) $account->createdBy = zget($users, $account->createdBy, '');
-
- return $accounts;
- }
-
- /**
- * 获取账号的id:name键值对。
- * Get account pairs.
- *
- * @access public
- * @return array
- */
- public function getPairs(): array
- {
- return $this->dao->select('id,name')->from(TABLE_ACCOUNT)->where('deleted')->eq('0')->fetchPairs();
- }
-
- /**
- * 创建一个账号。
- * Create account.
- *
- * @param object $account
- * @access public
- * @return int|false
- */
- public function create(object $account): int|false
- {
- $this->dao->insert(TABLE_ACCOUNT)->data($account)
- ->batchCheck($this->config->account->create->requiredFields, 'notempty')
- ->checkIf($account->email, 'email', 'email')
- ->checkIf($account->mobile, 'mobile', 'mobile')
- ->exec();
- if(dao::isError()) return false;
-
- $accountID = $this->dao->lastInsertID();
- $this->loadModel('action')->create('account', $accountID, 'created');
- return $accountID;
- }
-
- /**
- * 更新一个账号。
- * Update one account.
- *
- * @param int $id
- * @param object $account
- * @access public
- * @return bool
- */
- public function update(int $id, object $account): bool
- {
- $oldAccount = $this->fetchByID($id);
- $this->dao->update(TABLE_ACCOUNT)->data($account)->autoCheck()
- ->batchCheck($this->config->account->edit->requiredFields, 'notempty')
- ->checkIf($account->email, 'email', 'email')
- ->checkIf($account->mobile, 'mobile', 'mobile')
- ->where('id')->eq($id)
- ->exec();
-
- if(!dao::isError())
- {
- $changes = common::createChanges($oldAccount, $account);
- if(empty($changes)) return true;
-
- $actionID = $this->loadModel('action')->create('account', $id, 'Edited');
- $this->action->logHistory($actionID, $changes);
- return true;
- }
- return false;
- }
-}
diff --git a/module/account/test/model/create.php b/module/account/test/model/create.php
deleted file mode 100644
index f8dae98beb..0000000000
--- a/module/account/test/model/create.php
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env php
-create();
-cid=0
-
-- 检查插入数据库的数据。
- - 属性name @测试账号
- - 属性provider @aliyun
- - 属性account @admin
- - 属性password @admin
-- 必填项检查。第name条的0属性 @『名称』不能为空。
-- 邮箱格式检查。第email条的0属性 @『邮件』应当为合法的EMAIL。
-- 手机格式检查。第mobile条的0属性 @『手机』应当为合法的手机号码。
-
-*/
-include dirname(__FILE__, 5) . '/test/lib/init.php';
-
-su('admin');
-
-zenData('account')->gen(0);
-
-$accountData = new stdclass();
-$accountData->name = '测试账号';
-$accountData->provider = 'aliyun';
-$accountData->adminURI = '';
-$accountData->account = 'admin';
-$accountData->password = 'admin';
-$accountData->email = 'admin@163.com';
-$accountData->mobile = '';
-$accountData->type = '';
-$accountData->status = '';
-$accountData->extra = '';
-$accountData->createdBy = 'admin';
-$accountData->createdDate = date('Y-m-d H:i:s');
-
-global $tester;
-$accountModel = $tester->loadModel('account');
-$accountID = $accountModel->create($accountData);
-$account = $accountModel->dao->select('*')->from(TABLE_ACCOUNT)->where('id')->eq($accountID)->fetch();
-r($account) && p('name,provider,account,password') && e('测试账号,aliyun,admin,admin'); // 检查插入数据库的数据。
-
-$accountData->name = '';
-$accountModel->create($accountData);
-r(dao::getError()) && p('name:0') && e('『名称』不能为空。'); //必填项检查。
-
-$accountData->name = '测试账号';
-$accountData->email = 'test';
-$accountModel->create($accountData);
-r(dao::getError()) && p('email:0') && e('『邮件』应当为合法的EMAIL。'); // 邮箱格式检查。
-
-$accountData->email = 'admin@163.com';
-$accountData->mobile = 'test';
-$accountModel->create($accountData);
-r(dao::getError()) && p('mobile:0') && e('『手机』应当为合法的手机号码。'); // 手机格式检查。
diff --git a/module/account/test/model/getlist.php b/module/account/test/model/getlist.php
deleted file mode 100644
index 4261b0649e..0000000000
--- a/module/account/test/model/getlist.php
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env php
-getList();
-timeout=0
-cid=0
-
-- 获取所有数据。 @10
-- 根据搜索条件搜索。 @10
-- 根据第一个保存条件搜索。 @0
-- 分页,每页5条,获取第一页。 @5
-
-*/
-include dirname(__FILE__, 5) . '/test/lib/init.php';
-
-su('admin');
-
-zenData('user')->gen(5);
-zenData('account')->gen(10);
-zenData('userquery')->gen(1);
-
-global $tester;
-$accountModel = $tester->loadModel('account');
-$accountModel->app->moduleName = 'account';
-$accountModel->app->methodName = 'browse';
-r(count($accountModel->getList())) && p() && e('10'); // 获取所有数据。
-r(count($accountModel->getList('bysearch', '0'))) && p() && e('10'); // 根据搜索条件搜索。
-r(count($accountModel->getList('bysearch', '1'))) && p() && e('0'); // 根据第一个保存条件搜索。
-
-$accountModel->app->loadClass('pager', $static = true);
-$pager = new pager(0, 5, 1);
-r(count($accountModel->getList('all', '', 'id_desc', $pager))) && p() && e('5'); // 分页,每页5条,获取第一页。
\ No newline at end of file
diff --git a/module/account/test/model/getpairs.php b/module/account/test/model/getpairs.php
deleted file mode 100644
index b1953a3400..0000000000
--- a/module/account/test/model/getpairs.php
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env php
-getPairs();
-timeout=0
-cid=0
-
-- 检查获取数据数。 @10
-- 检查部分数据。
- - 属性1 @运维账号1
- - 属性2 @运维账号2
-
-*/
-include dirname(__FILE__, 5) . '/test/lib/init.php';
-
-su('admin');
-
-zenData('account')->gen(10);
-
-global $tester;
-$accountModel = $tester->loadModel('account');
-$pairs = $accountModel->getPairs();
-r(count($pairs)) && p() && e('10'); // 检查获取数据数。
-r($pairs) && p('1,2') && e('运维账号1,运维账号2'); // 检查部分数据。
\ No newline at end of file
diff --git a/module/account/test/model/update.php b/module/account/test/model/update.php
deleted file mode 100644
index dfa8274d54..0000000000
--- a/module/account/test/model/update.php
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env php
-update();
-timeout=0
-cid=0
-
-- 检查插入数据库的数据。
- - 属性id @1
- - 属性name @运维账号1
- - 属性provider @qingyun
-- 检查插入数据库的数据。
- - 属性id @1
- - 属性name @测试账号
- - 属性provider @aliyun
- - 属性account @admin
- - 属性password @admin
-- 必填项检查。第name条的0属性 @『名称』不能为空。
-- 邮箱格式检查。第email条的0属性 @『邮件』应当为合法的EMAIL。
-- 手机格式检查。第mobile条的0属性 @『手机』应当为合法的手机号码。
-
-*/
-include dirname(__FILE__, 5) . '/test/lib/init.php';
-
-su('admin');
-
-zenData('account')->gen(5);
-
-$account = new stdclass();
-$account->name = '测试账号';
-$account->provider = 'aliyun';
-$account->adminURI = '';
-$account->account = 'admin';
-$account->password = 'admin';
-$account->email = 'admin@163.com';
-$account->mobile = '';
-$account->type = '';
-$account->status = '';
-$account->extra = '';
-$account->createdBy = 'admin';
-$account->createdDate = date('Y-m-d H:i:s');
-
-global $tester;
-$accountID = 1;
-$accountModel = $tester->loadModel('account');
-$oldAccount = $accountModel->dao->select('*')->from(TABLE_ACCOUNT)->where('id')->eq($accountID)->fetch();
-$accountModel->update($accountID, $account);
-$newAccount = $accountModel->dao->select('*')->from(TABLE_ACCOUNT)->where('id')->eq($accountID)->fetch();
-
-r($oldAccount) && p('id,name,provider') && e('1,运维账号1,qingyun'); // 检查插入数据库的数据。
-r($newAccount) && p('id,name,provider,account,password') && e('1,测试账号,aliyun,admin,admin'); // 检查插入数据库的数据。
-
-$account->name = '';
-$accountModel->create($account);
-r(dao::getError()) && p('name:0') && e('『名称』不能为空。'); //必填项检查。
-
-$account->name = '测试账号';
-$account->email = 'test';
-$accountModel->create($account);
-r(dao::getError()) && p('email:0') && e('『邮件』应当为合法的EMAIL。'); // 邮箱格式检查。
-
-$account->email = 'admin@163.com';
-$account->mobile = 'test';
-$accountModel->create($account);
-r(dao::getError()) && p('mobile:0') && e('『手机』应当为合法的手机号码。'); // 手机格式检查。
\ No newline at end of file
diff --git a/module/account/ui/browse.html.php b/module/account/ui/browse.html.php
deleted file mode 100644
index 9639a37b53..0000000000
--- a/module/account/ui/browse.html.php
+++ /dev/null
@@ -1,44 +0,0 @@
-
- * @package account
- * @link https://www.zentao.net
- */
-
-namespace zin;
-
-$queryMenuLink = createLink('account', 'browse', "browseType=bySearch¶m={queryID}");
-featureBar
-(
- set::queryMenuLinkCallback(fn($key) => str_replace('{queryID}', (string)$key, $queryMenuLink)),
- li(searchToggle())
-);
-
-/* zin: Define the toolbar on main menu. */
-$canCreate = hasPriv('account', 'create');
-$createLink = $this->createLink('account', 'create');
-$createItem = array('text' => $lang->account->create, 'url' => $createLink, 'class' => 'primary', 'icon' => 'plus', 'data-toggle' => 'modal', 'data-size' => 'sm');
-
-$tableData = initTableData($accountList, $config->account->dtable->fieldList, $this->account);
-
-toolbar
-(
- $canCreate ? item(set($createItem)) : null,
-);
-
-dtable
-(
- set::userMap($users),
- set::cols(array_values($config->account->dtable->fieldList)),
- set::data($tableData),
- set::sortLink(createLink('account', 'browse', "browseType=$browseType¶m=$param&orderBy={name}_{sortType}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}")),
- set::orderBy($orderBy),
- set::footPager(usePager())
-);
-
-render();
diff --git a/module/account/ui/create.html.php b/module/account/ui/create.html.php
deleted file mode 100644
index 3559d9c43c..0000000000
--- a/module/account/ui/create.html.php
+++ /dev/null
@@ -1,78 +0,0 @@
-
- * @package account
- * @link https://www.zentao.net
- */
-
-namespace zin;
-
-formPanel
-(
- set::id('accountCreateForm'),
- set::title($lang->account->create),
- formRow
- (
- formGroup
- (
- set::name('name'),
- set::label($lang->account->name)
- )
- ),
- formRow
- (
- formGroup
- (
- set::width('1/2'),
- set::label($lang->account->provider),
- set::control('picker'),
- set::name('provider'),
- set::items($lang->serverroom->providerList)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('adminURI'),
- set::label($lang->account->adminURI)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('account'),
- set::label($lang->account->account)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('password'),
- set::label($lang->account->password)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('email'),
- set::label($lang->account->email)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('mobile'),
- set::label($lang->account->mobile)
- )
- )
-);
diff --git a/module/account/ui/edit.html.php b/module/account/ui/edit.html.php
deleted file mode 100644
index ea7c269ed2..0000000000
--- a/module/account/ui/edit.html.php
+++ /dev/null
@@ -1,85 +0,0 @@
-
- * @package account
- * @link https://www.zentao.net
- */
-
-namespace zin;
-
-formPanel
-(
- set::id('accountCreateForm'),
- set::title($lang->account->edit),
- formRow
- (
- formGroup
- (
- set::name('name'),
- set::label($lang->account->name),
- set::value($account->name)
- )
- ),
- formRow
- (
- formGroup
- (
- set::width('1/2'),
- set::label($lang->account->provider),
- set::control('picker'),
- set::name('provider'),
- set::items($lang->serverroom->providerList),
- set::value($account->provider)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('adminURI'),
- set::label($lang->account->adminURI),
- set::value($account->adminURI)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('account'),
- set::label($lang->account->account),
- set::value($account->account)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('password'),
- set::label($lang->account->password),
- set::value($account->password)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('email'),
- set::label($lang->account->email),
- set::value($account->email)
- )
- ),
- formRow
- (
- formGroup
- (
- set::name('mobile'),
- set::label($lang->account->mobile),
- set::value($account->mobile)
- )
- )
-);
diff --git a/module/account/ui/view.html.php b/module/account/ui/view.html.php
deleted file mode 100644
index fe77b8af19..0000000000
--- a/module/account/ui/view.html.php
+++ /dev/null
@@ -1,89 +0,0 @@
-
- * @package account
- * @link https://www.zentao.net
- */
-namespace zin;
-global $lang;
-
-if(isAjaxRequest('modal'))
-{
- $config->account->actionList['edit']['data-load'] = 'modal';
- unset($config->account->actionList['edit']['data-toggle']);
-}
-$actions = $this->loadModel('common')->buildOperateMenu($account);
-
-detailHeader
-(
- isAjaxRequest('modal') ? to::prefix() : '',
- to::title(
- entityLabel(
- set(array('entityID' => $account->id, 'level' => 1, 'text' => $account->name))
- )
- )
-);
-
-detailBody
-(
- sectionList
- (
- section
- (
- tableData
- (
- item
- (
- set::name($lang->account->name),
- $account->name
- ),
- item
- (
- set::name($lang->account->provider),
- \zget($lang->serverroom->providerList, $account->provider)
- ),
- item
- (
- set::name($lang->account->adminURI),
- $account->adminURI
- ),
- item
- (
- set::name($lang->account->account),
- $account->account
- ),
- item
- (
- set::name($lang->account->password),
- $account->password
- ),
- item
- (
- set::name($lang->account->email),
- $account->email
- ),
- item
- (
- set::name($lang->account->mobile),
- $account->mobile
- )
- )
- )
- ),
- history
- (
- set::commentUrl(createLink('action', 'comment', array('objectType' => 'account', 'objectID' => $account->id)))
- ),
- floatToolbar
- (
- set::object($account),
- isAjaxRequest('modal') ? null : to::prefix(backBtn(set::icon('back'), set::className('ghost text-white'), $lang->goback)),
- set::suffix($actions['suffixActions'])
- )
-);
-
-render();
diff --git a/module/account/view/browse.html.php b/module/account/view/browse.html.php
deleted file mode 100644
index 52ce8834ea..0000000000
--- a/module/account/view/browse.html.php
+++ /dev/null
@@ -1,98 +0,0 @@
-
- * @package account
- * @version $Id$
- * @link https://www.zentao.net
- */
-?>
-getModuleRoot() . 'common/view/header.html.php';?>
-account->confirmDelete)?>
-
-
-
-' data-module='account'>
-
-
-
-
-
-
- account->empty;?>
- " . $lang->account->create, '', "class='btn btn-info' data-toggle='modal'");?>
-
-
-
-
-
-
- recTotal}&recPerPage={$pager->recPerPage}";?>
- | idAB);?> |
- account->name);?> |
- account->provider);?> |
- account->account);?> |
- account->email);?> |
- account->mobile);?> |
- account->createdBy);?> |
- actions?> |
-
-
-
-
-
- | id);?> |
- inlink('view', "id=$account->id", 'html'), $account->name);?> |
- serverroom->providerList, $account->provider);?> |
- account;?> |
- email;?> |
- mobile;?> |
- createdBy;?> |
-
- id}&from=self", " ", '', "data-toggle='modal' class='btn' title='{$lang->edit}'", '', true);
- if(common::hasPriv('account', 'delete', $account))
- {
- $deleteURL = $this->createLink('account', 'delete', "id=$account->id");
- echo html::a("javascript:ajaxDelete(\"$deleteURL\",\"accountList\",confirmDelete)", '', '', "class='btn' title='{$lang->delete}'");
- }
- ?>
- |
-
-
-
-
-
-
-
-
-
-getModuleRoot() . 'common/view/footer.html.php';?>
diff --git a/module/account/view/create.html.php b/module/account/view/create.html.php
deleted file mode 100644
index 84b207c7df..0000000000
--- a/module/account/view/create.html.php
+++ /dev/null
@@ -1,52 +0,0 @@
-
- * @package account
- * @version $Id$
- * @link https://www.zentao.net
- */
-?>
-
-
-
diff --git a/module/account/view/edit.html.php b/module/account/view/edit.html.php
deleted file mode 100644
index bc9d9c6999..0000000000
--- a/module/account/view/edit.html.php
+++ /dev/null
@@ -1,66 +0,0 @@
-
- * @package account
- * @version $Id$
- * @link https://www.zentao.net
- */
-?>
-
-
-
-
-
diff --git a/module/account/view/view.html.php b/module/account/view/view.html.php
deleted file mode 100644
index dda23f6de9..0000000000
--- a/module/account/view/view.html.php
+++ /dev/null
@@ -1,65 +0,0 @@
-
- * @package account
- * @version $Id$
- * @link https://www.zentao.net
- */
-?>
-getModuleRoot() . 'common/view/header.html.php';?>
-account->confirmDelete)?>
-
-
-
account->view;?>
-
-
-
- getModuleRoot() . 'common/view/action.html.php'?>
-
-
-
-
- id", " " . $lang->edit, '', "class='btn iframe'", '', true, $account);
- if(!isonlybody()) common::printLink('account', 'browse', "", " " . $lang->goback, '', "class='btn'");
- ?>
-
-
-
-getModuleRoot() . 'common/view/footer.html.php';?>
diff --git a/module/action/lang/de.php b/module/action/lang/de.php
index 0388dc0b6b..5af9ebcc89 100644
--- a/module/action/lang/de.php
+++ b/module/action/lang/de.php
@@ -353,9 +353,12 @@ $lang->action->desc->updatecustom = '$date, updated by $actoraction->desc->delist = '$date, delist by $actor.' . "\n";
$lang->action->desc->publish = '$date, publish by $actor.' . "\n";
-$lang->action->desc->manualbackup = '$date, Manually backed up by $actor.' . "\n";
-$lang->action->desc->openautobackup = '$date, Enable automatic backup by $actor.' . "\n";
-$lang->action->desc->closeautobackup = '$date, Disable automatic backup by $actor.' . "\n";
+$lang->action->desc->manualbackup = '$date, Manually backed up by $actor.' . "\n";
+$lang->action->desc->openautobackup = '$date, Enable automatic backup by $actor.' . "\n";
+$lang->action->desc->closeautobackup = '$date, Disable automatic backup by $actor.' . "\n";
+$lang->action->desc->autodeletebackups = '$date, Automatically clean up backups by $actor.' . "\n";
+$lang->action->desc->savebackupsettings = '$date, Save backup settings backups by $actor.' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, Clean up expired backups by $actor.' . "\n";
/* Used to display dynamic information. */
$lang->action->label = new stdclass();
diff --git a/module/action/lang/en.php b/module/action/lang/en.php
index 27f94cc23b..35bdfc41b6 100755
--- a/module/action/lang/en.php
+++ b/module/action/lang/en.php
@@ -353,9 +353,12 @@ $lang->action->desc->updatecustom = '$date, updated by $actor
$lang->action->desc->delist = '$date, delist by $actor.' . "\n";
$lang->action->desc->publish = '$date, publish by $actor.' . "\n";
-$lang->action->desc->manualbackup = '$date, Manually backed up by $actor.' . "\n";
-$lang->action->desc->openautobackup = '$date, Enable automatic backup by $actor.' . "\n";
-$lang->action->desc->closeautobackup = '$date, Disable automatic backup by $actor.' . "\n";
+$lang->action->desc->manualbackup = '$date, Manually backed up by $actor.' . "\n";
+$lang->action->desc->openautobackup = '$date, Enable automatic backup by $actor.' . "\n";
+$lang->action->desc->closeautobackup = '$date, Disable automatic backup by $actor.' . "\n";
+$lang->action->desc->autodeletebackups = '$date, Automatically clean up backups by $actor.' . "\n";
+$lang->action->desc->savebackupsettings = '$date, Save backup settings backups by $actor.' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, Clean up expired backups by $actor.' . "\n";
/* Used to display dynamic information. */
$lang->action->label = new stdclass();
diff --git a/module/action/lang/fr.php b/module/action/lang/fr.php
index 38a8088d9c..69d117376e 100644
--- a/module/action/lang/fr.php
+++ b/module/action/lang/fr.php
@@ -353,9 +353,12 @@ $lang->action->desc->updatecustom = '$date, updated by $actor
$lang->action->desc->delist = '$date, delist by $actor.' . "\n";
$lang->action->desc->publish = '$date, publish by $actor.' . "\n";
-$lang->action->desc->manualbackup = '$date, Manually backed up by $actor.' . "\n";
-$lang->action->desc->openautobackup = '$date, Enable automatic backup by $actor.' . "\n";
-$lang->action->desc->closeautobackup = '$date, Disable automatic backup by $actor.' . "\n";
+$lang->action->desc->manualbackup = '$date, Manually backed up by $actor.' . "\n";
+$lang->action->desc->openautobackup = '$date, Enable automatic backup by $actor.' . "\n";
+$lang->action->desc->closeautobackup = '$date, Disable automatic backup by $actor.' . "\n";
+$lang->action->desc->autodeletebackups = '$date, Automatically clean up backups by $actor.' . "\n";
+$lang->action->desc->savebackupsettings = '$date, Save backup settings backups by $actor.' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, Clean up expired backups by $actor.' . "\n";
/* Used to display dynamic information. */
$lang->action->label = new stdclass();
diff --git a/module/action/lang/zh-cn.php b/module/action/lang/zh-cn.php
index 47d90dacd8..6eda9e2d09 100755
--- a/module/action/lang/zh-cn.php
+++ b/module/action/lang/zh-cn.php
@@ -353,9 +353,13 @@ $lang->action->desc->updatecustom = '$date, 由 $actoraction->desc->delist = '$date, 由 $actor 下架。' . "\n";
$lang->action->desc->publish = '$date, 由 $actor 发布。' . "\n";
-$lang->action->desc->manualbackup = '$date, 由 $actor 手动备份。' . "\n";
-$lang->action->desc->openautobackup = '$date, 由 $actor 开启自动备份。' . "\n";
-$lang->action->desc->closeautobackup = '$date, 由 $actor 关闭自动备份。' . "\n";
+$lang->action->desc->manualbackup = '$date, 由 $actor 手动备份。' . "\n";
+$lang->action->desc->autobackup = '$date, 由 $actor 自动备份。' . "\n";
+$lang->action->desc->openautobackup = '$date, 由 $actor 开启自动备份。' . "\n";
+$lang->action->desc->closeautobackup = '$date, 由 $actor 关闭自动备份。' . "\n";
+$lang->action->desc->autodeletebackups = '$date, 由 $actor 自动清理备份。' . "\n";
+$lang->action->desc->savebackupsettings = '$date, 由 $actor 保存备份设置。' . "\n";
+$lang->action->desc->deleteexpiredbackup = '$date, 由 $actor 清理过期备份。' . "\n";
/* 用来显示动态信息。*/
$lang->action->label = new stdclass();
diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php
index 869ecfb8ee..c14dd3a720 100644
--- a/module/admin/lang/menu.php
+++ b/module/admin/lang/menu.php
@@ -188,28 +188,24 @@ if(helper::hasFeature('devops'))
$lang->admin->menuList->platform['order'] = 55;
//$lang->admin->menuList->platform['subMenu']['environment'] = array('link' => "{$lang->devops->environment}|gitlab|browse|", 'subModule' => 'gitlab,jenkins,sonarqube,gitea,gogs', 'alias' => 'create,edit,import');
- $lang->admin->menuList->platform['subMenu']['resource'] = array('link' => "{$lang->devops->resource}|serverroom|browse|", 'subModule' => 'account,serverroom,ops,tree,domain,service');
+ $lang->admin->menuList->platform['subMenu']['resource'] = array('link' => "{$lang->devops->resource}|serverroom|browse|", 'subModule' => 'serverroom,ops,tree,domain,service');
$lang->admin->menuList->platform['subMenu']['setrules'] = array('link' => "{$lang->devops->rules}|repo|setrules|");
$lang->admin->menuList->platform['tabMenu']['resource']['serverroom'] = array('link' => "{$lang->devops->serverroom}|serverroom|browse|", 'alias' => 'create,edit,view,browse');
$lang->admin->menuList->platform['tabMenu']['resource']['service'] = array('link' => "{$lang->devops->service}|service|browse|", 'alias' => 'create,edit,view,browse,manage');
- $lang->admin->menuList->platform['tabMenu']['resource']['account'] = array('link' => "{$lang->devops->account}|account|browse|", 'alias' => 'create,edit,view,browse');
$lang->admin->menuList->platform['tabMenu']['resource']['domain'] = array('link' => "{$lang->devops->domain}|domain|browse|", 'alias' => 'create,edit,view,browse');
$lang->admin->menuList->platform['tabMenu']['resource']['provider'] = array('link' => "{$lang->devops->provider}|ops|provider|", 'alias' => 'provider');
$lang->admin->menuList->platform['tabMenu']['resource']['city'] = array('link' => "{$lang->devops->city}|ops|city|", 'alias' => 'city');
- $lang->admin->menuList->platform['tabMenu']['resource']['cpuBrand'] = array('link' => "{$lang->devops->cpuBrand}|ops|cpuBrand|", 'alias' => 'cpubrand');
$lang->admin->menuList->platform['tabMenu']['resource']['os'] = array('link' => "{$lang->devops->os}|ops|os|", 'alias' => 'os');
$lang->admin->menuList->platform['tabMenu']['resource']['stage'] = array('link' => "{$lang->devops->stage}|ops|stage|", 'alias' => 'stage');
$lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['15'] = 'serverroom';
$lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['20'] = 'service';
- $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['25'] = 'account';
- $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['30'] = 'domain';
- $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['35'] = 'provider';
- $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['40'] = 'city';
- $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['45'] = 'cpuBrand';
- $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['50'] = 'os';
- $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['55'] = 'stage';
+ $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['25'] = 'domain';
+ $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['30'] = 'provider';
+ $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['35'] = 'city';
+ $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['40'] = 'os';
+ $lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['45'] = 'stage';
if($config->edition === 'open')
{
@@ -217,8 +213,8 @@ if(helper::hasFeature('devops'))
unset($lang->admin->menuList->platform['tabMenu']['resource']['service']);
unset($lang->admin->menuList->platform['tabMenu']['resource']['stage']);
unset($lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['20']);
- unset($lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['30']);
- unset($lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['55']);
+ unset($lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['25']);
+ unset($lang->admin->menuList->platform['tabMenu']['menuOrder']['resource']['45']);
}
//$lang->admin->menuList->platform['menuOrder']['15'] = 'environment';
diff --git a/module/api/control.php b/module/api/control.php
index 2f50d943b2..465beb1c8b 100755
--- a/module/api/control.php
+++ b/module/api/control.php
@@ -36,11 +36,11 @@ class api extends control
* @param int $version
* @param int $release
* @param string $browseType
- * @param int $param
+ * @param string $params
* @access public
* @return void
*/
- public function index(int $libID = 0, int $moduleID = 0, int $apiID = 0, int $version = 0, int $release = 0, string $browseType = 'all', int $param = 0, string $orderBy = 'order_asc', int $recTotal = 0, int $recPerPage = 20, int $pageID = 1, string $mode = '', string $search = '')
+ public function index(int $libID = 0, int $moduleID = 0, int $apiID = 0, int $version = 0, int $release = 0, string $browseType = 'nolink', string $params = '', string $orderBy = 'order_asc', int $recTotal = 0, int $recPerPage = 20, int $pageID = 1, string $mode = '', string $search = '')
{
/* 设置空间类型。 */
$this->session->set('spaceType', 'api', 'doc');
@@ -88,12 +88,108 @@ class api extends control
$this->view->orderBy = $orderBy;
$this->view->objectType = $objectType;
$this->view->objectID = $objectID;
- $this->view->param = $param;
+ $this->view->params = $params;
$this->view->users = $this->loadModel('user')->getPairs('noclosed,noletter');
$this->view->title = $this->lang->api->pageTitle;
$this->display();
}
+ /**
+ * 获取接口空间首页页面。
+ * Get the api home page.
+ *
+ * @param string $type
+ * @param string $params
+ * @param int $recPerPage
+ * @param int $pageID
+ * @access public
+ * @return void
+ */
+ public function ajaxGetHome(string $type = 'nolink', string $params = 'notempty_unclosed', int $recPerPage = 20, int $pageID = 1)
+ {
+ $libs = $this->doc->getApiLibs(0, $type);
+ $flags = explode('_', $params);
+ $unclosed = in_array('unclosed', $flags);
+ $notempty = in_array('notempty', $flags);
+ $apis = $this->api->getApiListBySearch(0, 0);
+ $recTotal = 0;
+ $recPerPage = $recPerPage ? max(1, $recPerPage) : 20;
+
+ $productsCount = array();
+ $projectsCount = array();
+ foreach($apis as $api)
+ {
+ if(!isset($libs[$api->lib])) continue;
+ $lib = $libs[$api->lib];
+ if(isset($lib->apiCount)) $lib->apiCount++;
+ else $lib->apiCount = 1;
+
+ if($lib->product)
+ {
+ if(isset($productsCount[$lib->product])) $productsCount[$lib->product]++;
+ else $productsCount[$lib->product] = 1;
+ }
+ if($lib->project)
+ {
+ if(isset($projectsCount[$lib->project])) $projectsCount[$lib->project]++;
+ else $projectsCount[$lib->project] = 1;
+ }
+ }
+
+ if($type !== 'nolink')
+ {
+ $programs = $this->loadModel('program')->getList($unclosed ? 'unclosed' : 'all', 'id_asc', 'top');
+ $programs = array_filter($programs, function($program) {return $program->parent == '0';});
+ if($type == 'product')
+ {
+ $products = $this->loadModel('product')->getList(0, $unclosed ? 'noclosed' : 'all', 0, 0);
+ foreach($products as $product)
+ {
+ if(!isset($programs[$product->program])) continue;
+ $program = $programs[$product->program];
+ $program->products[] = $product;
+ $product->apiCount = isset($productsCount[$product->id]) ? $productsCount[$product->id] : 0;
+ $program->apiCount = isset($program->apiCount) ? $program->apiCount + $product->apiCount : $product->apiCount;
+ }
+ }
+ else
+ {
+ $projects = $this->loadModel('project')->getList($unclosed ? 'unclosed' : 'all');
+ foreach($projects as $project)
+ {
+ if(!isset($programs[$project->parent])) continue;
+ $program = $programs[$project->parent];
+ $program->projects[] = $project;
+ $project->apiCount = isset($projectsCount[$project->id]) ? $projectsCount[$project->id] : 0;
+ $program->apiCount = isset($program->apiCount) ? $program->apiCount + $project->apiCount : $project->apiCount;
+ }
+ }
+
+ if($notempty) $programs = array_filter($programs, function($program) {return isset($program->apiCount) && $program->apiCount > 0;});
+
+ $recTotal = count($programs);
+ $pageID = max(1, min($pageID, ceil($recTotal / $recPerPage)));
+ $programs = array_slice($programs, ($pageID - 1) * $recPerPage, $recPerPage);
+ }
+ else
+ {
+ if($notempty) $libs = array_filter($libs, function($lib) {return isset($lib->apiCount) && $lib->apiCount > 0;});
+ $recTotal = count($libs);
+ $pageID = max(1, min($pageID, ceil($recTotal / $recPerPage)));
+ $libs = array_slice($libs, ($pageID - 1) * $recPerPage, $recPerPage);
+ }
+
+ $this->app->loadClass('pager', true);
+
+ $this->view->programs = isset($programs) ? $programs : array();
+ $this->view->unclosed = $unclosed;
+ $this->view->notempty = $notempty;
+ $this->view->libs = $libs;
+ $this->view->type = $type;
+ $this->view->pager = new pager($recTotal, $recPerPage, $pageID);
+ $this->display();
+ }
+
/**
* 获取接口界面数据。
* Get the api UI data.
@@ -110,24 +206,32 @@ class api extends control
$pickLib = $noPicks || strpos($picks, ',lib,') !== false;
$pickModule = $noPicks || strpos($picks, ',module,') !== false;
$data = array('spaceID' => $spaceID);
+ $isNolink = $spaceID == 'nolink';
+ list($objectType, $objectID) = $isNolink ? array('', 0) : explode('.', $spaceID . '.');
if($noPicks || strpos($picks, ',space,') !== false)
{
- $data['spaces'][] = array('id' => 'nolink', 'name' => $this->lang->api->noLinked, 'type' => 'api');
+ $spaces['nolink'] = array('id' => 'nolink', 'name' => $this->lang->api->noLinked, 'type' => 'api');
list($normalObjects, $closedObjects) = $this->api->getOrderedObjects();
foreach($normalObjects as $type => $list)
{
- foreach($list as $id => $name) $data['spaces'][] = array('id' => "product.{$id}", 'name' => $name, 'type' => 'api', 'objectType' => $type);
+ foreach($list as $id => $name) $spaces["$type.{$id}"] = array('id' => "$type.{$id}", 'name' => $name, 'type' => 'api', 'objectType' => $type);
}
foreach($closedObjects as $type => $list)
{
- foreach($list as $id => $name) $data['spaces'][] = array('id' => "project.{$id}", 'name' => $name, 'type' => 'api', 'objectType' => $type, 'closed' => true);
+ foreach($list as $id => $name) $spaces["$type.{$id}"] = array('id' => "$type.{$id}", 'name' => $name, 'type' => 'api', 'objectType' => $type, 'closed' => true);
}
+ if(!$isNolink && !isset($spaces[$spaceID]))
+ {
+ $object = $this->loadModel($objectType)->getByID((int)$objectID);
+ $spaces[$spaceID] = array('id' => $spaceID, 'name' => $object->name, 'type' => 'api');
+ }
+ $data['spaces'] = array_values($spaces);
}
if($pickLib || $pickModule)
{
- $libs = $this->doc->getApiLibs();
+ $libs = $isNolink ? $this->doc->getApiLibs(0, 'nolink') : $this->doc->getApiLibs(0, $objectType, (int)$objectID);
$libIds = array_keys($libs);
if($pickLib)
{
@@ -148,7 +252,7 @@ class api extends control
if($noPicks || strpos($picks, ',doc,') !== false)
{
- $apis = $this->api->getApiListBySearch(0, 0);
+ $apis = $this->api->getApiListBySearch(0, 0, $objectType);
$unsetProps = array('commonParams', 'params', 'paramsExample', 'response', 'responseExample');
foreach($apis as $api)
{
@@ -582,7 +686,7 @@ class api extends control
$this->api->update($formData);
if(dao::isError()) return $this->sendError(dao::getError());
- return $this->sendSuccess(array('locate' => helper::createLink('api', 'index', "libID=$api->lib&moduleID=0&apiID=$apiID"), 'docApp' => array(array('selectDoc', $apiID), array('executeCommand', 'loadApi'))));
+ return $this->sendSuccess(array('locate' => helper::createLink('api', 'index', "libID=$api->lib&moduleID=0&apiID=$apiID"), 'docApp' => array(array('executeCommand', 'selectApi', array($apiID)), array('executeCommand', 'loadApi'))));
}
$this->setMenu($api->lib);
@@ -874,29 +978,23 @@ class api extends control
*
* @param string $objectType
* @param int $objectID
- * @param string $module
- * @param string $method
+ * @param int $libID
* @access public
* @return void
*/
- public function ajaxGetDropMenu(string $objectType, int $objectID, string $module, string $method)
+ public function ajaxGetDropMenu(string $objectType, int $objectID, int $libID = 0)
{
- list($normalObjects, $closedObjects) = $this->api->getOrderedObjects();
+ $objects = $this->api->getGroupedObjects();
+ $programs = $this->loadModel('program')->getList('all', 'order_asc', 'top');
+ $programs = array_filter($programs, function($program) {return $program->parent == '0';});
- $titleList = array($this->lang->api->noLinked);
- if(!empty($normalObjects['product'])) $titleList += array_values($normalObjects['product']);
- if(!empty($normalObjects['project'])) $titleList += array_values($normalObjects['project']);
- if(!empty($closedObjects['product'])) $titleList += array_values($closedObjects['product']);
- if(!empty($closedObjects['project'])) $titleList += array_values($closedObjects['project']);
-
- $this->view->objectType = $objectType;
- $this->view->objectID = $objectID;
- $this->view->module = $module;
- $this->view->method = $method;
- $this->view->normalObjects = $normalObjects;
- $this->view->closedObjects = $closedObjects;
- $this->view->nolinkLibs = $this->doc->getApiLibs(0, 'nolink');
- $this->view->objectsPinYin = common::convert2Pinyin($titleList);
+ $this->view->objectType = $objectType;
+ $this->view->objectID = $objectID;
+ $this->view->libID = $libID;
+ $this->view->programs = $programs;
+ $this->view->products = $objects['product'];
+ $this->view->projects = $objects['project'];
+ $this->view->nolinkLibs = $objects['nolink'];
$this->display();
}
diff --git a/module/api/css/index.ui.css b/module/api/css/index.ui.css
index ba45c39e62..e69de29bb2 100644
--- a/module/api/css/index.ui.css
+++ b/module/api/css/index.ui.css
@@ -1,24 +0,0 @@
-.icon-api {text-align: center; --api-color-rgb: var(--color-success-500-rgb); color: rgba(var(--api-color-rgb), 1);}
-.icon-api::before {content: ' '; display: inline-block; width: 8px; height: 8px; border-radius: 2px; background-color: currentColor; min-width: 0;}
-
-.api-list-item.is-GET, .icon-api.is-GET {--api-color-rgb: var(--color-success-500-rgb)}
-.api-list-item.is-POST, .icon-api.is-POST {--api-color-rgb: var(--color-important-500-rgb)}
-.api-list-item.is-DELETE, .icon-api.is-DELETE {--api-color-rgb: var(--color-danger-500-rgb)}
-.api-list-item.is-PUT, .icon-api.is-PUT {--api-color-rgb: var(--color-important-500-rgb)}
-.api-list-item.is-PATCH, .icon-api.is-PATCH {--api-color-rgb: var(--color-special-500-rgb)}
-.api-list-item.is-OPTIONS, .icon-api.is-OPTIONS {--api-color-rgb: var(--color-special-500-rgb)}
-.api-list-item.is-HEAD, .icon-api.is-HEAD {--api-color-rgb: var(--color-gray-500-rgb)}
-
-.api-list-item {background-color: rgba(var(--api-color-rgb), .1);}
-.api-list-item .api-method {background-color: rgba(var(--api-color-rgb), 1); color: var(--color-canvas)}
-.api-list-item .api-title {color: rgba(var(--api-color-rgb), 1)}
-
-.doc-app-mode-edit, .doc-app-mode-create {--doc-view-max-width: 1100px}
-.doc-app-mode-edit .doc-view-content, .doc-app-mode-create .doc-view-content {padding: 0 24px;}
-.doc-app-mode-edit form .form-actions, .doc-app-mode-create form .form-actions {display: none;}
-
-.doc-tree .item-inner>.item-icon {margin-right: -4px;}
-.doc-list > .dtable {--dtable-border-color: transparent}
-.api-lib-menu + .doc-tree > .tree {padding-top: 0;}
-
-.dropdown-menu .divider + .divider {display: none;}
diff --git a/module/api/js/index.ui.js b/module/api/js/index.ui.js
index 98db87eeb7..9509b6761d 100644
--- a/module/api/js/index.ui.js
+++ b/module/api/js/index.ui.js
@@ -4,6 +4,20 @@
*/
const customRenders =
{
+ /**
+ * 落地页渲染,根据 API 接口类型显示不同的内容。
+ * Home page render, show different content according to the API interface type.
+ */
+ home: function()
+ {
+ const docApp = this;
+ const filterType = docApp.location.filterType || 'nolink';
+ const pager = $.extend({page: 1, recPerPage: 20}, docApp.signals.pager.value);
+ const params = docApp.signals.params.value || 'notempty_unclosed';
+ const homeViewUrl = $.createLink('api', 'ajaxgethome', `type=${filterType}¶ms=${params}&recPerPage=${pager.recPerPage}&pageID=${pager.page}`);
+ return {fetcher: homeViewUrl, clearBeforeLoad: false, className: 'doc-api-home h-full', class: 'h-full col',htmlRender: (element, props) => $(element).morphInner(`${props.html}
`)};
+ },
+
/**
* 定义 API 文档编辑器渲染,包括查看、编辑和创建。
* Define the API doc editor render, including view, edit and create.
@@ -62,8 +76,9 @@ const customRenders =
if(this.mode === 'list' && listType)
{
const items = [];
- if(listType === 'structs') items.push({text: getDocAppLang('createStruct'), icon: 'plus', btnType: 'primary', 'data-toggle': 'modal', 'data-size': 'lg', url: $.createLink('api', 'createStruct', `libID=${this.libID}`)});
- if(listType === 'releases') items.push({text: getDocAppLang('createRelease'), icon: 'plus', btnType: 'primary', 'data-toggle': 'modal', url: $.createLink('api', 'createRelease', `libID=${this.libID}`)});
+ if(docAppHasPriv('createStruct') && listType === 'structs') items.push({text: getDocAppLang('createStruct'), icon: 'plus', btnType: 'primary', 'data-toggle': 'modal', 'data-size': 'lg', url: $.createLink('api', 'createStruct', `libID=${this.libID}`)});
+ if(docAppHasPriv('createRelease') && listType === 'releases') items.push({text: getDocAppLang('createRelease'), icon: 'plus', btnType: 'primary', 'data-toggle': 'modal', url: $.createLink('api', 'createRelease', `libID=${this.libID}`)});
+ if(!items.length) return null;
return {component: 'toolbar', props: {items: items}};
}
},
@@ -155,7 +170,7 @@ function getViewModeUrl(options)
}
else
{
- const params = zui.formatString('libID={libID}&moduleID={moduleID}&apiID={docID}&version={docVersion}&release={release}&browseType={filterType}¶m=0&orderBy={orderBy}&recTotal={recTotal}&recPerPage={recPerPage}&pageID={page}&mode={mode}&search={search}', options).replace('libID=0&moduleID=0&apiID=0&version=0&release=0&browseType=all¶m=0&orderBy=order_asc&recTotal=0&recPerPage=20&pageID=1&mode=&search=', '').replace('&apiID=0&version=0&release=0&browseType=all¶m=0&orderBy=order_asc&recTotal=0&recPerPage=20&pageID=1&mode=&search=', '').replace('&browseType=all¶m=0&orderBy=order_asc&recTotal=0&recPerPage=20&pageID=1&mode=&search=', '');
+ const params = zui.formatString('libID={libID}&moduleID={moduleID}&apiID={docID}&version={docVersion}&release={release}&browseType={filterType}¶ms={params}&orderBy={orderBy}&recTotal={recTotal}&recPerPage={recPerPage}&pageID={page}&mode={mode}&search={search}', options).replace('libID=0&moduleID=0&apiID=0&version=0&release=0&browseType=all¶ms=0&orderBy=order_asc&recTotal=0&recPerPage=20&pageID=1&mode=&search=', '').replace('&apiID=0&version=0&release=0&browseType=all¶ms=0&orderBy=order_asc&recTotal=0&recPerPage=20&pageID=1&mode=&search=', '').replace('&browseType=all¶ms=0&orderBy=order_asc&recTotal=0&recPerPage=20&pageID=1&mode=&search=', '');
url = $.createLink('api', 'index', params);
}
return url;
@@ -204,6 +219,35 @@ function getTableOptions(options, info)
});
}
+function getSpaceFetcher(spaceType, spaceID)
+{
+ const parts = String(spaceID).split('.');
+ const objectType = parts[0] || 'nolink';
+ const objectID = parts[1] || 0;
+ const libID = getDocApp().libID;
+ return $.createLink('api', 'ajaxGetDropMenu', `objectType=${objectType}&objectID=${objectID}&libID=${libID}`);
+}
+
+function handleClickSpaceMenu(event, value)
+{
+ event.preventDefault();
+ if($(event.target).closest('.dropmenu-nav').length) return;
+ const parts = String(value).split('.');
+ const type = parts[0];
+ const id = parts[1] || 0;
+ const docApp = getDocApp();
+ if(type === 'product' || type === 'project') docApp.selectSpace(value, '_first');
+ else docApp.selectSpace('nolink', +id);
+}
+
+function getSpaceMenuText(text, state)
+{
+ const spaceID = getDocApp().spaceID;
+ if(spaceID === 'nolink') return text;
+ const libTypeList = getDocAppLang('libTypeList');
+ return `${libTypeList[spaceID.split('.')[0]]} / ${text}`;
+}
+
/* 扩展文档应用操作按钮生成定义。 Extend the doc app action definition. */
$.extend(window.docAppActions,
{
@@ -252,6 +296,19 @@ $.extend(window.docAppCommands,
$('#docApp .doc-view form').trigger('submit');
},
+ /**
+ * 取消编辑 API 文档库。
+ * Create api lib.
+ */
+ createLib: function(_, args)
+ {
+ const docApp = getDocApp();
+ const spaceID = args[0] || docApp.spaceID;
+ const parts = String(spaceID).split('.');
+ const url = $.createLink('api', 'createLib', `type=${parts[0] || 'nolink'}&objectID=${parts[1] || 0}`);
+ zui.Modal.open({size: 'sm', url: url});
+ },
+
/**
* 加载指定的 API 文档。
* Load the specified API doc.
@@ -271,6 +328,16 @@ $.extend(window.docAppCommands,
});
},
+ /**
+ * 选择 API 文档。
+ * Select the specified API doc.
+ */
+ selectApi: function(_, args)
+ {
+ const apiID = args[0];
+ getDocApp().selectDoc(apiID);
+ },
+
/**
* 显示结构列表。
* Show the struct list.
@@ -349,17 +416,78 @@ $.extend(window.docAppCommands,
*/
updateLazyContent: function(context, args)
{
- const event = context.event;
+ const event = context.event;
const $element = $(event.currentTarget);
const selector = args[0] || $element.data('lazyTarget');
- const $lazy = (selector ? $(selector) : $element).closest('.lazy-content');
- const url = $element.data('url') || $element.attr('href');
+ const $lazy = (selector ? $(selector) : $element).closest('.lazy-content');
+ const url = $element.data('url') || $element.attr('href');
if(url) $lazy.trigger('loadContent', url);
event.preventDefault();
event.stopPropagation();
- }
+ },
+
+ /**
+ * 更新首页内容。
+ * Update the home content.
+ */
+ loadHome: function(context, args)
+ {
+ const event = context.event;
+ const $element = $(event.currentTarget);
+ const data = $element.data();
+ const type = args[0] !== undefined ? args[0] : data.type;
+ const params = args[1] !== undefined ? args[1] : data.params;
+ const recPerPage = args[2] !== undefined ? args[2] : data.recPerPage;
+ const pageID = args[3] !== undefined ? args[3] : data.pageID;
+ window.loadHome(type, params, recPerPage, pageID);
+ },
+
+ /**
+ * 显示首页菜单。
+ * Show the home item menu.
+ */
+ showHomeItemMenu: function(context, args)
+ {
+ const event = context.event;
+ const type = args[0];
+ const id = args[1];
+ const lang = getDocAppLang();
+ const items = [];
+
+ if(type === 'nolink')
+ {
+ if(docAppHasPriv('editLib')) items.push({text: lang.editLib, command: `editLib/${id}`});
+ if(docAppHasPriv('deleteLib')) items.push({text: lang.deleteLib, command: `deleteLib/${id}`});
+ }
+ else if(docAppHasPriv('createLib'))
+ {
+ items.push({text: lang.createLib, command: `createLib/${type}.${id}`});
+ }
+
+ if(items.length)
+ {
+ zui.ContextMenu.show({event: event, items: items, placement: 'bottom-end'});
+ }
+ event.preventDefault();
+ event.stopPropagation();
+ },
});
+window.loadHome = function(type, params, recPerPage, pageID)
+{
+ const location = {};
+ if(typeof type === 'object') $.extend(location, type);
+ else if(type !== undefined) location.filterType = type;
+ if(params !== undefined) location.params = params;
+ if(recPerPage !== undefined || pageID !== undefined)
+ {
+ location.pager = {};
+ if(recPerPage !== undefined) location.pager.recPerPage = recPerPage;
+ if(pageID !== undefined) location.pager.page = pageID;
+ }
+ if(Object.keys(location).length) getDocApp().switchView(location, 'home');
+};
+
/**
* 重写文档应用的配置选项方法。
* Override the method to set the doc app options.
@@ -372,10 +500,17 @@ window.setDocAppOptions = function(_, options) // Override the method.
return $.extend(options,
{
defaultState : {libReleaseMap: {}, listType: ''},
+ spaceMenuOptions : {
+ popWidth : 350,
+ onClickItem : handleClickSpaceMenu,
+ defaultValue: options.spaceID === 'nolink' ? `lib.${options.libID}`: options.spaceID,
+ display : getSpaceMenuText
+ },
customRenders : customRenders,
viewModeUrl : getViewModeUrl,
getTableOptions : getTableOptions,
getDocViewSidebarTabs: getDocViewSidebarTabs,
+ getSpaceFetcher : getSpaceFetcher,
isMatchFilter : function(type, filterType, item)
{
if(type === 'api') return (item.objectType || 'nolink').toLowerCase() === filterType.toLowerCase();
diff --git a/module/api/lang/en.php b/module/api/lang/en.php
index 4b86ea4f1b..f869ec4ec7 100644
--- a/module/api/lang/en.php
+++ b/module/api/lang/en.php
@@ -161,6 +161,9 @@ $lang->api->format = 'Format';
$lang->api->libType = 'Api Library Type';
$lang->api->product = $lang->productCommon;
$lang->api->project = $lang->projectCommon;
+$lang->api->apiTotalInfo = 'Total %d APIs';
+$lang->api->showNotEmpty = 'Show not empty';
+$lang->api->showClosed = 'Show with closed';
$lang->api->methodOptions = array(
'GET' => 'GET',
@@ -184,9 +187,9 @@ $lang->api->requestTypeOptions['application/x-www-form-urlencoded'] = 'applicati
$lang->api->requestTypeOptions['multipart/form-data'] = 'multipart/form-data';
$lang->api->libTypeList = array();
-$lang->api->libTypeList['product'] = $lang->productCommon . ' Api Library';
-$lang->api->libTypeList['project'] = $lang->projectCommon . ' Api Library';
-$lang->api->libTypeList['nolink'] = 'Independent Api Library';
+$lang->api->libTypeList['product'] = $lang->productCommon . ' API';
+$lang->api->libTypeList['project'] = $lang->projectCommon . ' API';
+$lang->api->libTypeList['nolink'] = 'Independent API';
$lang->api->statusOptions = array(
'done' => 'Done',
@@ -240,6 +243,6 @@ $lang->api->filterTypes[] = array('all', 'All');
$lang->api->filterTypes[] = array('createdByMe', 'Created by me');
$lang->api->filterTypes[] = array('editedByMe', 'Edited by me');
-$lang->api->homeFilterTypes[] = array('noLink', $lang->api->libTypeList['nolink']);
-$lang->api->homeFilterTypes[] = array('product', $lang->api->libTypeList['product']);
-$lang->api->homeFilterTypes[] = array('project', $lang->api->libTypeList['project']);
+$lang->api->homeFilterTypes['nolink'] = $lang->api->libTypeList['nolink'];
+$lang->api->homeFilterTypes['product'] = $lang->api->libTypeList['product'];
+$lang->api->homeFilterTypes['project'] = $lang->api->libTypeList['project'];
diff --git a/module/api/lang/zh-cn.php b/module/api/lang/zh-cn.php
index 3207c5f9df..13b6f9a596 100755
--- a/module/api/lang/zh-cn.php
+++ b/module/api/lang/zh-cn.php
@@ -161,6 +161,9 @@ $lang->api->format = '格式化';
$lang->api->libType = '接口库类型';
$lang->api->product = '所属' . $lang->productCommon;
$lang->api->project = '所属' . $lang->projectCommon;
+$lang->api->apiTotalInfo = '共 %d 个 API';
+$lang->api->showNotEmpty = '仅显示有接口的';
+$lang->api->showClosed = '显示包含已关闭的';
$lang->api->methodOptions = array(
'GET' => 'GET',
@@ -184,9 +187,9 @@ $lang->api->requestTypeOptions['application/x-www-form-urlencoded'] = 'applicati
$lang->api->requestTypeOptions['multipart/form-data'] = 'multipart/form-data';
$lang->api->libTypeList = array();
-$lang->api->libTypeList['product'] = $lang->productCommon . '接口库';
-$lang->api->libTypeList['project'] = $lang->projectCommon . '接口库';
-$lang->api->libTypeList['nolink'] = '独立接口库';
+$lang->api->libTypeList['product'] = $lang->productCommon . '接口';
+$lang->api->libTypeList['project'] = $lang->projectCommon . '接口';
+$lang->api->libTypeList['nolink'] = '独立接口';
$lang->api->statusOptions = array(
'done' => '开发完成',
@@ -240,6 +243,6 @@ $lang->api->filterTypes[] = array('all', '全部');
$lang->api->filterTypes[] = array('createdByMe', '我创建的');
$lang->api->filterTypes[] = array('editedByMe', '我编辑的');
-$lang->api->homeFilterTypes[] = array('noLink', $lang->api->libTypeList['nolink']);
-$lang->api->homeFilterTypes[] = array('product', $lang->api->libTypeList['product']);
-$lang->api->homeFilterTypes[] = array('project', $lang->api->libTypeList['project']);
+$lang->api->homeFilterTypes['nolink'] = $lang->api->libTypeList['nolink'];
+$lang->api->homeFilterTypes['product'] = $lang->api->libTypeList['product'];
+$lang->api->homeFilterTypes['project'] = $lang->api->libTypeList['project'];
diff --git a/module/api/model.php b/module/api/model.php
index 35263b8851..cd7521b492 100644
--- a/module/api/model.php
+++ b/module/api/model.php
@@ -903,6 +903,50 @@ class apiModel extends model
return array($normalObjects, $closedObjects);
}
+ /**
+ * 获取分组后的对象列表。
+ *
+ * @access public
+ * @return array
+ */
+ public function getGroupedObjects(): array
+ {
+ $libs = $this->loadModel('doc')->getApiLibs();
+ $libIDs = array_keys($libs);
+
+ /* 获取接口库所属产品的产品列表。 */
+ $products = $this->dao->select('t1.id, t1.order, t1.name, t1.status, t1.program')->from(TABLE_PRODUCT)->alias('t1')
+ ->leftJoin(TABLE_DOCLIB)->alias('t2')->on('t2.product=t1.id')
+ ->where('t2.id')->gt(0)
+ ->andWhere('t1.vision')->eq($this->config->vision)
+ ->andWhere('t1.deleted')->eq(0)
+ ->andWhere('t2.id')->in($libIDs)
+ ->orderBy('order_asc')
+ ->fetchAll('id');
+
+ /* 获取接口库所属项目的项目列表。 */
+ $projects = $this->dao->select('t1.id, t1.order, t1.name, t1.status, t1.parent')->from(TABLE_PROJECT)->alias('t1')
+ ->leftJoin(TABLE_DOCLIB)->alias('t2')->on('t2.project=t1.id')
+ ->where('t2.id')->gt(0)
+ ->andWhere('t1.vision')->eq($this->config->vision)
+ ->andWhere('t1.deleted')->eq(0)
+ ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->projects)->fi()
+ ->andWhere('t2.id')->in($libIDs)
+ ->orderBy('t1.hasProduct_asc, order_asc')
+ ->fetchAll('id');
+
+ $nolinks = array();
+ foreach($libs as $lib)
+ {
+ if($lib->product != 0 && isset($products[$lib->product]) && !isset($products[$lib->product]->firstLib)) $products[$lib->product]->firstLib = $lib->id;
+ if($lib->project != 0 && isset($projects[$lib->project]) && !isset($projects[$lib->project]->firstLib)) $projects[$lib->project]->firstLib = $lib->id;
+ if($lib->product != 0 || $lib->project != 0 || $lib->execution != 0) continue;
+ $nolinks[$lib->id] = $lib;
+ }
+
+ return array('product' => $products, 'project' => $projects, 'nolink' => $nolinks);
+ }
+
/**
* 获取有权限的接口文档列表。
* Get priv Apis.
diff --git a/module/api/ui/ajaxgetdropmenu.html.php b/module/api/ui/ajaxgetdropmenu.html.php
index 877893b75c..0bec4a5b46 100644
--- a/module/api/ui/ajaxgetdropmenu.html.php
+++ b/module/api/ui/ajaxgetdropmenu.html.php
@@ -10,46 +10,46 @@ declare(strict_types=1);
*/
namespace zin;
-$data = array('normal' => array(), 'closed' => array());
-$data['normal'][] = array('id' => 0, 'text' => $lang->api->noLinked, 'active' => $objectID == 0, 'type' => 'nolink');
+$data = array('nolink' => array(), 'product' => array(), 'project' => array());
-/* 处理分组数据。Process grouped data. */
-foreach(array('product', 'project') as $moduleType)
+/* 处理独立接口库。Process independent libs. */
+foreach($nolinkLibs as $lib) $data['nolink'][] = array('id' => "lib.$lib->id", 'text' => $lib->name, 'active' => $lib->id == $libID, 'type' => 'item', 'url' => createLink('api', 'index', "libID=$lib->id"));
+
+/* 处理产品和项目数据。Process product and project data. */
+foreach($products as $product)
{
- if(isset($normalObjects[$moduleType]))
+ $programID = $product->program;
+ $item = array('type' => 'product', 'id' => "product.$product->id", 'text' => $product->name, 'active' => $objectType == 'product' && $product->id == $objectID, 'url' => createLink('api', 'index', 'libID=' . (isset($product->firstLib) ? $product->firstLib : 0)));
+ if(isset($programs[$programID]))
{
- foreach($normalObjects[$moduleType] as $normalObjectID => $normalObjectName)
- {
- $item = array();
- $item['id'] = $normalObjectID;
- $item['text'] = $normalObjectName;
- $item['active'] = $normalObjectID == $objectID;
- $item['type'] = $moduleType;
- $item['keys'] = zget(common::convert2Pinyin(array($normalObjectName)), $normalObjectName, '');
-
- $data['normal'][] = $item;
- }
+ $programKey = "program.$programID";
+ $program = $programs[$programID];
+ if(!isset($data['product'][$programKey])) $data['product'][$programKey] = array('id' => $programKey, 'text' => $program->name, 'type' => 'program', 'items' => array());
+ $data['product'][$programKey]['items'][] = $item;
}
-
- if(isset($closedObjects[$moduleType]))
+ else
{
- foreach($closedObjects[$moduleType] as $closedObjectID => $closedObjectName)
- {
- $item = array();
- $item['id'] = $closedObjectID;
- $item['text'] = $closedObjectName;
- $item['active'] = $closedObjectID == $objectID;
- $item['type'] = $moduleType;
- $item['keys'] = zget(common::convert2Pinyin(array($closedObjectName)), $closedObjectName, '');
-
- $data['closed'][] = $item;
- }
+ $data['product'][$product->id] = $item;
}
}
-
-$tabs = array();
-$tabs[] = array('name' => 'normal', 'text' => '');
-$tabs[] = array('name' => 'closed', 'text' => $lang->doc->closed);
+foreach($projects as $project)
+{
+ $programID = $project->parent;
+ $item = array('type' => 'project', 'id' => "project.$project->id", 'text' => $project->name, 'active' => $objectType == 'project' && $project->id == $objectID, 'url' => createLink('api', 'index', 'libID=' . (isset($project->firstLib) ? $project->firstLib : 0)));
+ if(isset($programs[$programID]))
+ {
+ $programKey = "program.$programID";
+ $program = $programs[$programID];
+ if(!isset($data['project'][$programKey])) $data['project'][$programKey] = array('id' => $programKey, 'text' => $program->name, 'type' => 'program', 'items' => array());
+ $data['project'][$programKey]['items'][] = $item;
+ }
+ else
+ {
+ $data['project'][$project->id] = $item;
+ }
+}
+$data['product'] = array_values($data['product']);
+$data['project'] = array_values($data['project']);
/**
* 定义最终的 JSON 数据。
@@ -57,13 +57,20 @@ $tabs[] = array('name' => 'closed', 'text' => $lang->doc->closed);
*/
$link = $this->createLink('api', 'ajaxGetList', "objectID={id}&objectType={type}");
+$tabs = array();
+$tabs[] = array('name' => 'nolink', 'text' => $lang->api->libTypeList['nolink']);
+$tabs[] = array('name' => 'product', 'text' => $lang->api->libTypeList['product']);
+$tabs[] = array('name' => 'project', 'text' => $lang->api->libTypeList['project']);
+
$json = array();
-$json['data'] = $data;
-$json['tabs'] = $tabs;
-$json['searchHint'] = $lang->searchAB;
$json['link'] = $link;
-$json['itemType'] = 'api';
-$json['expandName'] = 'closed';
+$json['data'] = $data;
+$json['tabs'] = $tabs;
+$json['searchHint'] = $lang->searchAB;
+$json['labelMap'] = array('program' => $lang->program->common);
+$json['itemType'] = 'lib';
+$json['typeIconMap'] = array('lib' => 'doclib');
+$json['debug'] = array('libID' => $libID, 'objectType' => $objectType, 'objectID' => $objectID);
/**
* 渲染 JSON 字符串并发送到客户端。
diff --git a/module/api/ui/ajaxgethome.html.php b/module/api/ui/ajaxgethome.html.php
new file mode 100644
index 0000000000..9d5082ee4e
--- /dev/null
+++ b/module/api/ui/ajaxgethome.html.php
@@ -0,0 +1,196 @@
+
+ * @package api
+ * @link https://www.zentao.net
+ */
+namespace zin;
+
+$libColors = array('var(--color-secondary-500)', 'var(--color-primary-500)', 'var(--color-warning-500)', 'var(--color-success-500)', 'var(--color-special-500)');
+$isNolink = $type == 'nolink';
+$isEmpty = $isNolink ? empty($libs) : empty($programs);
+$canCreateLib = hasPriv('api', 'createLib');
+$canEditLib = hasPriv('api', 'editLib');
+$canDeleteLib = hasPriv('api', 'deleteLib');
+$showLibAction = $isNolink ? ($canEditLib || $canDeleteLib) : $canCreateLib;
+
+/* Create load home command statement. */
+$createCommand = function(array $args) use($pager, $type, $unclosed, $notempty)
+{
+ $args = array_merge(array('type' => $type, 'unclosed' => $unclosed, 'notempty' => $notempty, 'recPerPage' => $pager->recPerPage, 'pageID' => $pager->pageID), $args);
+ $parts = array('loadHome');
+ $parts[] = $args['type'];
+ $params = array();
+ if($args['notempty']) $params[] = 'notempty';
+ if($args['unclosed']) $params[] = 'unclosed';
+ $parts[] = implode('_', $params);
+ $parts[] = $args['recPerPage'];
+ $parts[] = $args['pageID'];
+ return implode('/', $parts);
+};
+
+$buildLibItem = function(int $id, string $name, int $count = 0) use ($libColors, $type, $isNolink, $showLibAction, $lang)
+{
+ return div
+ (
+ setClass('doc-space-card-lib px-2 w-1/5 group'),
+ setKey($id),
+ div
+ (
+ setClass('canvas border rounded py-2 px-3 col gap-1 hover:shadow-lg hover:border-primary relative cursor-pointer'),
+ set('zui-command', $isNolink ? "selectSpace/nolink/$id" : "selectSpace/$type.$id/_first"),
+ icon($isNolink ? 'doclib' : $type, setClass('text-2xl'), $isNolink ? setStyle('color', $libColors[$id % count($libColors)]) : setClass('text-gray')),
+ div(setClass('font-bold text-clip'), set::title($name), $name),
+ div(setClass('text-gray text-sm'), $count ? sprintf($lang->api->apiTotalInfo, $count) : $lang->api->noApi),
+ $showLibAction ? div
+ (
+ setClass('toolbar absolute top-1 right-1 opacity-0 group-hover:opacity-100'),
+ btn
+ (
+ setClass('doc-space-lib-btn'),
+ set('zui-command', "showHomeItemMenu/$type/$id"),
+ set::icon('ellipsis-v'),
+ set::size('sm'),
+ set::type('ghost')
+ )
+ ) : null
+ )
+ );
+};
+
+$buildProgramItem = function($program) use ($type, $buildLibItem)
+{
+ $items = array();
+ if($type === 'product' && !empty($program->products))
+ {
+ foreach($program->products as $product) $items[] = $buildLibItem($product->id, $product->name, isset($product->apiCount) ? $product->apiCount : 0);
+ }
+ if($type === 'project' && !empty($program->projects))
+ {
+ foreach($program->projects as $project) $items[] = $buildLibItem($project->id, $project->name, isset($project->apiCount) ? $project->apiCount : 0);
+ }
+ return div
+ (
+ setClass('doc-space-card ring rounded surface-light'),
+ setKey($program->id),
+ div
+ (
+ setClass('row items-center justify-between gap-2 px-2.5 py-1 border-b'),
+ div
+ (
+ setClass('row items-center gap-2 flex-none cursor-pointer hover:text-primary'),
+ setClass('row items-center gap-2 flex-none cursor-pointer hover:text-primary'),
+ icon('program', setClass('text-gray flex-none')),
+ div(setClass('min-w-0 flex-auto'), strong($program->name)),
+ )
+ ),
+ div
+ (
+ setClass('doc-space-card-libs py-3 px-1.5'),
+ div
+ (
+ setClass('row'),
+ $items
+ )
+ )
+ );
+};
+
+$filterItems = array();
+foreach($lang->api->homeFilterTypes as $key => $text)
+{
+ $item = array('text' => $text, 'zui-command' => $createCommand(array('type' => $key)));
+ if($key === $type)
+ {
+ $count = $isNolink ? count($libs) : count($programs);
+ $item['active'] = true;
+ $item['badge'] = wg(label(setClass('size-sm canvas ring-0 rounded-md'), $count));
+ }
+ $filterItems[] = $item;
+}
+
+div
+(
+ setKey('header'),
+ setClass('doc-app-header flex-none surface-light row items-center border-b py-1 pl-1 h-10 pr-2 gap-3 flex-none'),
+ nav
+ (
+ setClass('ml-2'),
+ set::compact(),
+ set::items($filterItems)
+ ),
+ checkbox(set::name('notempty'), set::text($lang->api->showNotEmpty), set::checked($notempty)),
+ $type !== 'nolink' ? checkbox(set::name('showclosed'), set::text($lang->api->showClosed), set::checked(!$unclosed)) : null,
+ div(setClass('flex-auto')),
+ (!$isEmpty && $canCreateLib) ? btn
+ (
+ set::icon('plus'),
+ set::type('primary'),
+ set::size('md'),
+ set::text($lang->api->createLib),
+ set('zui-command', "createLib/$type")
+ ) : null,
+ on::change('[type=checkbox]')
+ ->const('notempty', jsRaw('$this.closest(".doc-app-header").find("[name=notempty]:checked").length'))
+ ->const('showclosed', jsRaw('$this.closest(".doc-app-header").find("[name=showclosed]:checked").length'))
+ ->call('loadHome', $type, jsRaw('[notempty ? "notempty" : "", showclosed ? "" : "unclosed"].join("_")'))
+);
+
+$views = array();
+if($isEmpty)
+{
+ $views = div
+ (
+ setKey('empty'),
+ setClass('doc-app-empty h-full center gap-4'),
+ div(setClass('text-gray'), $lang->api->noLib),
+ $canCreateLib ? btn
+ (
+ set::icon('plus'),
+ set::type('primary'),
+ set::text($lang->api->createLib),
+ set('zui-command', "createLib/$type")
+ ) : null
+ );
+}
+elseif($type === 'nolink')
+{
+ foreach($libs as $lib) $views[] = $buildLibItem($lib->id, $lib->name, isset($lib->apiCount) ? $lib->apiCount : 0);
+ $views = div
+ (
+ setClass('doc-space-card-libs'),
+ setStyle('margin', '0 -8px'),
+ div(setClass('row'), $views)
+ );
+}
+else
+{
+ foreach($programs as $program) $views[] = $buildProgramItem($program);
+}
+
+div
+(
+ setKey('body'),
+ setClass('doc-app-body flex-auto min-h-0 col gap-4 p-4 items-stretch overflow-auto scrollbar-hover no-morph'),
+ $views
+);
+
+if(!$isEmpty)
+{
+ div
+ (
+ setKey('footer'),
+ setClass('doc-app-footer surface-light row items-center border-t py-1.5 px-2'),
+ div(setClass('flex-auto')),
+ pager
+ (
+ set(usePager()),
+ set::useState(),
+ set::onChangePageInfo(jsRaw('(info, event) => {event.preventDefault(); window.loadHome({pager: {recPerPage: info.recPerPage, page: info.page}});}'))
+ )
+ );
+}
diff --git a/module/api/ui/index.html.php b/module/api/ui/index.html.php
index 8dad4402d3..9cda80a4ee 100644
--- a/module/api/ui/index.html.php
+++ b/module/api/ui/index.html.php
@@ -12,7 +12,7 @@ namespace zin;
$privs = array();
$privs['collect'] = 'no';
-$privs['create'] = hasPriv('api', 'create');
+$privs['createApi'] = hasPriv('api', 'create');
$privs['edit'] = hasPriv('api', 'edit');
$privs['delete'] = hasPriv('api', 'delete');
$privs['createLib'] = hasPriv('api', 'createLib');
@@ -20,29 +20,17 @@ $privs['editLib'] = hasPriv('api', 'editLib');
$privs['moveLib'] = hasPriv('api', 'moveLib');
$privs['sortDoclib'] = hasPriv('doc', 'sortDoclib');
$privs['deleteLib'] = hasPriv('api', 'deleteLib');
+$privs['createStruct'] = hasPriv('api', 'createStruct');
+$privs['createRelease']= hasPriv('api', 'createRelease');
$privs['addModule'] = hasPriv('doc', 'addCatalog');
$privs['deleteModule'] = hasPriv('doc', 'deleteCatalog');
$privs['editModule'] = hasPriv('doc', 'editCatalog');
$privs['sortModule'] = hasPriv('doc', 'sortCatalog');
-$langData = array();
-$langData['filterTypes'] = $lang->api->filterTypes;
-$langData['spaceFilterTypes'] = $lang->api->homeFilterTypes;
-$langData['createLib'] = $lang->api->createLib;
-$langData['createDoc'] = $lang->api->createApi;
-$langData['struct'] = $lang->api->struct;
-$langData['releases'] = $lang->api->releases;
-$langData['module'] = $lang->api->module;
-$langData['noDocs'] = $lang->api->noApi;
-$langData['version'] = $lang->api->version;
-$langData['defaultVersion'] = $lang->api->defaultVersion;
-$langData['createStruct'] = $lang->api->createStruct;
-$langData['createRelease'] = $lang->api->createRelease;
-$langData['save'] = $lang->save;
-
docApp
(
set::spaceType('api'),
+ set::spaceID($objectType == 'nolink' ? 'nolink' : "$objectType.$objectID"),
set::mode($mode),
set::pager(array('recTotal' => $recTotal, 'recPerPage' => $recPerPage, 'page' => $pageID)),
set::privs($privs),
@@ -50,9 +38,8 @@ docApp
set::fetcher(createLink('api', 'ajaxGetData', 'spaceID={spaceID}&picks={picks}')),
set::docFetcher(null),
set::libSummariesFetcher(null),
- set::fetchOnChangeSpace(false),
set::maxHomeLibsOfSpace(0),
- set::langData($langData),
+ set::params($params),
set::autoSelectLib(),
set('$options', jsRaw('window.setDocAppOptions'))
);
diff --git a/module/block/js/assigntomeblock.ui.js b/module/block/js/assigntomeblock.ui.js
index 84577319d0..41da6c628a 100644
--- a/module/block/js/assigntomeblock.ui.js
+++ b/module/block/js/assigntomeblock.ui.js
@@ -59,6 +59,8 @@ window.renderCell = function(result, info)
result[0] = {html: '' + info.row.data.title + ''};
}
+ if(info.col.name == 'title' && info.row.data.module == 'attend') result[0] = {html: '' + result[0].props.children + ''};
+
return result;
}
diff --git a/module/common/lang/de.php b/module/common/lang/de.php
index 8be3674daf..aad6a05a95 100644
--- a/module/common/lang/de.php
+++ b/module/common/lang/de.php
@@ -427,11 +427,9 @@ $lang->devops->dblist = 'Database';
$lang->devops->domain = 'Domain';
$lang->devops->oss = 'Oss';
$lang->devops->host = 'Host';
-$lang->devops->account = 'Account';
$lang->devops->serverroom = 'IDC';
$lang->devops->deploy = 'Deploy';
$lang->devops->provider = 'IDC Provider';
-$lang->devops->cpuBrand = 'CPU Brand';
$lang->devops->city = 'IDC Location';
$lang->devops->os = 'OS Version';
$lang->devops->stage = 'Stage';
diff --git a/module/common/lang/en.php b/module/common/lang/en.php
index 67637d3914..ac7fff3726 100644
--- a/module/common/lang/en.php
+++ b/module/common/lang/en.php
@@ -427,11 +427,9 @@ $lang->devops->dblist = 'Database';
$lang->devops->domain = 'Domain';
$lang->devops->oss = 'Oss';
$lang->devops->host = 'Host';
-$lang->devops->account = 'Account';
$lang->devops->serverroom = 'IDC';
$lang->devops->deploy = 'Deploy';
$lang->devops->provider = 'IDC Provider';
-$lang->devops->cpuBrand = 'CPU Brand';
$lang->devops->city = 'IDC Location';
$lang->devops->os = 'OS Version';
$lang->devops->stage = 'Stage';
diff --git a/module/common/lang/fr.php b/module/common/lang/fr.php
index a17e3bfba0..ecc2abd027 100644
--- a/module/common/lang/fr.php
+++ b/module/common/lang/fr.php
@@ -427,11 +427,9 @@ $lang->devops->dblist = 'Database';
$lang->devops->domain = 'Domain';
$lang->devops->oss = 'Oss';
$lang->devops->host = 'Host';
-$lang->devops->account = 'Account';
$lang->devops->serverroom = 'IDC';
$lang->devops->deploy = 'Deploy';
$lang->devops->provider = 'IDC Provider';
-$lang->devops->cpuBrand = 'CPU Brand';
$lang->devops->city = 'IDC Location';
$lang->devops->os = 'OS Version';
$lang->devops->stage = 'Stage';
diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php
index d380591c5d..069e97f532 100644
--- a/module/common/lang/zh-cn.php
+++ b/module/common/lang/zh-cn.php
@@ -427,11 +427,9 @@ $lang->devops->dblist = '数据库';
$lang->devops->domain = '域名';
$lang->devops->oss = '对象存储';
$lang->devops->host = '主机';
-$lang->devops->account = '账号';
$lang->devops->serverroom = '机房';
$lang->devops->deploy = '上线';
$lang->devops->provider = '服务商';
-$lang->devops->cpuBrand = 'CPU品牌';
$lang->devops->city = '城市';
$lang->devops->os = '系统版本';
$lang->devops->stage = '阶段';
diff --git a/module/common/lang/zh-tw.php b/module/common/lang/zh-tw.php
index b31cadf9f5..d4b6c9ad77 100644
--- a/module/common/lang/zh-tw.php
+++ b/module/common/lang/zh-tw.php
@@ -293,10 +293,8 @@ $lang->devops->dblist = '数据库';
$lang->devops->domain = '域名';
$lang->devops->oss = '对象存储';
$lang->devops->host = '主机';
-$lang->devops->account = '账号';
$lang->devops->serverroom = '机房';
$lang->devops->provider = '服务商';
-$lang->devops->cpuBrand = 'CPU品牌';
$lang->devops->city = '城市';
$lang->devops->os = '系统版本';
diff --git a/module/doc/control.php b/module/doc/control.php
index 9837438905..7d6e4fa940 100755
--- a/module/doc/control.php
+++ b/module/doc/control.php
@@ -944,31 +944,41 @@ class doc extends control
* 文档详情页面。
* Document details page.
*
- * @param int $docID
- * @param int $version
+ * @param string|int $docID
+ * @param int $version
* @access public
* @return void
*/
- public function view(int $docID = 0, int $version = 0)
+ public function view(string|int $docID = 0, int $version = 0)
{
- $doc = $this->doc->getByID($docID, $version, true);
+ $isApi = is_string($docID) && strpos($docID, 'api.') === 0;
+ $docID = $isApi ? (int)str_replace('api.', '', $docID) : (int)$docID;
+ $doc = $isApi ? $this->loadModel('api')->getByID($docID, $version) : $this->doc->getByID($docID, $version, true);
if(!$doc || !isset($doc->id))
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found'));
return $this->sendError($this->lang->notFound, $this->inlink('index'));
}
- if(!$this->doc->checkPrivDoc($doc)) return $this->sendError($this->lang->doc->accessDenied, inlink('index'));
-
- $lib = $this->doc->getLibByID((int)$doc->lib);
+ if(!$isApi && !$this->doc->checkPrivDoc($doc)) return $this->sendError($this->lang->doc->accessDenied, inlink('index'));
+ $lib = $this->doc->getLibByID((int)$doc->lib);
$objectType = $lib->type;
- $objectID = $this->doc->getObjectIDByLib($lib, $objectType);
+ if($objectType == 'api')
+ {
+ if(isset($lib->product) && $lib->product) list($objectType, $objectID) = array('product', $lib->product);
+ if(isset($lib->project) && $lib->project) list($objectType, $objectID) = array('project', $lib->project);
+ }
+ else
+ {
+ $objectID = $this->doc->getObjectIDByLib($lib, $objectType);
+ }
/* Get doc. */
if($docID) $this->doc->createAction($docID, 'view');
$this->view->title = $doc->title;
$docParam = $version ? ($docID . '_' . $version) : $docID;
+ if($isApi) $docParam = 'api.' . $docParam;
echo $this->fetch('doc', 'app', "type=$objectType&spaceID=$objectID&libID=$lib->id&moduleID=$doc->module&docID=$docParam&mode=view");
}
@@ -1419,8 +1429,8 @@ class doc extends control
$this->doc->moveLib($libID, $data);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
-
- return $this->docZen->responseAfterMove($this->post->space, $libID);
+ $spaceTypeChanged = $spaceType != $lib->type;
+ return $this->docZen->responseAfterMove($this->post->space, $libID, 0, $spaceTypeChanged);
}
$this->docZen->setAclForCreateLib($spaceType);
@@ -1476,7 +1486,8 @@ class doc extends control
$this->action->logHistory($actionID, $changes);
}
- return $this->docZen->responseAfterMove($this->post->space, $data->lib, $docID);
+ $spaceTypeChanged = $spaceType != $lib->type;
+ return $this->docZen->responseAfterMove($this->post->space, $data->lib, $docID, $spaceTypeChanged);
}
$projects = $this->loadModel('project')->getPairsByProgram(0, 'all', false, 'order_asc');
@@ -1674,13 +1685,15 @@ class doc extends control
if(isset($this->lang->doc->menu->{$menuType})) $this->lang->doc->menu->{$menuType}['alias'] .= ',' . $this->app->rawMethod;
$docVersion = 0;
+ $isApi = is_string($docID) && strpos($docID, 'api.') === 0;
+ if($isApi) $docID = str_replace('api.', '', $docID);
if(is_string($docID) && strpos($docID, '_') !== false) list($docID, $docVersion) = explode('_', $docID);
$this->view->type = $type;
$this->view->spaceID = $spaceID;
$this->view->libID = $libID;
$this->view->moduleID = $moduleID;
- $this->view->docID = (int)$docID;
+ $this->view->docID = $isApi ? "api.$docID" : (int)$docID;
$this->view->docVersion = (int)$docVersion;
$this->view->mode = $mode;
$this->view->filterType = $filterType;
@@ -1767,13 +1780,21 @@ class doc extends control
* Ajax: Get doc data.
* Ajax: 获取文档数据。
*
- * @param int $docID
+ * @param string|int $docID
* @param int $version
* @access public
* @return void
*/
- public function ajaxGetDoc(int $docID, int $version = 0, $details = 'no')
+ public function ajaxGetDoc(string|int $docID, int $version = 0, $details = 'no')
{
+ if(is_string($docID) && strpos($docID, 'api.') === 0)
+ {
+ $apiID = (int)str_replace('api.', '', $docID);
+ echo $this->fetch('api', 'ajaxGetApi', "apiID=$apiID&version=$version");
+ return;
+ }
+
+ $docID = (int)$docID;
$doc = $this->doc->getByID($docID, $version);
$doc->lib = (int)$doc->lib;
$doc->module = (int)$doc->module;
diff --git a/module/doc/lang/de.php b/module/doc/lang/de.php
index 1306392631..4bf4218d94 100644
--- a/module/doc/lang/de.php
+++ b/module/doc/lang/de.php
@@ -607,6 +607,16 @@ $lang->doc->docLang->docTitlePlaceholder = 'Enter the document title';
$lang->doc->docLang->noDataYet = 'No data yet';
$lang->doc->docLang->position = $lang->doc->position;
$lang->doc->docLang->relateObject = 'Related Objects';
+$lang->doc->docLang->showNoDocProduct = 'Show products without doc';
+$lang->doc->docLang->showNoDocProject = 'Show projects without doc';
+$lang->doc->docLang->showClosedProduct = 'Show closed products';
+$lang->doc->docLang->showClosedProject = 'Show closed projects';
+$lang->doc->docLang->noProducts = 'No products';
+$lang->doc->docLang->noProjects = 'No projects';
+$lang->doc->docLang->productMine = 'My responsibility';
+$lang->doc->docLang->projectMine = 'My participation';
+$lang->doc->docLang->productOther = 'Other';
+$lang->doc->docLang->projectOther = 'Other';
$lang->docTemplate->moduleName = array();
$lang->docTemplate->moduleName['plan'] = 'plan';
diff --git a/module/doc/lang/en.php b/module/doc/lang/en.php
index 149ffb0cf2..5a14f37ace 100644
--- a/module/doc/lang/en.php
+++ b/module/doc/lang/en.php
@@ -497,6 +497,7 @@ $lang->doc->docLang = new stdClass();
$lang->doc->docLang->cancel = $lang->cancel;
$lang->doc->docLang->export = $lang->export;
$lang->doc->docLang->settings = $lang->settings;
+$lang->doc->docLang->save = $lang->save;
$lang->doc->docLang->createSpace = $lang->doc->createSpace;
$lang->doc->docLang->createLib = $lang->doc->createLib;
$lang->doc->docLang->actions = $lang->doc->libDropdown;
@@ -607,6 +608,16 @@ $lang->doc->docLang->docTitlePlaceholder = 'Enter the document title';
$lang->doc->docLang->noDataYet = 'No data yet';
$lang->doc->docLang->position = $lang->doc->position;
$lang->doc->docLang->relateObject = 'Related Objects';
+$lang->doc->docLang->showNoDocProduct = 'Show products without doc';
+$lang->doc->docLang->showNoDocProject = 'Show projects without doc';
+$lang->doc->docLang->showClosedProduct = 'Show closed products';
+$lang->doc->docLang->showClosedProject = 'Show closed projects';
+$lang->doc->docLang->noProducts = 'No products';
+$lang->doc->docLang->noProjects = 'No projects';
+$lang->doc->docLang->productMine = 'My responsibility';
+$lang->doc->docLang->projectMine = 'My participation';
+$lang->doc->docLang->productOther = 'Other';
+$lang->doc->docLang->projectOther = 'Other';
$lang->docTemplate->moduleName = array();
$lang->docTemplate->moduleName['plan'] = 'plan';
diff --git a/module/doc/lang/fr.php b/module/doc/lang/fr.php
index 2dc9d06bdb..c808c20a32 100644
--- a/module/doc/lang/fr.php
+++ b/module/doc/lang/fr.php
@@ -607,6 +607,16 @@ $lang->doc->docLang->docTitlePlaceholder = 'Enter the document title';
$lang->doc->docLang->noDataYet = 'No data yet';
$lang->doc->docLang->position = $lang->doc->position;
$lang->doc->docLang->relateObject = 'Related Objects';
+$lang->doc->docLang->showNoDocProduct = 'Show products without doc';
+$lang->doc->docLang->showNoDocProject = 'Show projects without doc';
+$lang->doc->docLang->showClosedProduct = 'Show closed products';
+$lang->doc->docLang->showClosedProject = 'Show closed projects';
+$lang->doc->docLang->noProducts = 'No products';
+$lang->doc->docLang->noProjects = 'No projects';
+$lang->doc->docLang->productMine = 'My responsibility';
+$lang->doc->docLang->projectMine = 'My participation';
+$lang->doc->docLang->productOther = 'Other';
+$lang->doc->docLang->projectOther = 'Other';
$lang->docTemplate->moduleName = array();
$lang->docTemplate->moduleName['plan'] = 'plan';
diff --git a/module/doc/lang/zh-cn.php b/module/doc/lang/zh-cn.php
index a353d0c6e6..73b219333c 100644
--- a/module/doc/lang/zh-cn.php
+++ b/module/doc/lang/zh-cn.php
@@ -497,6 +497,7 @@ $lang->doc->docLang = new stdClass();
$lang->doc->docLang->cancel = $lang->cancel;
$lang->doc->docLang->export = $lang->export;
$lang->doc->docLang->settings = $lang->settings;
+$lang->doc->docLang->save = $lang->save;
$lang->doc->docLang->createSpace = $lang->doc->createSpace;
$lang->doc->docLang->createLib = $lang->doc->createLib;
$lang->doc->docLang->actions = $lang->doc->libDropdown;
@@ -607,6 +608,16 @@ $lang->doc->docLang->docTitlePlaceholder = '请输入文档标题';
$lang->doc->docLang->noDataYet = '暂无数据';
$lang->doc->docLang->position = $lang->doc->position;
$lang->doc->docLang->relateObject = '关联对象';
+$lang->doc->docLang->showNoDocProduct = '显示无文档的产品';
+$lang->doc->docLang->showNoDocProject = '显示无文档的项目';
+$lang->doc->docLang->showClosedProduct = '显示已关闭的产品';
+$lang->doc->docLang->showClosedProject = '显示已关闭的项目';
+$lang->doc->docLang->noProducts = '没有产品';
+$lang->doc->docLang->noProjects = '没有项目';
+$lang->doc->docLang->productMine = '我负责的';
+$lang->doc->docLang->projectMine = '我参与的';
+$lang->doc->docLang->productOther = '其他';
+$lang->doc->docLang->projectOther = '其他';
$lang->docTemplate->moduleName = array();
$lang->docTemplate->moduleName['plan'] = '计划';
diff --git a/module/doc/model.php b/module/doc/model.php
index e0b9bbaea3..9d001f9928 100644
--- a/module/doc/model.php
+++ b/module/doc/model.php
@@ -781,6 +781,18 @@ class docModel extends model
$docs = $this->processCollector($docs);
$docs = $this->filterPrivDocs($docs, $spaceType);
+ $apis = $this->loadModel('api')->getApiListBySearch(0, 0, '', $libs);
+ foreach($apis as &$api)
+ {
+ $api->id = "api.$api->id";
+ $api->lib = (int)$api->lib;
+ $api->module = (int)$api->module;
+ $api->deleted = boolval($api->deleted);
+ $api->originTitle = $api->title;
+ $api->icon = "api is-$api->method";
+ $api->title = "$api->method $api->path $api->title";
+ }
+
foreach($docs as &$doc)
{
$doc->lib = (int)$doc->lib;
@@ -791,6 +803,8 @@ class docModel extends model
unset($doc->draft);
}
+ $docs = $docs + $apis;
+
return $docs;
}
diff --git a/module/doc/ui/app.html.php b/module/doc/ui/app.html.php
index 0599d5763e..4150d8b69a 100644
--- a/module/doc/ui/app.html.php
+++ b/module/doc/ui/app.html.php
@@ -51,6 +51,10 @@ $privs['sortModule'] = hasPriv('doc', 'sortCatalog');
$privs['sortDoclib'] = hasPriv('doc', 'sortDoclib');
$privs['sortDoc'] = hasPriv('doc', 'sortDoc');
$privs['batchMoveDoc'] = hasPriv('doc', 'batchMoveDoc');
+$privs['createApi'] = hasPriv('api', 'create');
+$privs['editApi'] = hasPriv('api', 'edit');
+$privs['createStruct'] = hasPriv('api', 'createStruct');
+$privs['createRelease']= hasPriv('api', 'createRelease');
$privs['createOffice'] = true;
$homeName = false;
diff --git a/module/doc/ui/createlib.html.php b/module/doc/ui/createlib.html.php
index c1df926c95..a48101642d 100644
--- a/module/doc/ui/createlib.html.php
+++ b/module/doc/ui/createlib.html.php
@@ -124,6 +124,22 @@ formPanel
)
),
formRow
+ (
+ setID('orderBox'),
+ formGroup
+ (
+ set::label($lang->doclib->defaultOrder),
+ set::width('5/6'),
+ radioList
+ (
+ set::name('orderBy'),
+ set::items($lang->doclib->idOrder),
+ set::value('id_asc'),
+ set::inline(true)
+ )
+ )
+ ),
+ formRow
(
setClass('apilib hidden'),
formGroup
@@ -151,22 +167,6 @@ formPanel
)
),
formRow
- (
- setID('orderBox'),
- formGroup
- (
- set::label($lang->doclib->defaultOrder),
- set::width('5/6'),
- radioList
- (
- set::name('orderBy'),
- set::items($lang->doclib->idOrder),
- set::value('id_asc'),
- set::inline(true)
- )
- )
- ),
- formRow
(
setID('whiteListBox'),
setClass('hidden'),
diff --git a/module/doc/ui/setdocbasic.html.php b/module/doc/ui/setdocbasic.html.php
index 96d5ab369f..073ab19644 100644
--- a/module/doc/ui/setdocbasic.html.php
+++ b/module/doc/ui/setdocbasic.html.php
@@ -79,14 +79,15 @@ formPanel
set::label($lang->doc->module),
picker(set::name('module'), set::items($optionMenu), set::value($moduleID), set::required(true))
),
- $isDraft ? null : formGroup
- (
- set::label($lang->doc->mailto),
- mailto(
- set::items($users),
- set::value(isset($doc) ? $doc->mailto : null)
+ (!$isDraft && $objectType !== 'mine')
+ ? formGroup(
+ set::label($lang->doc->mailto),
+ mailto(
+ set::items($users),
+ set::value(isset($doc) ? $doc->mailto : null)
+ )
)
- ),
+ : null,
$isDraft ? null : formGroup
(
set::label($lang->doclib->control),
diff --git a/module/doc/zen.php b/module/doc/zen.php
index 43d248d84e..05358ebb62 100644
--- a/module/doc/zen.php
+++ b/module/doc/zen.php
@@ -424,16 +424,33 @@ class docZen extends doc
* @param string $space
* @param int $libID
* @param int $docID
+ * @param bool $spaceTypeChanged
*
* @access protected
* @return void
*/
- protected function responseAfterMove(string $space, int $libID = 0, int $docID = 0)
+ protected function responseAfterMove(string $space, int $libID = 0, int $docID = 0, bool $spaceTypeChanged = false)
{
- $spaceID = (int)(explode('.', $space)[1]);
- if($docID) $docAppAction = array('executeCommand', 'handleMovedDoc', array($docID, $space, $libID));
- else $docAppAction = array('selectSpace', $spaceID, $libID);
- return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'docApp' => $docAppAction));
+ list($spaceType, $spaceID) = explode('.', $space);
+ if($docID)
+ {
+ $docAppAction = array('executeCommand', 'handleMovedDoc', array($docID, $spaceID, $libID));
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'docApp' => $docAppAction));
+ }
+
+ if($spaceTypeChanged)
+ {
+ if($spaceType == 'mine') $locateLink = $this->createLink('doc', 'mySpace', "objectID={$spaceID}&libID={$libID}");
+ elseif($spaceType == 'custom') $locateLink = $this->createLink('doc', 'teamSpace', "objectID={$spaceID}&libID={$libID}");
+ elseif($spaceType == 'product') $locateLink = $this->createLink('doc', 'productSpace', "objectID={$spaceID}&libID={$libID}");
+ elseif($spaceType == 'project') $locateLink = $this->createLink('doc', 'projectSpace', "objectID={$spaceID}&libID={$libID}");
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'load' => $locateLink));
+ }
+ else
+ {
+ $docAppAction = array('selectSpace', $spaceID, $libID);
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true, 'docApp' => $docAppAction));
+ }
}
/**
diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php
index 7af829762c..4bf9d6fdc5 100644
--- a/module/group/lang/resource.php
+++ b/module/group/lang/resource.php
@@ -1469,19 +1469,6 @@ $lang->job->methodOrder[25] = 'exec';
$lang->job->methodOrder[30] = 'view';
$lang->job->methodOrder[35] = 'trigger';
-$lang->resource->account = new stdclass();
-$lang->resource->account->browse = 'browse';
-$lang->resource->account->create = 'create';
-$lang->resource->account->edit = 'editAction';
-$lang->resource->account->delete = 'deleteAction';
-$lang->resource->account->view = 'view';
-
-$lang->account->methodOrder[0] = 'browse';
-$lang->account->methodOrder[5] = 'create';
-$lang->account->methodOrder[10] = 'edit';
-$lang->account->methodOrder[15] = 'delete';
-$lang->account->methodOrder[20] = 'view';
-
$lang->resource->serverroom = new stdclass();
$lang->resource->serverroom->browse = 'browse';
$lang->resource->serverroom->create = 'create';
@@ -1510,7 +1497,6 @@ $lang->resource->system->ossview = 'ossView';
$lang->resource->ops = new stdclass();
$lang->resource->ops->provider = 'provider';
$lang->resource->ops->city = 'city';
-$lang->resource->ops->cpubrand = 'cpuBrand';
$lang->resource->ops->os = 'os';
/* Doc. */
diff --git a/module/group/packagemanager.php b/module/group/packagemanager.php
index 0ee9f9dc79..a4febd8c23 100644
--- a/module/group/packagemanager.php
+++ b/module/group/packagemanager.php
@@ -1759,16 +1759,6 @@ $config->group->package->serverRoom->privs['serverroom-edit'] = array('edition
$config->group->package->serverRoom->privs['serverroom-view'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 1, 'depend' => array('serverroom-browse'), 'recommend' => array('serverroom-create', 'serverroom-edit'));
$config->group->package->serverRoom->privs['serverroom-delete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 4, 'depend' => array('serverroom-browse'), 'recommend' => array('serverroom-create', 'serverroom-edit'));
-$config->group->package->account = new stdclass();
-$config->group->package->account->order = 2260;
-$config->group->package->account->subset = 'ops';
-$config->group->package->account->privs = array();
-$config->group->package->account->privs['account-browse'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 0, 'depend' => array(), 'recommend' => array('account-create', 'account-edit', 'account-view'));
-$config->group->package->account->privs['account-create'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 2, 'depend' => array('account-browse'), 'recommend' => array('account-edit'));
-$config->group->package->account->privs['account-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 3, 'depend' => array('account-browse'), 'recommend' => array('account-create'));
-$config->group->package->account->privs['account-view'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 1, 'depend' => array('account-browse'), 'recommend' => array('account-create', 'account-edit'));
-$config->group->package->account->privs['account-delete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 4, 'depend' => array('account-browse'), 'recommend' => array('account-create', 'account-edit'));
-
$config->group->package->domain = new stdclass();
$config->group->package->domain->order = 2270;
$config->group->package->domain->subset = 'ops';
@@ -3955,12 +3945,6 @@ $config->group->package->manageCity->subset = 'ops';
$config->group->package->manageCity->privs = array();
$config->group->package->manageCity->privs['ops-city'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 25, 'depend' => array(), 'recommend' => array());
-$config->group->package->manageCPU = new stdclass();
-$config->group->package->manageCPU->order = 2340;
-$config->group->package->manageCPU->subset = 'ops';
-$config->group->package->manageCPU->privs = array();
-$config->group->package->manageCPU->privs['ops-cpubrand'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 30, 'depend' => array(), 'recommend' => array());
-
$config->group->package->manageOS = new stdclass();
$config->group->package->manageOS->order = 2360;
$config->group->package->manageOS->subset = 'ops';
@@ -4194,12 +4178,14 @@ $config->group->package->useThinkWizard->privs['thinkwizard-result'] = array('ed
$config->group->package->manageThinkWizard = new stdclass();
$config->group->package->manageThinkWizard->subset = 'thinkwizard';
$config->group->package->manageThinkWizard->privs = array();
-$config->group->package->manageThinkWizard->privs['thinkwizard-create'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 5, 'depend' => array('thinkwizard-browse'));
-$config->group->package->manageThinkWizard->privs['thinkwizard-edit'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 10, 'depend' => array('thinkwizard-browse'));
-$config->group->package->manageThinkWizard->privs['thinkwizard-design'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 15, 'depend' => array('thinkwizard-browse', 'thinkwizard-result', 'thinkstep-create', 'thinkstep-edit', 'thinkstep-view', 'thinkstep-delete', 'thinkstep-link', 'thinkstep-cancelLink', 'thinkwizard-configureobjectsforappeals', 'thinkwizard-configuredimensionforappeals'));
-$config->group->package->manageThinkWizard->privs['thinkwizard-publish'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 20, 'depend' => array('thinkwizard-browse'));
-$config->group->package->manageThinkWizard->privs['thinkwizard-offline'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 25, 'depend' => array('thinkwizard-browse'));
-$config->group->package->manageThinkWizard->privs['thinkwizard-admin'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 25, 'depend' => array('thinkwizard-browse'));
+$config->group->package->manageThinkWizard->privs['thinkwizard-create'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 5, 'depend' => array('thinkwizard-browse'));
+$config->group->package->manageThinkWizard->privs['thinkwizard-edit'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 10, 'depend' => array('thinkwizard-browse'));
+$config->group->package->manageThinkWizard->privs['thinkwizard-design'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 15, 'depend' => array('thinkwizard-browse', 'thinkwizard-result', 'thinkstep-create', 'thinkstep-edit', 'thinkstep-view', 'thinkstep-delete', 'thinkstep-link', 'thinkstep-cancelLink', 'thinkwizard-configureobjectsforappeals', 'thinkwizard-configuredimensionforappeals'));
+$config->group->package->manageThinkWizard->privs['thinkwizard-publish'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 20, 'depend' => array('thinkwizard-browse'));
+$config->group->package->manageThinkWizard->privs['thinkwizard-offline'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 25, 'depend' => array('thinkwizard-browse'));
+$config->group->package->manageThinkWizard->privs['thinkwizard-admin'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 30, 'depend' => array('thinkwizard-browse'));
+$config->group->package->manageThinkWizard->privs['thinkwizard-configureobjectsforappeals'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 35, 'depend' => array('thinkwizard-admin'));
+$config->group->package->manageThinkWizard->privs['thinkwizard-configuredimensionforappeals'] = array('edition' => 'ipd', 'vision' => 'or', 'order' => 40, 'depend' => array('thinkwizard-admin'));
$config->group->package->deleteThinkWizard = new stdclass();
$config->group->package->deleteThinkWizard->subset = 'thinkwizard';
diff --git a/module/host/config.php b/module/host/config.php
index c2a00ddb11..e078754ff6 100644
--- a/module/host/config.php
+++ b/module/host/config.php
@@ -5,6 +5,7 @@ $config->host->changestatus = new stdclass();
$config->host->create->requiredFields = 'name,intranet,extranet';
$config->host->edit->requiredFields = 'name,intranet,extranet';
$config->host->create->ipFields = 'intranet,extranet';
+$config->host->create->intFields = 'diskSize,memory';
$config->host->editor = new stdclass();
$config->host->editor->changestatus = array('id' => 'reason', 'tools' => 'simple');
diff --git a/module/host/config/dtable.php b/module/host/config/dtable.php
index 61ea92548c..42cbde30ca 100644
--- a/module/host/config/dtable.php
+++ b/module/host/config/dtable.php
@@ -13,8 +13,8 @@ $config->host->dtable->fieldList['group']['name'] = 'group';
$config->host->dtable->fieldList['group']['type'] = 'text';
$config->host->dtable->fieldList['group']['sortType'] = true;
$config->host->dtable->fieldList['group']['minWidth'] = '80';
-$config->host->dtable->fieldList['group']['required'] = true;
$config->host->dtable->fieldList['group']['show'] = true;
+$config->host->dtable->fieldList['group']['order'] = 30;
$config->host->dtable->fieldList['name']['title'] = $lang->host->name;
$config->host->dtable->fieldList['name']['name'] = 'name';
@@ -26,36 +26,37 @@ $config->host->dtable->fieldList['name']['link'] = array('module' => 'hos
$config->host->dtable->fieldList['name']['show'] = true;
$config->host->dtable->fieldList['name']['required'] = true;
$config->host->dtable->fieldList['name']['data-toggle'] = 'modal';
+$config->host->dtable->fieldList['name']['order'] = 40;
$config->host->dtable->fieldList['serverRoom']['title'] = $lang->host->serverRoom;
$config->host->dtable->fieldList['serverRoom']['name'] = 'serverRoom';
$config->host->dtable->fieldList['serverRoom']['type'] = 'text';
$config->host->dtable->fieldList['serverRoom']['sortType'] = true;
$config->host->dtable->fieldList['serverRoom']['link'] = array('module' => 'serverroom', 'method' => 'view', 'params' => 'id={serverRoom}');
-$config->host->dtable->fieldList['serverRoom']['required'] = true;
$config->host->dtable->fieldList['serverRoom']['show'] = true;
$config->host->dtable->fieldList['serverRoom']['data-toggle'] = 'modal';
+$config->host->dtable->fieldList['serverRoom']['order'] = 50;
$config->host->dtable->fieldList['intranet']['title'] = $lang->host->intranet;
$config->host->dtable->fieldList['intranet']['name'] = 'intranet';
$config->host->dtable->fieldList['intranet']['type'] = 'text';
$config->host->dtable->fieldList['intranet']['sortType'] = true;
$config->host->dtable->fieldList['intranet']['show'] = true;
-$config->host->dtable->fieldList['intranet']['required'] = true;
+$config->host->dtable->fieldList['intranet']['order'] = 60;
$config->host->dtable->fieldList['extranet']['title'] = $lang->host->extranet;
$config->host->dtable->fieldList['extranet']['name'] = 'extranet';
$config->host->dtable->fieldList['extranet']['type'] = 'text';
$config->host->dtable->fieldList['extranet']['sortType'] = true;
$config->host->dtable->fieldList['extranet']['show'] = true;
-$config->host->dtable->fieldList['extranet']['required'] = true;
+$config->host->dtable->fieldList['extranet']['order'] = 70;
$config->host->dtable->fieldList['osVersion']['title'] = $lang->host->osVersion;
$config->host->dtable->fieldList['osVersion']['name'] = 'osVersion';
$config->host->dtable->fieldList['osVersion']['type'] = 'text';
$config->host->dtable->fieldList['osVersion']['sortType'] = true;
$config->host->dtable->fieldList['osVersion']['show'] = true;
-$config->host->dtable->fieldList['osVersion']['required'] = true;
+$config->host->dtable->fieldList['osVersion']['order'] = 80;
$config->host->dtable->fieldList['status']['title'] = $lang->host->status;
$config->host->dtable->fieldList['status']['name'] = 'status';
@@ -64,7 +65,7 @@ $config->host->dtable->fieldList['status']['sortType'] = true;
$config->host->dtable->fieldList['status']['minWidth'] = '80';
$config->host->dtable->fieldList['status']['map'] = $lang->host->statusList;
$config->host->dtable->fieldList['status']['show'] = true;
-$config->host->dtable->fieldList['status']['required'] = true;
+$config->host->dtable->fieldList['status']['order'] = 90;
$config->host->actionList = array();
$config->host->actionList['online']['icon'] = 'arrow-up';
diff --git a/module/host/config/form.php b/module/host/config/form.php
index cd9f792fb6..e88bb4e93b 100644
--- a/module/host/config/form.php
+++ b/module/host/config/form.php
@@ -3,8 +3,8 @@ $config->host->form = new stdclass();
$config->host->form->create = array();
$config->host->form->create['name'] = array('type' => 'string', 'required' => true, 'default' => '');
$config->host->form->create['cpuNumber'] = array('type' => 'int', 'required' => false, 'default' => 0);
-$config->host->form->create['diskSize'] = array('type' => 'float', 'required' => false, 'default' => 0);
-$config->host->form->create['memory'] = array('type' => 'float', 'required' => false, 'default' => 0);
+$config->host->form->create['diskSize'] = array('type' => 'string', 'required' => false, 'default' => '');
+$config->host->form->create['memory'] = array('type' => 'string', 'required' => false, 'default' => '');
$config->host->form->create['group'] = array('type' => 'string', 'required' => false, 'default' => '');
$config->host->form->create['serverRoom'] = array('type' => 'int', 'required' => false, 'default' => '');
$config->host->form->create['osName'] = array('type' => 'string', 'required' => false, 'default' => '');
@@ -18,8 +18,8 @@ $config->host->form->create['desc'] = array('type' => 'string', 'required'
$config->host->form->edit = array();
$config->host->form->edit['name'] = array('type' => 'string', 'required' => true, 'default' => '');
$config->host->form->edit['cpuNumber'] = array('type' => 'int', 'required' => false, 'default' => 0);
-$config->host->form->edit['diskSize'] = array('type' => 'float', 'required' => false, 'default' => 0);
-$config->host->form->edit['memory'] = array('type' => 'float', 'required' => false, 'default' => 0);
+$config->host->form->edit['diskSize'] = array('type' => 'string', 'required' => false, 'default' => '');
+$config->host->form->edit['memory'] = array('type' => 'string', 'required' => false, 'default' => '');
$config->host->form->edit['group'] = array('type' => 'string', 'required' => false, 'default' => '');
$config->host->form->edit['serverRoom'] = array('type' => 'int', 'required' => false, 'default' => '');
$config->host->form->edit['osName'] = array('type' => 'string', 'required' => false, 'default' => '');
diff --git a/module/host/control.php b/module/host/control.php
index 9adc0a31cf..52808e0c3f 100644
--- a/module/host/control.php
+++ b/module/host/control.php
@@ -46,7 +46,6 @@ class host extends control
$this->view->title = $this->lang->host->common;
$this->view->hostList = $this->host->getList($browseType, $param, $orderBy, $pager);
$this->view->rooms = $rooms;
- $this->view->accounts = $this->loadModel('account')->getPairs();
$this->view->param = $param;
$this->view->browseType = $browseType;
$this->view->orderBy = $orderBy;
@@ -64,7 +63,7 @@ class host extends control
* @access public
* @return void
*/
- public function create(string $osName = 'linux')
+ public function create()
{
if($_POST)
{
@@ -79,9 +78,7 @@ class host extends control
}
$this->view->title = $this->lang->host->create;
- $this->view->osName = $osName;
$this->view->rooms = $this->loadModel('serverroom')->getPairs();
- $this->view->accounts = $this->loadModel('account')->getPairs();
$this->view->optionMenu = $this->loadModel('tree')->getOptionMenu(0, 'host');
$this->display();
}
@@ -95,7 +92,7 @@ class host extends control
* @access public
* @return void
*/
- public function edit(int $id, string $osName = '')
+ public function edit(int $id)
{
if($_POST)
{
@@ -106,14 +103,12 @@ class host extends control
$this->host->update($formData);
if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
- return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => inlink('browse'), 'closeModal' => true));
+ return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => inlink('browse')));
}
$this->view->title = $this->lang->host->edit;
$this->view->host = $this->host->fetchByID($id);
- $this->view->osName = $osName ? $osName : $this->view->host->osName;
$this->view->rooms = $this->loadModel('serverroom')->getPairs();
- $this->view->accounts = $this->loadModel('account')->getPairs();
$this->view->optionMenu = $this->loadModel('tree')->getOptionMenu(0, 'host');
$this->display();
}
@@ -133,7 +128,6 @@ class host extends control
$this->view->rooms = $this->loadModel('serverroom')->getPairs();
$this->view->optionMenu = $this->loadModel('tree')->getOptionMenu(0, 'host');
$this->view->actions = $this->loadModel('action')->getList('host', $id);
- $this->view->accounts = $this->loadModel('account')->getPairs();
$this->display();
}
@@ -195,4 +189,24 @@ class host extends control
$this->view->type = $type;
$this->display();
}
+
+ /**
+ * Js获取所有的操作系统列表。
+ * Get all os list.
+ *
+ * @param string $type
+ * @access public
+ * @return void
+ */
+ public function ajaxGetOS(string $type)
+ {
+ $type .= 'List';
+ $osList = $this->lang->host->{$type};
+ if(empty($osList)) return '';
+
+ $osItems = array();
+ foreach($osList as $version => $os) $osItems[] = array('text' => $os, 'value' => $version);
+
+ return print(json_encode($osItems));
+ }
}
diff --git a/module/host/js/browse.ui.js b/module/host/js/browse.ui.js
index 9bb1612e56..96b99f3136 100644
--- a/module/host/js/browse.ui.js
+++ b/module/host/js/browse.ui.js
@@ -1,9 +1,13 @@
window.renderCell = function(result, {col, row})
{
+ if(col.name === 'serverRoom')
+ {
+ if(row.data.serverRoom) result[1].attrs.title = rooms[row.data.serverRoom];
+ }
if(col.name === 'osVersion')
{
const{osName, osVersion} = row.data;
- if(osName && osVersion) result[0] = {html: hostLang[osName + 'List'][osVersion]};
+ if(osName) result[0] = {html: hostLang[osName + 'List'][osVersion]};
}
return result;
diff --git a/module/host/js/common.ui.js b/module/host/js/common.ui.js
new file mode 100644
index 0000000000..c4c5c23702
--- /dev/null
+++ b/module/host/js/common.ui.js
@@ -0,0 +1,24 @@
+window.osChange = function()
+{
+ const osName = $('[name="osName"]').val();
+ if(typeof osName === 'undefined') return;
+
+ toggleLoading('#osVersion', true);
+ const $picker = $('[name="osVersion"]').zui('picker');
+ if(typeof $picker === 'undefined') return;
+
+ $picker.$.clear();
+ if(!osName)
+ {
+ $picker.render({items: []});
+ toggleLoading('#osVersion', false);
+ return;
+ }
+
+ $.getJSON($.createLink('host', 'ajaxGetOS', 'type=' + osName), function(items)
+ {
+ $picker.render({items: items});
+ if(typeof(host) !== 'undefined') $picker.$.setValue(host.osVersion);
+ toggleLoading('#osVersion', false);
+ });
+};
diff --git a/module/host/js/create.ui.js b/module/host/js/create.ui.js
deleted file mode 100644
index 988352da6d..0000000000
--- a/module/host/js/create.ui.js
+++ /dev/null
@@ -1,4 +0,0 @@
-window.osChange = function(e)
-{
- loadPage($.createLink('host', 'create', 'osName=' + e.target.value), '#osVersion');
-};
diff --git a/module/host/js/edit.ui.js b/module/host/js/edit.ui.js
deleted file mode 100644
index a544306672..0000000000
--- a/module/host/js/edit.ui.js
+++ /dev/null
@@ -1,4 +0,0 @@
-window.osChange = function(e)
-{
- loadPage($.createLink('host', 'edit', 'id=' + host.id + '&osName=' + e.target.value), '#osVersion');
-};
diff --git a/module/host/lang/de.php b/module/host/lang/de.php
index 3e37ba9a15..e44d0ebe7d 100644
--- a/module/host/lang/de.php
+++ b/module/host/lang/de.php
@@ -55,10 +55,6 @@ $lang->host->offlineReason = 'Offline Reason';
$lang->host->unitList['GB'] = 'GB';
$lang->host->unitList['TB'] = 'TB';
-$lang->host->cpuBrandList[''] = '';
-$lang->host->cpuBrandList['intel'] = 'Intel';
-$lang->host->cpuBrandList['amd'] = 'AMD';
-
$lang->host->database = 'Database';
$lang->host->databaseList[''] = '';
$lang->host->databaseList['mysql55'] = 'MySQL 5.5';
diff --git a/module/host/lang/en.php b/module/host/lang/en.php
index 3e37ba9a15..e44d0ebe7d 100644
--- a/module/host/lang/en.php
+++ b/module/host/lang/en.php
@@ -55,10 +55,6 @@ $lang->host->offlineReason = 'Offline Reason';
$lang->host->unitList['GB'] = 'GB';
$lang->host->unitList['TB'] = 'TB';
-$lang->host->cpuBrandList[''] = '';
-$lang->host->cpuBrandList['intel'] = 'Intel';
-$lang->host->cpuBrandList['amd'] = 'AMD';
-
$lang->host->database = 'Database';
$lang->host->databaseList[''] = '';
$lang->host->databaseList['mysql55'] = 'MySQL 5.5';
diff --git a/module/host/lang/fr.php b/module/host/lang/fr.php
index 3e37ba9a15..e44d0ebe7d 100644
--- a/module/host/lang/fr.php
+++ b/module/host/lang/fr.php
@@ -55,10 +55,6 @@ $lang->host->offlineReason = 'Offline Reason';
$lang->host->unitList['GB'] = 'GB';
$lang->host->unitList['TB'] = 'TB';
-$lang->host->cpuBrandList[''] = '';
-$lang->host->cpuBrandList['intel'] = 'Intel';
-$lang->host->cpuBrandList['amd'] = 'AMD';
-
$lang->host->database = 'Database';
$lang->host->databaseList[''] = '';
$lang->host->databaseList['mysql55'] = 'MySQL 5.5';
diff --git a/module/host/lang/zh-cn.php b/module/host/lang/zh-cn.php
index a9339bc70e..009d4d6486 100644
--- a/module/host/lang/zh-cn.php
+++ b/module/host/lang/zh-cn.php
@@ -55,10 +55,6 @@ $lang->host->offlineReason = '下架原因';
$lang->host->unitList['GB'] = 'GB';
$lang->host->unitList['TB'] = 'TB';
-$lang->host->cpuBrandList[''] = '';
-$lang->host->cpuBrandList['intel'] = '英特尔';
-$lang->host->cpuBrandList['amd'] = 'AMD';
-
$lang->host->database = '数据库';
$lang->host->databaseList[''] = '';
$lang->host->databaseList['mysql55'] = 'MySQL 5.5';
diff --git a/module/host/lang/zh-tw.php b/module/host/lang/zh-tw.php
index 076f77df46..a3afedb1bf 100644
--- a/module/host/lang/zh-tw.php
+++ b/module/host/lang/zh-tw.php
@@ -43,10 +43,6 @@ $lang->host->offline = '下架';
$lang->host->unitList['GB'] = 'GB';
$lang->host->unitList['TB'] = 'TB';
-$lang->host->cpuBrandList[''] = '';
-$lang->host->cpuBrandList['intel'] = '英特爾';
-$lang->host->cpuBrandList['amd'] = 'AMD';
-
$lang->host->database = '資料庫';
$lang->host->databaseList[''] = '';
$lang->host->databaseList['mysql55'] = 'MySQL 5.5';
diff --git a/module/host/ui/browse.html.php b/module/host/ui/browse.html.php
index dac303d6dd..2f85c6d075 100644
--- a/module/host/ui/browse.html.php
+++ b/module/host/ui/browse.html.php
@@ -13,6 +13,7 @@ declare(strict_types=1);
namespace zin;
jsVar('hostLang', $lang->host);
+jsVar('rooms', $rooms);
$config->host->featureBar['all']['active'] = true;
$config->host->featureBar['all']['badge'] = $pager->recTotal != '' ? array('text' => $pager->recTotal, 'class' => 'size-sm rounded-full white') : null;
@@ -28,7 +29,6 @@ $createLink = $this->createLink('host', 'create');
$createItem = array('text' => $lang->host->create, 'url' => $createLink, 'class' => 'primary', 'icon' => 'plus');
$config->host->dtable->fieldList['group']['map'] = $optionMenu;
-$config->host->dtable->fieldList['admin']['map'] = $accounts;
$config->host->dtable->fieldList['serverRoom']['map'] = $rooms;
$tableData = initTableData($hostList, $config->host->dtable->fieldList, $this->host);
foreach($tableData as $row)
@@ -60,7 +60,6 @@ $cols = $this->loadModel('datatable')->getSetting('host');
dtable
(
set::customCols(true),
- set::userMap($accounts),
set::cols($cols),
set::data($tableData),
set::sortLink(createLink('host', 'browse', "browseType=$browseType¶m=$param&orderBy={name}_{sortType}&recTotal={$pager->recTotal}&recPerPage={$pager->recPerPage}")),
diff --git a/module/host/ui/create.html.php b/module/host/ui/create.html.php
index 2cf942fae1..3dd4c81fde 100644
--- a/module/host/ui/create.html.php
+++ b/module/host/ui/create.html.php
@@ -50,8 +50,7 @@ formPanel
set::label($lang->host->osName),
set::control('picker'),
set::name('osName'),
- set::items($lang->host->osNameList),
- set::value($osName ? $osName : $host->osName),
+ set::items(array()),
on::change('osChange')
)
),
diff --git a/module/host/ui/edit.html.php b/module/host/ui/edit.html.php
index 72e8581371..2b8b310f36 100644
--- a/module/host/ui/edit.html.php
+++ b/module/host/ui/edit.html.php
@@ -18,6 +18,7 @@ formPanel
(
set::id('hostEditForm'),
set::title($lang->host->edit),
+ on::init()->do('$(function() {setTimeout(osChange, 50); });'),
formRow
(
setID('groupRow'),
@@ -56,7 +57,7 @@ formPanel
set::control('picker'),
set::name('osName'),
set::items($lang->host->osNameList),
- set::value($osName ? $osName : $host->osName),
+ set::value(zget($host, 'osName', '')),
on::change('osChange')
)
),
@@ -71,11 +72,12 @@ formPanel
),
formGroup
(
+ setID('osVersion'),
set::width('1/3'),
set::label($lang->host->osVersion),
set::control('picker'),
set::name('osVersion'),
- set::items($lang->host->{"{$osName}List"}),
+ set::items(array()),
set::value($host->osVersion)
)
),
@@ -95,10 +97,12 @@ formPanel
set::label($lang->host->cpuNumber),
set::control(array('type' => 'number', 'min' => 1)),
set::value(zget($host, 'cpuNumber', '') ? $host->cpuNumber : '')
- ),
+ )
+ ),
+ formRow
+ (
formGroup
(
- setClass('useManual hidden'),
set::width('1/3'),
set::name('memory'),
set::label($lang->host->memory),
@@ -109,20 +113,20 @@ formPanel
'suffix' => 'GB',
'suffixWidth' => 40
))
- )
- ),
- formGroup
- (
- set::width('1/3'),
- set::name('diskSize'),
- set::label($lang->host->diskSize),
- set::value(zget($host, 'diskSize', '') ? $host->diskSize : ''),
- set::control(array
+ ),
+ formGroup
(
- 'type' => 'inputControl',
- 'suffix' => 'GB',
- 'suffixWidth' => 40
- ))
+ set::width('1/3'),
+ set::name('diskSize'),
+ set::label($lang->host->diskSize),
+ set::value(zget($host, 'diskSize', '') ? $host->diskSize : ''),
+ set::control(array
+ (
+ 'type' => 'inputControl',
+ 'suffix' => 'GB',
+ 'suffixWidth' => 40
+ ))
+ )
),
formGroup
(
diff --git a/module/host/ui/view.html.php b/module/host/ui/view.html.php
index 5c49d1926a..7d220245e0 100644
--- a/module/host/ui/view.html.php
+++ b/module/host/ui/view.html.php
@@ -32,8 +32,8 @@ detailBody
setClass('table table-fixed canvas host-view-table'),
h::tr
(
- h::th($lang->host->CD),
- h::td($host->CD),
+ isset($host->CD) ? h::th($lang->host->CD) : null,
+ isset($host->CD) ? h::td($lang->host->CDlist[$host->CD]) : null,
h::th($lang->host->name),
h::td($host->name)
),
@@ -44,12 +44,12 @@ detailBody
h::th($lang->host->serverRoom),
h::td(zget($rooms, $host->serverRoom, ""))
),
- $host->CD == 'spug' ? h::tr
+ zget($host, 'CD') == 'spug' ? h::tr
(
h::th($lang->host->admin),
h::td(zget($host, 'admin')),
) : null,
- $host->CD == 'spug' ? h::tr
+ zget($host, 'CD') == 'spug' ? h::tr
(
h::th($lang->host->password),
h::td($lang->host->defaultPWD),
@@ -77,12 +77,12 @@ detailBody
),
h::tr
(
- $host->CD != 'spug' ? h::th($lang->host->osName) : null,
- $host->CD != 'spug' ? h::td($host->osName) : null,
+ zget($host, 'CD') != 'spug' ? h::th($lang->host->osName) : null,
+ zget($host, 'CD') != 'spug' ? h::td($host->osName) : null,
h::th($lang->host->osVersion),
- h::td($host->CD != 'spug' ? zget($lang->host->{$host->osName.'List'}, $host->osVersion) : $host->osName)
+ h::td(zget($host, 'CD') != 'spug' ? zget($lang->host->{$host->osName.'List'}, $host->osVersion) : $host->osName)
),
- $host->CD != 'spug' ? h::tr
+ zget($host, 'CD') != 'spug' ? h::tr
(
h::th($lang->host->status),
h::td($lang->host->statusList[$host->status]),
diff --git a/module/host/zen.php b/module/host/zen.php
index 2fd7f4bc91..6c8b0d51ba 100644
--- a/module/host/zen.php
+++ b/module/host/zen.php
@@ -31,9 +31,22 @@ class hostZen extends host
dao::$errors['desc'] = $this->lang->host->notice->descLength;
}
+ $intFields = explode(',', $this->config->host->create->intFields);
+ foreach($intFields as $field)
+ {
+ if(!$formData->{$field}) continue;
+
+ if(!preg_match("/^-?\d+$/", $formData->{$field}))
+ {
+ dao::$errors[$field] = $this->lang->host->notice->{$field};
+ }
+ }
+
$ipFields = explode(',', $this->config->host->create->ipFields);
foreach($ipFields as $field)
{
+ if(!$formData->{$field}) continue;
+
$ipList = explode(',', $formData->{$field});
foreach($ipList as $ip)
{
diff --git a/module/instance/config/dtable.php b/module/instance/config/dtable.php
new file mode 100644
index 0000000000..767904b810
--- /dev/null
+++ b/module/instance/config/dtable.php
@@ -0,0 +1,58 @@
+backup = new stdClass();
+$config->backup->dtable = new stdclass();
+$config->backup->dtable->fieldList['create_time']['name'] = 'create_time';
+$config->backup->dtable->fieldList['create_time']['title'] = $lang->instance->backup->date;
+$config->backup->dtable->fieldList['create_time']['type'] = 'desc';
+$config->backup->dtable->fieldList['create_time']['sortType'] = false;
+$config->backup->dtable->fieldList['create_time']['hint'] = true;
+$config->backup->dtable->fieldList['create_time']['formatDate'] = 'YYYY-MM-dd hh:mm:ss';
+$config->backup->dtable->fieldList['create_time']['width'] = '120';
+
+$config->backup->dtable->fieldList['operator']['name'] = 'operator';
+$config->backup->dtable->fieldList['operator']['title'] = $lang->instance->backup->operator;
+$config->backup->dtable->fieldList['operator']['type'] = 'desc';
+$config->backup->dtable->fieldList['operator']['sortType'] = false;
+$config->backup->dtable->fieldList['operator']['hint'] = true;
+$config->backup->dtable->fieldList['operator']['width'] = '100';
+
+$config->backup->dtable->fieldList['dbStatus']['name'] = 'status';
+$config->backup->dtable->fieldList['dbStatus']['title'] = $lang->instance->backup->dbStatus;
+$config->backup->dtable->fieldList['dbStatus']['type'] = 'desc';
+$config->backup->dtable->fieldList['dbStatus']['sortType'] = false;
+$config->backup->dtable->fieldList['dbStatus']['hint'] = true;
+$config->backup->dtable->fieldList['dbStatus']['width'] = '80';
+
+$config->backup->dtable->fieldList['backupSize']['name'] = 'backupSize';
+$config->backup->dtable->fieldList['backupSize']['title'] = $lang->instance->backup->backupSize;
+$config->backup->dtable->fieldList['backupSize']['type'] = 'desc';
+$config->backup->dtable->fieldList['backupSize']['sortType'] = false;
+$config->backup->dtable->fieldList['backupSize']['hint'] = true;
+$config->backup->dtable->fieldList['backupSize']['width'] = '100';
+
+$config->backup->dtable->fieldList['restoreDate']['name'] = 'latestRestoreTime';
+$config->backup->dtable->fieldList['restoreDate']['title'] = $lang->instance->backup->restoreDate;
+$config->backup->dtable->fieldList['restoreDate']['type'] = 'desc';
+$config->backup->dtable->fieldList['restoreDate']['sortType'] = false;
+$config->backup->dtable->fieldList['restoreDate']['hint'] = true;
+$config->backup->dtable->fieldList['restoreDate']['width'] = '120';
+
+$config->backup->dtable->fieldList['restoreStatus']['name'] = 'latestRestoreStatus';
+$config->backup->dtable->fieldList['restoreStatus']['title'] = $lang->instance->backup->restoreStatus;
+$config->backup->dtable->fieldList['restoreStatus']['type'] = 'desc';
+$config->backup->dtable->fieldList['restoreStatus']['sortType'] = false;
+$config->backup->dtable->fieldList['restoreStatus']['hint'] = true;
+$config->backup->dtable->fieldList['restoreStatus']['width'] = '80';
+
+$config->backup->dtable->fieldList['actions']['name'] = 'actions';
+$config->backup->dtable->fieldList['actions']['title'] = $lang->instance->backup->action;
+$config->backup->dtable->fieldList['actions']['type'] = 'actions';
+$config->backup->dtable->fieldList['actions']['hint'] = true;
+$config->backup->dtable->fieldList['actions']['menu'] = array('restore');
+
+$config->backup->dtable->fieldList['actions']['list']['restore']['icon'] = 'icon-restart';
+$config->backup->dtable->fieldList['actions']['list']['restore']['hint'] = $lang->instance->restore->common;
+$config->backup->dtable->fieldList['actions']['list']['restore']['url'] = helper::createLink('instance', 'ajaxRestore', 'instanceID={instanceId}&backupName={name}');
+$config->backup->dtable->fieldList['actions']['list']['restore']['className'] = 'ajax-submit';
\ No newline at end of file
diff --git a/module/instance/control.php b/module/instance/control.php
index 27dae0624d..786b2434ad 100644
--- a/module/instance/control.php
+++ b/module/instance/control.php
@@ -532,4 +532,155 @@ class instance extends control
$this->loadModel('instance')->syncGitFoxData();
return true;
}
+
+ /**
+ * Instance Backup List.
+ * 应用备份列表。
+ * @param int $id
+ * @param int $recPerPage
+ * @param int $pageID
+ * @return void
+ */
+ public function backupList(int $id, int $recPerPage = 5, int $pageID = 1)
+ {
+ /* Initialize Backup List. */
+ $instance = $this->instance->getByID($id);
+ $backupList = $this->instance->backupList($instance);
+
+ /* Pager. */
+ $this->app->loadClass('pager', true);
+ $recTotal = count($backupList);
+ $pager = new pager($recTotal, $recPerPage, $pageID);
+ $backupList = array_chunk($backupList, $pager->recPerPage);
+ $backupList = empty($backupList) ? array() : $backupList[$pageID - 1];
+
+ $this->view->instance = $instance;
+ $this->view->pager = $pager;
+ $this->view->backupList = $backupList;
+ $this->display();
+ }
+
+ /**
+ * Restore instance by ajax.
+ * 还原应用。
+ * @access public
+ * @return void
+ */
+ public function ajaxRestore(int $instanceID, string $backupName)
+ {
+ if(empty($instanceID) || empty($backupName)) return $this->send(array('result' => 'fail', 'message' => $this->lang->instance->errors->wrongRequestData));
+
+ $instance = $this->instance->getByID($instanceID);
+ if(empty($instance)) return $this->send(array('result' => 'fail', 'load' => array('alert' => $this->lang->instance->instanceNotExists)));
+
+ $success = $this->instance->restore($instance, $this->app->user, $backupName);
+ if(!$success)
+ {
+ $this->action->create('instance', $instance->id, 'restore', '', json_encode(array('result' => array('result' => 'fail'))));
+ return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'restoreFail') ));
+ }
+ $this->action->create('instance', $instance->id, 'restore', '', json_encode(array('result' => array('result' => 'success'))));
+ return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'restoreSuccess'), 'locate' => $this->createLink('instance', 'view', 'id=' . $instanceID)));
+ }
+
+ /**
+ * 手动备份。
+ * Manual backup.
+ *
+ * @param int $id
+ * @param string $component 0|mysql
+ * @access public
+ * @return void
+ */
+ public function manualBackup(int $id)
+ {
+ $instance = $this->instance->getByID($id);
+ $success = $this->instance->backup($instance, $this->app->user);
+ if(!$success)
+ {
+ $this->action->create('instance', $instance->id, 'manualbackup', '', json_encode(array('result' => 'fail')));
+ return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'backupFail')));
+ }
+ $this->action->create('instance', $instance->id, 'manualbackup', '', json_encode(array('result' => 'success')));
+ return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'backupSuccess')));
+ }
+
+ /**
+ * 备份设置。
+ * backup settings.
+ *
+ * @param int $id
+ * @param string $component 0|mysql
+ * @access public
+ * @return void
+ */
+ public function backupSettings(int $instanceID)
+ {
+ $instance = $this->instance->getByID($instanceID);
+ if($_POST)
+ {
+ $this->instance->saveBackupSettings($instance);
+ if(dao::isError()) return $this->send(array('result' => 'fail', 'load' => array('alert' => dao::getError())));
+
+ return $this->send(array('result' => 'success', 'load' => true, 'closeModal' => true));
+ }
+ $this->view->instance = $instance;
+ $this->view->backupSettings = $this->instance->getAutoBackupSettings($instanceID);
+ $this->display();
+ }
+
+ /**
+ * Display or save auto backup.
+ * 自动备份设置。
+ *
+ * @param int $id
+ * @access public
+ * @return void
+ */
+ public function autoBackup(int $instanceID)
+ {
+ $instance = $this->instance->getByID($instanceID);
+ if($_POST)
+ {
+ $this->instance->saveAutoBackupSettings($instance);
+ if(dao::isError()) return $this->send(array('result' => 'fail', 'load' => array('alert' => dao::getError())));
+
+ $backupSettings = $this->instance->getAutoBackupSettings($instanceID);
+ $locate = $this->createLink('instance', 'view', 'id=' . $instanceID);
+ $startTime = strtotime($backupSettings->backupTime);
+ if($startTime < time()) $startTime = strtotime("+1 day $backupSettings->backupTime");
+ if($backupSettings->autoBackup)
+ {
+ $startRestoreMessage = sprintf($this->lang->instance->restore->firstStartTime, $instance->name, date('Y-m-d H:i:s', $startTime));
+ return $this->send(array('result' => 'success', 'load' => array('alert' => $startRestoreMessage, 'locate' => $locate)));
+ }
+ return $this->send(array('result' => 'success', 'load' => array('alert' => $this->lang->instance->backup->disableAutoBackup, 'locate' => $locate)));
+ }
+ $this->view->instance = $instance;
+ $this->view->backupSettings = $this->instance->getAutoBackupSettings($instanceID);
+ $this->display();
+ }
+
+
+ /**
+ * Cron task of auto backup.
+ * 定时备份。
+ *
+ * @param $instanceID
+ * @return int|null
+ */
+ public function cronBackup(string $instanceID)
+ {
+ $instance = $this->instance->getByID((int)$instanceID);
+ if(empty($instance)) $this->send(array('result' => 'success', 'message' => $this->lang->instance->instanceNotExists));
+
+ $sysUser = new stdclass;
+ $sysUser->account = 'system';
+ $success = $this->instance->autoBackup($instance, $sysUser);
+ if(!$success)
+ {
+ return $this->send(array('result' => 'fail', 'message' => zget($this->lang->instance->notices, 'backupFail')));
+ }
+ return $this->send(array('result' => 'success', 'message' => zget($this->lang->instance->notices, 'backupSuccess')));
+ }
}
diff --git a/module/instance/js/autobackup.ui.js b/module/instance/js/autobackup.ui.js
new file mode 100644
index 0000000000..e0abb87fda
--- /dev/null
+++ b/module/instance/js/autobackup.ui.js
@@ -0,0 +1,16 @@
+$(function()
+{
+ $("input[type=checkbox][name='autoBackup']").on('change', function(event)
+ {
+ var enabled = $("input[type=checkbox][name='autoBackup']:checked").length > 0;
+ if(enabled)
+ {
+ $('.backup-settings').show();
+ }
+ else
+ {
+ $('.backup-settings').hide();
+ }
+ });
+ $("input[type=checkbox][name='autoBackup']").trigger("change");
+});
\ No newline at end of file
diff --git a/module/instance/js/view.ui.js b/module/instance/js/view.ui.js
index 23ac8b3e57..397eb19db6 100644
--- a/module/instance/js/view.ui.js
+++ b/module/instance/js/view.ui.js
@@ -73,3 +73,20 @@ window.copyText = function(dom)
time: 2000
});
}
+
+window.onManualBackup = function()
+{
+ zui.Modal.confirm({message: confirmBackupTip, icon: 'icon-exclamation-sign', iconClass: 'warning-pale rounded-full icon-2x'}).then(res =>
+ {
+ if(res)
+ {
+ $.ajaxSubmit({
+ url: $.createLink('instance', 'manualBackup', `modelID=${instanceID}`),
+ onComplete: function(res)
+ {
+ if(res.result === 'success') loadPage($.createLink('instance', 'view', `instanceID=${instanceID}`), '#backupList');
+ }
+ });
+ }
+ })
+}
diff --git a/module/instance/lang/de.php b/module/instance/lang/de.php
index 120f415d7f..5ce28475d8 100644
--- a/module/instance/lang/de.php
+++ b/module/instance/lang/de.php
@@ -131,12 +131,15 @@ $lang->instance->backup->disableAutoBackup = 'Automatic backup has been turned
$lang->instance->backup->keepBackupBySystem = 'The system will only delete expired automatic backup data when there is more than one backup data.';
$lang->instance->backup->backupSize = 'Size';
$lang->instance->backup->confirmTip = 'Are you sure you want to back up?';
+$lang->instance->backup->cronRemark = 'DevOps service automatic backup task';
+$lang->instance->backup->backupSettingsTips = 'When the backup exceeds the set time and is greater than one backup, the system will self delete';
$lang->instance->backup->cycleList[1] = 'Daily';
$lang->instance->backup->operators = array();
-$lang->instance->backup->operators['auto'] = 'Automatic backup';
-$lang->instance->backup->operators['manual'] = 'Manual backup';
+$lang->instance->backup->operators['auto'] = 'Automatic backup';
+$lang->instance->backup->operators['manual'] = 'Manual backup';
+$lang->instance->backup->operators['settings'] = 'Settings';
$lang->instance->backup->statusList = array();
$lang->instance->backup->statusList['success'] = 'successful';
@@ -286,6 +289,7 @@ $lang->instance->notices['upgradeSuccess'] = 'Upgrade successful';
$lang->instance->notices['upgradeFail'] = 'Upgrade failed';
$lang->instance->notices['backupSuccess'] = 'Backup task submitted';
$lang->instance->notices['backupFail'] = 'Backup failed';
+$lang->instance->notices['cleanBackupsSuccess'] = 'Backup cleanup successfuls';
$lang->instance->notices['restoreSuccess'] = 'The rollback task has been submitted';
$lang->instance->notices['restoreFail'] = 'Rollback failed';
$lang->instance->notices['deleteSuccess'] = 'DeleteSuccess';
diff --git a/module/instance/lang/en.php b/module/instance/lang/en.php
index 120f415d7f..5ce28475d8 100644
--- a/module/instance/lang/en.php
+++ b/module/instance/lang/en.php
@@ -131,12 +131,15 @@ $lang->instance->backup->disableAutoBackup = 'Automatic backup has been turned
$lang->instance->backup->keepBackupBySystem = 'The system will only delete expired automatic backup data when there is more than one backup data.';
$lang->instance->backup->backupSize = 'Size';
$lang->instance->backup->confirmTip = 'Are you sure you want to back up?';
+$lang->instance->backup->cronRemark = 'DevOps service automatic backup task';
+$lang->instance->backup->backupSettingsTips = 'When the backup exceeds the set time and is greater than one backup, the system will self delete';
$lang->instance->backup->cycleList[1] = 'Daily';
$lang->instance->backup->operators = array();
-$lang->instance->backup->operators['auto'] = 'Automatic backup';
-$lang->instance->backup->operators['manual'] = 'Manual backup';
+$lang->instance->backup->operators['auto'] = 'Automatic backup';
+$lang->instance->backup->operators['manual'] = 'Manual backup';
+$lang->instance->backup->operators['settings'] = 'Settings';
$lang->instance->backup->statusList = array();
$lang->instance->backup->statusList['success'] = 'successful';
@@ -286,6 +289,7 @@ $lang->instance->notices['upgradeSuccess'] = 'Upgrade successful';
$lang->instance->notices['upgradeFail'] = 'Upgrade failed';
$lang->instance->notices['backupSuccess'] = 'Backup task submitted';
$lang->instance->notices['backupFail'] = 'Backup failed';
+$lang->instance->notices['cleanBackupsSuccess'] = 'Backup cleanup successfuls';
$lang->instance->notices['restoreSuccess'] = 'The rollback task has been submitted';
$lang->instance->notices['restoreFail'] = 'Rollback failed';
$lang->instance->notices['deleteSuccess'] = 'DeleteSuccess';
diff --git a/module/instance/lang/fr.php b/module/instance/lang/fr.php
index 120f415d7f..5ce28475d8 100644
--- a/module/instance/lang/fr.php
+++ b/module/instance/lang/fr.php
@@ -131,12 +131,15 @@ $lang->instance->backup->disableAutoBackup = 'Automatic backup has been turned
$lang->instance->backup->keepBackupBySystem = 'The system will only delete expired automatic backup data when there is more than one backup data.';
$lang->instance->backup->backupSize = 'Size';
$lang->instance->backup->confirmTip = 'Are you sure you want to back up?';
+$lang->instance->backup->cronRemark = 'DevOps service automatic backup task';
+$lang->instance->backup->backupSettingsTips = 'When the backup exceeds the set time and is greater than one backup, the system will self delete';
$lang->instance->backup->cycleList[1] = 'Daily';
$lang->instance->backup->operators = array();
-$lang->instance->backup->operators['auto'] = 'Automatic backup';
-$lang->instance->backup->operators['manual'] = 'Manual backup';
+$lang->instance->backup->operators['auto'] = 'Automatic backup';
+$lang->instance->backup->operators['manual'] = 'Manual backup';
+$lang->instance->backup->operators['settings'] = 'Settings';
$lang->instance->backup->statusList = array();
$lang->instance->backup->statusList['success'] = 'successful';
@@ -286,6 +289,7 @@ $lang->instance->notices['upgradeSuccess'] = 'Upgrade successful';
$lang->instance->notices['upgradeFail'] = 'Upgrade failed';
$lang->instance->notices['backupSuccess'] = 'Backup task submitted';
$lang->instance->notices['backupFail'] = 'Backup failed';
+$lang->instance->notices['cleanBackupsSuccess'] = 'Backup cleanup successfuls';
$lang->instance->notices['restoreSuccess'] = 'The rollback task has been submitted';
$lang->instance->notices['restoreFail'] = 'Rollback failed';
$lang->instance->notices['deleteSuccess'] = 'DeleteSuccess';
diff --git a/module/instance/lang/zh-cn.php b/module/instance/lang/zh-cn.php
index 32794ec02b..bc028db117 100644
--- a/module/instance/lang/zh-cn.php
+++ b/module/instance/lang/zh-cn.php
@@ -131,12 +131,15 @@ $lang->instance->backup->disableAutoBackup = '自动备份已关闭';
$lang->instance->backup->keepBackupBySystem = '备份数据超过1条时系统才会删除过期的自动备份数据。';
$lang->instance->backup->backupSize = '大小';
$lang->instance->backup->confirmTip = '确认要备份吗?';
+$lang->instance->backup->cronRemark = 'Devops服务自动备份任务';
+$lang->instance->backup->backupSettingsTips = '备份超出时间设置且大于一个备份时,系统会自动删除备份';
$lang->instance->backup->cycleList[1] = '每日';
$lang->instance->backup->operators = array();
-$lang->instance->backup->operators['auto'] = '自动备份';
-$lang->instance->backup->operators['manual'] = '手动备份';
+$lang->instance->backup->operators['auto'] = '自动备份';
+$lang->instance->backup->operators['manual'] = '手动备份';
+$lang->instance->backup->operators['settings'] = '设置';
$lang->instance->backup->statusList = array();
$lang->instance->backup->statusList['success'] = '成功';
@@ -154,13 +157,13 @@ $lang->instance->backup->statusList['downloadFailed'] = '下载失败';
$lang->instance->restore = new stdclass;
$lang->instance->restore->common = '还原';
-$lang->instance->restore->autoRestore = '自动还原';
+$lang->instance->restore->autoRestore = '自动备份';
$lang->instance->restore->enableAutoRestore = '是否开启自动备份';
-$lang->instance->restore->cycleDays = '备份周期';
-$lang->instance->restore->restoreTime = '备份时间';
+$lang->instance->restore->cycleDays = '还原周期';
+$lang->instance->restore->restoreTime = '还原时间';
$lang->instance->restore->invalidTime = '无效的时间';
-$lang->instance->restore->disableAutoRestore = '自动还原已关闭';
-$lang->instance->restore->firstStartTime = '%s 首次自动还原将于%s 执行';
+$lang->instance->restore->disableAutoRestore = '自动备份已关闭';
+$lang->instance->restore->firstStartTime = '%s 首次自动备份将于%s 执行';
$lang->instance->restore->cycleList[1] = '每日';
@@ -286,8 +289,9 @@ $lang->instance->notices['upgradeSuccess'] = '升级成功';
$lang->instance->notices['upgradeFail'] = '升级失败';
$lang->instance->notices['backupSuccess'] = '备份任务已提交';
$lang->instance->notices['backupFail'] = '备份失败';
-$lang->instance->notices['restoreSuccess'] = '回滚任务已提交';
-$lang->instance->notices['restoreFail'] = '回滚失败';
+$lang->instance->notices['cleanBackupsSuccess'] = '备份清理成功';
+$lang->instance->notices['restoreSuccess'] = '还原任务已提交';
+$lang->instance->notices['restoreFail'] = '还原失败';
$lang->instance->notices['deleteSuccess'] = '删除成功';
$lang->instance->notices['deleteFail'] = '删除失败';
$lang->instance->notices['starting'] = '启动中,请稍候...';
@@ -296,7 +300,7 @@ $lang->instance->notices['installing'] = '安装中,请稍候...
$lang->instance->notices['uninstalling'] = '删除中,请稍候...';
$lang->instance->notices['upgrading'] = '升级中,请稍候...';
$lang->instance->notices['backuping'] = '备份中,请稍候...';
-$lang->instance->notices['restoring'] = '回滚中,请稍候...';
+$lang->instance->notices['restoring'] = '还原中,请稍候...';
$lang->instance->notices['deleting'] = '删除中,请稍候...';
$lang->instance->notices['adjusting'] = '调整中,请稍候...';
$lang->instance->notices['switching'] = '提交中,请稍候...';
diff --git a/module/instance/model.php b/module/instance/model.php
index f0370c715c..beadebcca6 100644
--- a/module/instance/model.php
+++ b/module/instance/model.php
@@ -1151,4 +1151,244 @@ class instanceModel extends model
if(empty($this->loadModel('pipeline')->getByNameAndType($name . '-' . $times, $name))) return $name . '-' . $times;
}
}
+
+ /**
+ * Backup instance.
+ * 备份应用实例。
+ * @param object $instance
+ * @param object $user
+ * @access public
+ * @return bool
+ */
+ public function backup($instance, $user)
+ {
+ $result = $this->cne->backup($instance, $user->account);
+ if($result->code != 200) return false;
+
+ return true;
+ }
+
+ /**
+ * Get backup list of instance.
+ * 获取应用备份列表。
+ *
+ * @param object $instance
+ * @access public
+ * @return array
+ */
+ public function backupList($instance)
+ {
+ $result = $this->cne->getBackupList($instance);
+ if(empty($result) || $result->code != 200 || empty($result->data)) return array();
+
+ $backupList = $result->data;
+ usort($backupList, function($backup1, $backup2)
+ {
+ if($backup1->create_time < $backup2->create_time) return 1;
+ elseif ($backup1->create_time > $backup2->create_time) return -1;
+ else return 0;
+ });
+
+ $accounts = array_column($backupList, 'creator');
+ foreach($backupList as $backup) $accounts = array_merge($accounts, array_column($backup->restores, 'creator'));
+
+ $accounts = array_unique($accounts);
+
+ $users = $this->dao->select('account,realname')->from(TABLE_USER)->where('account')->in($accounts)->fetchPairs('account', 'realname');
+
+ foreach($backupList as &$backup)
+ {
+ $backup->latest_restore_time = 0;
+ $backup->latest_restore_status = '';
+ $backup->username = zget($users, $backup->creator);
+ /* Mount backup operator info and latest restore info. */
+ foreach($backup->restores as &$restore)
+ {
+ $restore->username = zget($users, $restore->creator);
+
+ if($restore->create_time > $backup->latest_restore_time)
+ {
+ $backup->latest_restore_time = $restore->create_time;
+ $backup->latest_restore_status = $restore->status;
+ }
+ }
+
+ /* Calculate backup size. */
+ $backupSize = isset($backup->backup_details->db[0]) ? intval(zget($backup->backup_details->db[0], 'size', 0)) : 0;
+ $backupSize += isset($backup->backup_details->volume[0]) ? intval(zget($backup->backup_details->volume[0], 'doneBytes', 0)) : 0;
+ $backup->fmtBackupSize = helper::formatKB($backupSize / 1024);
+ }
+ return $backupList;
+ }
+
+ /**
+ * Save auto backup settings.
+ * 保存自动备份配置。
+ * @param object $instance
+ * @access public
+ * @return bool
+ */
+ public function saveAutoBackupSettings($instance)
+ {
+ /* Init Default backup properties. */
+ $settings = fixer::input('post')
+ ->setDefault('autoBackup', '')
+ ->setDefault('backupTime', '1:00')
+ ->setDefault('backupCycle', '1')
+ ->get();
+ if(!preg_match("/^([0-2][0-9]):([0-5][0-9])$/", $settings->backupTime, $parts))
+ {
+ dao::$errors[] = $this->lang->instance->backup->invalidTime;
+ return false;
+ }
+ $autoBackup = $settings->autoBackup;
+ $command = 'moduleName=instance&methodName=cronBackup&instanceID=' . $instance->id;
+
+ /* Disable backup operation. */
+ if(!$autoBackup)
+ {
+ $this->dao->delete()->from(TABLE_CRON)->where('command')->eq($command)->exec();
+ $this->dao->update(TABLE_INSTANCE)->set('autoBackup')->eq($autoBackup)->where('id')->eq($instance->id)->exec();
+ if($this->dao->isError()) return false;
+
+ $this->action->create('instance', $instance->id, 'closeautobackup', '', json_encode(array('result' => 'success', 'data' => $settings)));
+ return true;
+ }
+
+ /* Enable backup operation. */
+ $cron = $this->dao->select('*')->from(TABLE_CRON)->where('command')->eq($command)->fetch();
+
+ list($hour, $minute) = explode(':', $settings->backupTime);
+ $cronData = new stdclass;
+ $cronData->m = intval($minute);
+ $cronData->h = intval($hour);
+ $cronData->dom = '*';
+ $cronData->mon = '*';
+ $cronData->dow = '*';
+ $cronData->type = 'zentao';
+ $cronData->status = 'normal';
+ $cronData->command = $command;
+ $cronData->remark = $this->lang->instance->backup->cronRemark;
+
+ /* Save cron task. */
+ if($cron) $this->dao->update(TABLE_CRON)->autoCheck()->data($cronData)->where('id')->eq($cron->id)->exec();
+ else $this->dao->insert(TABLE_CRON)->data($cronData)->exec();
+ if($this->dao->isError()) return false;
+
+ /* Save instance backup settings. */
+ $this->dao->update(TABLE_INSTANCE)->set('autoBackup')->eq($settings->autoBackup)->where('id')->eq($instance->id)->exec();
+ if($this->dao->isError()) return false;
+
+ $this->action->create('instance', $instance->id, 'openautobackup', '', json_encode(array('result' => 'success', 'data' => $settings)));
+ return true;
+ }
+
+ /**
+ * Save backup settings.
+ * 保存备份设置。
+ *
+ * @param $instance
+ * @return void
+ */
+ public function saveBackupSettings($instance)
+ {
+ $settings = fixer::input('post')->trim('backupKeepDays')->get();
+ if($instance->backupKeepDays == $settings->backupKeepDays) return true;
+
+ /* Save instance backup settings. */
+ $this->dao->update(TABLE_INSTANCE)->set('backupKeepDays')->eq($settings->backupKeepDays)->where('id')->eq($instance->id)->exec();
+ if($this->dao->isError()) return false;
+
+ $this->action->create('instance', $instance->id, 'savebackupsettings', '', json_encode(array('result' => 'success', 'data' => $settings)));
+ return true;
+ }
+
+ /**
+ * Get auto backup settings.
+ * 获取自动备份设置。
+ *
+ * @param int $instnaceID
+ * @access public
+ * @return object
+ */
+ public function getAutoBackupSettings($instanceID)
+ {
+ $instance = $this->getByID($instanceID);
+ $cron = $this->dao->select('*')->from(TABLE_CRON)->where('command')->eq('moduleName=instance&methodName=cronBackup&instanceID=' . $instance->id)->limit(1)->fetch();
+ if(!$cron) $cron = new stdclass;
+
+ $hour = substr('0' . zget($cron, 'h', '1'), -2, 2);
+ $minute = substr('0' . zget($cron, 'm', '00'), -2, 2);
+
+ $settings = new stdclass;
+ $settings->backupTime = "{$hour}:{$minute}";
+ $settings->autoBackup = boolval(zget($instance, 'autoBackup', false));
+ $settings->cycleDays = 1; // Cycle days is always is 1 at present.
+ return $settings;
+ }
+
+ /**
+ * Restore instance.
+ * 还原应用实例。
+ * @param object $instance
+ * @param object $user
+ * @param string $backupName
+ * @access public
+ * @return bool
+ */
+ public function restore($instance, $user, $backupName)
+ {
+ $result = $this->cne->restore($instance, $backupName, $user->account);
+ if ($result->code != 200) return false;
+ return true;
+ }
+
+ /**
+ * auto backup.
+ * 自动备份。
+ *
+ * @param $instance
+ * @param $user
+ * @return void
+ */
+ public function autoBackup($instance, $user)
+ {
+ $cron = $this->dao->select('*')->from(TABLE_CRON)->where('command')->eq('moduleName=instance&methodName=cronBackup&instanceID=' . $instance->id)->limit(1)->fetch();
+ if(!$cron)
+ {
+ $this->action->create('instance', $instance->id, 'autobackup', '', json_encode(array('result' => 'fail', 'data'=> $cron)));
+ return false;
+ }
+
+ /* 1. Call automatic backup*/
+ $result = $this->cne->backup($instance, $user->account);
+ if($result->code != 200)
+ {
+ $this->action->create('instance', $instance->id, 'autobackup', '', json_encode(array('result' => 'fail', 'data' => $result)));
+ return false;
+ }
+ $this->action->create('instance', $instance->id, 'autobackup', '', json_encode(array('result' => 'success', 'data' => $result)));
+
+ /* 2. Pick latest successful backup recorder. */
+ $latestBackup = null;
+ $backupList = $this->backupList($instance);
+ foreach($backupList as $backup)
+ {
+ if(empty($latestBackup) or $backup->status == 'completed' && $backup->create_time > $latestBackup->create_time) $latestBackup = $backup;
+ }
+
+ /* 3. delete expired backup. Get backup list of instance, then check every backup is expired or not.*/
+ foreach($backupList as $backup)
+ {
+ if($latestBackup && $latestBackup->name == $backup->name) continue; // Keep latest successful backup.
+
+ $deadline = intval($backup->create_time) + $instance->backupKeepDays * 24 * 3600;
+ if($deadline < time())
+ {
+ $result = $this->cne->deleteBackup($instance, $backup->name);
+ $this->action->create('instance', $instance->id, 'deleteexpiredbackup', '', json_encode(array('result' => 'success', 'data' => array('backupName' => $backup->name, 'backupCreateTime' => $backup->create_time, 'result' => $result))));
+ }
+ }
+ return true;
+ }
}
diff --git a/module/instance/ui/autobackup.html.php b/module/instance/ui/autobackup.html.php
new file mode 100644
index 0000000000..2a5ddfee1e
--- /dev/null
+++ b/module/instance/ui/autobackup.html.php
@@ -0,0 +1,56 @@
+
+ * @package instance
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('automaticBackupForm'),
+ set::title($lang->instance->backup->operators['auto']),
+ set::submitBtnText($lang->save),
+ set::actions(array('submit')),
+ formRow
+ (
+ formGroup
+ (
+ set::name('autoBackup'),
+ set::width('500px'),
+ set::control(array('control' => 'checkbox', 'value' => '1', 'text' => $lang->instance->restore->enableAutoRestore, 'checked' => $backupSettings->autoBackup ? 'true' : '')),
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('backupTime'),
+ set::width('20px'),
+ set::required(true),
+ set::class('backup-settings'),
+ set::label($lang->instance->backup->backupTime),
+ set::control(array('control' => 'time')),
+ set::value($backupSettings->backupTime)
+ )
+ ),
+ formRow
+ (
+ formGroup
+ (
+ set::name('backupCycle'),
+ set::width('20px'),
+ set::required(true),
+ set::control('picker'),
+ set::class('backup-settings'),
+ set::label($lang->instance->backup->cycleDays),
+ set::items($lang->instance->backup->cycleList),
+ set::value($backupSettings->cycleDays)
+ )
+ )
+);
diff --git a/module/instance/ui/backuplist.html.php b/module/instance/ui/backuplist.html.php
new file mode 100644
index 0000000000..c2f6c1c636
--- /dev/null
+++ b/module/instance/ui/backuplist.html.php
@@ -0,0 +1,52 @@
+
+ * @package repo
+ * @link https://www.zentao.net
+ */
+namespace zin;
+
+$backups = initTableData($backupList, $config->backup->dtable->fieldList, $this->instance);
+$hasRestoreLog = false;
+foreach($backupList as &$backup)
+{
+ /* Initialization calculation and assignment. */
+ $status = $backup->status;
+ $restoreStatus = '';
+ $backupSize = isset($backup->backup_details->db[0]) ? intval(zget($backup->backup_details->db[0], 'size', 0)) : 0;
+ $backupSize += isset($backup->backup_details->volume[0]) ? intval(zget($backup->backup_details->volume[0], 'doneBytes', 0)) : 0;
+
+ $backup->instanceId = $instance->id;
+ $backup->operator = zget($lang->instance->backup->operators, $backup->username, $backup->username);
+ $backup->status = zget($lang->instance->backup->statusList, strtolower($backup->status));
+ $backup->backupSize = helper::formatKB($backupSize);
+
+ /* Mark recently restored information. */
+ $backup->latestRestoreTime = 0;
+ $backup->latestRestoreStatus = '';
+ foreach($backup->restores as $restore)
+ {
+ $hasRestoreLog = true;
+ if($restore->create_time > $backup->latestRestoreTime)
+ {
+ $backup->latestRestoreTime = $restore->create_time;
+ $restoreStatus = $restore->status;
+ $backup->latestRestoreStatus = zget($lang->instance->restore->statusList, $restore->status, $restore->status);
+ }
+ }
+ $backup->latestRestoreTime = $backup->latestRestoreTime == 0 ? '' : date('Y-m-d H:i:s', $backup->latestRestoreTime);
+ $backup->restoreTime = zget($lang->instance->backup->operators, $backup->username, $backup->username);
+
+ if(in_array($status, array('processing', 'inprogress')) || in_array($restoreStatus, array('pending', 'inprogress'))) $backup->actions[0]['disabled'] = true;
+}
+dtable
+(
+ set::cols($config->backup->dtable->fieldList),
+ set::data($backups),
+ set::sortLink(createLink('instance', 'backuplist', "id={$instance->id}&orderBy={name}_{sortType}&recTotal={$pager->recTotal}&pageID={$pager->pageID}")),
+ set::footPager(usePager())
+);
diff --git a/module/instance/ui/backupsettings.html.php b/module/instance/ui/backupsettings.html.php
new file mode 100644
index 0000000000..9b5b0da5c4
--- /dev/null
+++ b/module/instance/ui/backupsettings.html.php
@@ -0,0 +1,35 @@
+
+ * @package instance
+ * @link https://www.zentao.net
+ */
+
+namespace zin;
+
+formPanel
+(
+ set::id('backupSettingsForm'),
+ set::title($lang->instance->backup->operators['settings']),
+ set::submitBtnText($lang->save),
+ set::actions(array('submit')),
+ formRow
+ (
+ formGroup
+ (
+ set::name('backupKeepDays'),
+ set::width('20px'),
+ set::required(true),
+ set::class('backup-settings'),
+ set::label($this->lang->instance->backup->keepDays),
+ set::control('input'),
+ set::value((int)$instance->backupKeepDays),
+ span($this->lang->instance->backup->backupSettingsTips, set::className('text-warning inline-block mt-2'))
+ ),
+ )
+);
diff --git a/module/instance/ui/view.html.php b/module/instance/ui/view.html.php
index c25d128287..6acbceaff2 100644
--- a/module/instance/ui/view.html.php
+++ b/module/instance/ui/view.html.php
@@ -13,11 +13,12 @@ declare(strict_types=1);
namespace zin;
-jsVar('copied', $lang->instance->copied);
-jsVar('instanceID', $instance->id);
-jsVar('instanceStatus', $instance->status);
-jsVar('instanceType', $type);
-jsVar('inQuickon', $config->inQuickon);
+jsVar('copied', $lang->instance->copied);
+jsVar('instanceID', $instance->id);
+jsVar('instanceStatus', $instance->status);
+jsVar('instanceType', $type);
+jsVar('inQuickon', $config->inQuickon);
+jsVar('confirmBackupTip', $lang->instance->backup->confirmTip);
if(empty($instance->externalID)) $instance->externalID = 0;
$instance->appName = strtolower($instance->appName);
@@ -271,7 +272,54 @@ div
),
$dbListWg
)
- )
+ ),
+ /* 应用实例备份块。 */
+ /* Instance Backup block. */
+ !($config->inQuickon && $type == 'store') ? null : section(
+ set::title($lang->instance->backup->common),
+ set::id('backupSection'),
+ set('data-example', 1),
+ div(
+ setClass('ml-10 inline-block'),
+ btn(
+ set(array
+ (
+ 'icon' => 'backend',
+ 'class' => 'ghost btn',
+ 'text' => $lang->instance->backup->operators['manual'] ,
+ 'data-size' => 'sm',
+ 'onclick' => "onManualBackup({$instance->id})"
+ ))
+ ),
+ btn(
+ set(array
+ (
+ 'icon' => 'backend',
+ 'class' => 'ghost btn',
+ 'text' => $lang->instance->backup->operators['auto'] ,
+ 'url' => createLink('instance', 'autoBackup', "id={$instance->id}"),
+ 'data-size' => 'sm',
+ 'data-toggle' => 'modal'
+ ))
+ ),
+ btn(
+ set(array
+ (
+ 'icon' => 'backend',
+ 'class' => 'ghost btn',
+ 'text' => $lang->instance->backup->operators['settings'] ,
+ 'url' => createLink('instance', 'backupSettings', "id={$instance->id}"),
+ 'data-size' => 'sm',
+ 'data-toggle' => 'modal'
+ ))
+ ),
+ ),
+ div
+ (
+ setID('backupList'),
+ h::js("if(!$('#backupList').find('.dtable-header-cell').length) loadTarget($.createLink('instance', 'backupList', 'id={$instance->id}'), '#backupList');"),
+ )
+ ),
),
floatToolbar
(
diff --git a/module/instance/zen.php b/module/instance/zen.php
index 35fa2c6cc0..865a005dd8 100644
--- a/module/instance/zen.php
+++ b/module/instance/zen.php
@@ -50,6 +50,7 @@ class instanceZen extends instance
$this->view->instanceMetric = $instanceMetric;
$this->view->diskSettings = $this->cne->getDiskSettings($instance);
$this->view->dbList = $this->cne->appDBList($instance);
+ $this->view->backupList = $this->instance->backupList($instance);
}
/**
diff --git a/module/misc/lang/de.php b/module/misc/lang/de.php
index 2cae117fc8..09e86d1264 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.1'] = '2024-11-15';
$lang->misc->releaseDate['21.0'] = '2024-11-01';
$lang->misc->releaseDate['20.8'] = '2024-10-21';
$lang->misc->releaseDate['20.7.1'] = '2024-09-30';
diff --git a/module/misc/lang/en.php b/module/misc/lang/en.php
index 35b566ed5b..8dccb6ca40 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.1'] = '2024-11-15';
$lang->misc->releaseDate['21.0'] = '2024-11-01';
$lang->misc->releaseDate['20.8'] = '2024-10-21';
$lang->misc->releaseDate['20.7.1'] = '2024-09-30';
diff --git a/module/misc/lang/fr.php b/module/misc/lang/fr.php
index 3ce65c6383..dcd8c7f459 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.1'] = '2024-11-15';
$lang->misc->releaseDate['21.0'] = '2024-11-01';
$lang->misc->releaseDate['20.8'] = '2024-10-21';
$lang->misc->releaseDate['20.7.1'] = '2024-09-30';
diff --git a/module/misc/lang/zh-cn.php b/module/misc/lang/zh-cn.php
index 8005640c7b..3d18373551 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.1'] = '2024-11-15';
$lang->misc->releaseDate['21.0'] = '2024-11-01';
$lang->misc->releaseDate['20.8'] = '2024-10-21';
$lang->misc->releaseDate['20.7.1'] = '2024-09-30';
@@ -239,6 +240,7 @@ $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.1'][] = array('title' => '', 'desc' => '');
$lang->misc->feature->all['21.0'][] = array('title' => '文档功能优化;产品流程模板、项目流程模板BI设计器优化。', 'desc' => '');
$lang->misc->feature->all['20.8'][] = array('title' => '文档优化:优化任务关系,修复Bug。', 'desc' => '');
$lang->misc->feature->all['20.7.1'][] = array('title' => '修复已知Bug。', 'desc' => '');
diff --git a/module/ops/control.php b/module/ops/control.php
index efaf85fc78..d8ed87ef30 100644
--- a/module/ops/control.php
+++ b/module/ops/control.php
@@ -49,19 +49,6 @@ class ops extends control
$this->setting('serverroom', 'city', 'city', $currentLang);
}
- /**
- * 管理主机CPU品牌信息。
- * Manger cpuBrand options of host.
- *
- * @param string $currentLang
- * @access public
- * @return void
- */
- public function cpuBrand($currentLang = '')
- {
- $this->setting('host', 'cpuBrand', 'cpuBrand', $currentLang);
- }
-
/**
* 管理主机系统版本信息。
* Manger OS options of host.
diff --git a/module/ops/lang/de.php b/module/ops/lang/de.php
index 710442e1d2..c5338d1dc3 100644
--- a/module/ops/lang/de.php
+++ b/module/ops/lang/de.php
@@ -3,9 +3,7 @@ $lang->ops->common = 'Devops Setting';
$lang->ops->setting = 'Settings';
$lang->ops->provider = 'IDC Provider';
$lang->ops->provider = 'IDC Provider';
-$lang->ops->cpuBrand = 'CPU Brand';
$lang->ops->city = 'IDC Location';
$lang->ops->os = 'OS Version';
-$lang->ops->account = 'Account';
$lang->ops->domain = 'Domain';
$lang->ops->serverroom = 'IDC';
\ No newline at end of file
diff --git a/module/ops/lang/en.php b/module/ops/lang/en.php
index 710442e1d2..c5338d1dc3 100644
--- a/module/ops/lang/en.php
+++ b/module/ops/lang/en.php
@@ -3,9 +3,7 @@ $lang->ops->common = 'Devops Setting';
$lang->ops->setting = 'Settings';
$lang->ops->provider = 'IDC Provider';
$lang->ops->provider = 'IDC Provider';
-$lang->ops->cpuBrand = 'CPU Brand';
$lang->ops->city = 'IDC Location';
$lang->ops->os = 'OS Version';
-$lang->ops->account = 'Account';
$lang->ops->domain = 'Domain';
$lang->ops->serverroom = 'IDC';
\ No newline at end of file
diff --git a/module/ops/lang/fr.php b/module/ops/lang/fr.php
index 710442e1d2..c5338d1dc3 100644
--- a/module/ops/lang/fr.php
+++ b/module/ops/lang/fr.php
@@ -3,9 +3,7 @@ $lang->ops->common = 'Devops Setting';
$lang->ops->setting = 'Settings';
$lang->ops->provider = 'IDC Provider';
$lang->ops->provider = 'IDC Provider';
-$lang->ops->cpuBrand = 'CPU Brand';
$lang->ops->city = 'IDC Location';
$lang->ops->os = 'OS Version';
-$lang->ops->account = 'Account';
$lang->ops->domain = 'Domain';
$lang->ops->serverroom = 'IDC';
\ No newline at end of file
diff --git a/module/ops/lang/zh-cn.php b/module/ops/lang/zh-cn.php
index 542fc346b0..40378ffeea 100644
--- a/module/ops/lang/zh-cn.php
+++ b/module/ops/lang/zh-cn.php
@@ -3,9 +3,7 @@ $lang->ops->common = 'DevOps设置';
$lang->ops->setting = '设置';
$lang->ops->provider = '服务商';
$lang->ops->provider = '服务商';
-$lang->ops->cpuBrand = 'CPU品牌';
$lang->ops->city = '城市';
$lang->ops->os = '系统版本';
-$lang->ops->account = '账号';
$lang->ops->domain = '域名';
$lang->ops->serverroom = '机房';
\ No newline at end of file
diff --git a/module/ops/lang/zh-tw.php b/module/ops/lang/zh-tw.php
index 542fc346b0..40378ffeea 100644
--- a/module/ops/lang/zh-tw.php
+++ b/module/ops/lang/zh-tw.php
@@ -3,9 +3,7 @@ $lang->ops->common = 'DevOps设置';
$lang->ops->setting = '设置';
$lang->ops->provider = '服务商';
$lang->ops->provider = '服务商';
-$lang->ops->cpuBrand = 'CPU品牌';
$lang->ops->city = '城市';
$lang->ops->os = '系统版本';
-$lang->ops->account = '账号';
$lang->ops->domain = '域名';
$lang->ops->serverroom = '机房';
\ No newline at end of file
diff --git a/module/product/model.php b/module/product/model.php
index 163eac344f..460d8f8287 100755
--- a/module/product/model.php
+++ b/module/product/model.php
@@ -794,7 +794,11 @@ class productModel extends model
}
/* Reset the stage list for epic and requirement. */
- if($storyType != 'all') $searchConfig['params']['stage']['values'] = $this->lang->$storyType->stageList;
+ if($storyType != 'all')
+ {
+ $this->app->loadLang($storyType);
+ $searchConfig['params']['stage']['values'] = $this->lang->$storyType->stageList;
+ }
$this->loadModel('search')->setSearchParams($searchConfig);
}
diff --git a/module/product/test/lib/project.ui.class.php b/module/product/test/lib/project.ui.class.php
new file mode 100644
index 0000000000..1107e90cbc
--- /dev/null
+++ b/module/product/test/lib/project.ui.class.php
@@ -0,0 +1,48 @@
+initForm('product', 'project', $projecturl, 'appIframe-product');
+ $projectPage->dom->$tabDom->click();//点击对应的tab
+ $projectPage->wait(1);
+ $num = $projectPage->dom->$tabNumDom->getText();//获取对应tab下项目数
+ return($num == $expected)
+ ? $this->success($tabName . '标签下项目数显示正确')
+ : $this->failed($tabName . '标签下项目数显示不正确');
+ }
+
+ /*
+ * 关联项目
+ * link project
+ *
+ * @param $projecturl url
+ * @param $expectedProject 项目名称
+ * @return mixed
+ */
+ public function linkProject($projecturl, $expectedProject)
+ {
+ $projectPage = $this->initForm('product', 'project', $projecturl, 'appIframe-product');
+ $projectPage->dom->linkBtn->click();
+ $projectPage->wait(1);
+ if (isset($expectedProject)) $projectPage->dom->project->picker($expectedProject);
+ $projectPage->wait(1);
+ $projectPage->dom->btn($this->lang->save)->click();
+ $projectPage->wait(1);
+ return ($projectPage->dom->firstProject->getText() == $expectedProject)
+ ? $this->success('产品关联项目成功')
+ : $this->failed('产品关联项目失败');
+ }
+}
diff --git a/module/product/test/ui/linkproject.php b/module/product/test/ui/linkproject.php
new file mode 100755
index 0000000000..4006460cfe
--- /dev/null
+++ b/module/product/test/ui/linkproject.php
@@ -0,0 +1,47 @@
+#!/usr/bin/env php
+id->range('1-2');
+$product->program->range('0');
+$product->name->range('产品1,产品2');
+$product->PO->range('admin');
+$product->status->range('normal');
+$product->type->range('normal');
+$product->gen(2);
+
+$project = zenData('project');
+$project->id->range('1');
+$project->project->range('0');
+$project->model->range('scrum');
+$project->type->range('project');
+$project->parent->range('0');
+$project->auth->range('extend');
+$project->path->range('`,1,`');
+$project->grade->range('1');
+$project->name->range('项目1');
+$project->hasProduct->range('1');
+$project->status->range('wait');
+$project->gen(1);
+
+$projectProduct = zenData('projectproduct');
+$projectProduct->project->range('1');
+$projectProduct->product->range('2');
+$projectProduct->gen(1);
+
+$tester = new projectTester();
+$tester->login();
+$projecturl['status'] = 'all';
+$projecturl['productID'] = 1;
+
+r($tester->linkProject($projecturl, '项目1')) && p('message,status') && e('产品关联项目成功,SUCCESS');//产品关联项目
+$tester->closeBrowser();
diff --git a/module/product/test/ui/page/project.php b/module/product/test/ui/page/project.php
new file mode 100644
index 0000000000..85a6257280
--- /dev/null
+++ b/module/product/test/ui/page/project.php
@@ -0,0 +1,27 @@
+ '//*[@id="actionBar"]/a[1]',
+ /*tab标签*/
+ 'allTab' => '//*[@id="featureBar"]/menu/li[1]/a',
+ 'unfinishedTab' => '//*[@id="featureBar"]/menu/li[2]/a',
+ 'waitingTab' => '//*[@id="featureBar"]/menu/li[3]/a',
+ 'doingTab' => '//*[@id="featureBar"]/menu/li[4]/a',
+ 'suspendedTab' => '//*[@id="featureBar"]/menu/li[5]/a',
+ 'closedTab' => '//*[@id="featureBar"]/menu/li[6]/a',
+ /*tab标签下项目数*/
+ 'allNum' => '//*[@id="featureBar"]/menu/li[1]/a/span[2]',
+ 'unfinishedNum' => '//*[@id="featureBar"]/menu/li[2]/a/span[2]',
+ 'waitingNum' => '//*[@id="featureBar"]/menu/li[3]/a/span[2]',
+ 'doingNum' => '//*[@id="featureBar"]/menu/li[4]/a/span[2]',
+ 'suspendedNum' => '//*[@id="featureBar"]/menu/li[5]/a/span[2]',
+ 'closedNum' => '//*[@id="featureBar"]/menu/li[6]/a/span[2]',
+ 'firstProject' => '//*[@id="table-product-project"]/div[2]/div[1]/div/div[3]/div/a'
+ );
+ $this->dom->xpath = array_merge($this->dom->xpath, $xpath);
+ }
+}
diff --git a/module/product/test/ui/projectlist.php b/module/product/test/ui/projectlist.php
new file mode 100755
index 0000000000..f6dcee60db
--- /dev/null
+++ b/module/product/test/ui/projectlist.php
@@ -0,0 +1,53 @@
+#!/usr/bin/env php
+id->range('1-2');
+$product->program->range('0');
+$product->name->range('产品1,产品2');
+$product->PO->range('admin');
+$product->status->range('normal');
+$product->type->range('normal');
+$product->gen(2);
+
+$project = zenData('project');
+$project->id->range('1-10');
+$project->project->range('0');
+$project->model->range('scrum{5},kanban{2},waterfall{3}');
+$project->type->range('project');
+$project->parent->range('0');
+$project->auth->range('extend');
+$project->path->range('`,1,`,`,2,`,`,3,`,`,4,`,`,5,`,`,6,`,`,7,`,`,8,`,`,9,`,`,10,`');
+$project->grade->range('1');
+$project->name->range('项目1,项目2,项目3,项目4,项目5,项目6,项目7,项目8,项目9,项目10');
+$project->hasProduct->range('1');
+$project->status->range('doing{1},suspended{3},closed{4},wait{2}');
+$project->gen(10);
+
+$projectProduct = zenData('projectproduct');
+$projectProduct->project->range('1-10');
+$projectProduct->product->range('1{9},2');
+$projectProduct->gen(10);
+
+$tester = new projectTester();
+$tester->login();
+$projecturl['status'] = 'all';
+$projecturl['productID'] = 1;
+
+r($tester->switchTab($projecturl, 'all', '9')) && p('message,status') && e('all标签下项目数显示正确,SUCCESS');//检查全部标签下项目数
+r($tester->switchTab($projecturl, 'unfinished', '2')) && p('message,status') && e('unfinished标签下项目数显示正确,SUCCESS');//检查未完成标签下项目数
+r($tester->switchTab($projecturl, 'waiting', '1')) && p('message,status') && e('waiting标签下项目数显示正确,SUCCESS');//检查未开始标签下项目数
+r($tester->switchTab($projecturl, 'doing', '1')) && p('message,status') && e('doing标签下项目数显示正确,SUCCESS');//检查进行中标签下项目数
+r($tester->switchTab($projecturl, 'suspended', '3')) && p('message,status') && e('suspended标签下项目数显示正确,SUCCESS');//检查已挂起标签下项目数
+r($tester->switchTab($projecturl, 'closed', '4')) && p('message,status') && e('closed标签下项目数显示正确,SUCCESS');//检查已关闭标签下项目数
+
+$tester->closeBrowser();
diff --git a/module/product/ui/ajaxgetdropmenu.html.php b/module/product/ui/ajaxgetdropmenu.html.php
index 8f00fe14a1..6fbd33c96e 100644
--- a/module/product/ui/ajaxgetdropmenu.html.php
+++ b/module/product/ui/ajaxgetdropmenu.html.php
@@ -67,6 +67,7 @@ foreach($products as $programID => $programProducts)
$item['active'] = $productID == $product->id;
$item['keys'] = zget(common::convert2Pinyin(array($product->name)), $product->name, '');
$item['data-app'] = $app->tab;
+ $item['isPO'] = $product->PO == $this->app->user->account;
if($config->systemMode == 'light' || $config->vision == 'or')
{
diff --git a/module/project/test/lib/createkanban.ui.class.php b/module/project/test/lib/createkanban.ui.class.php
new file mode 100644
index 0000000000..73e6c1d7bc
--- /dev/null
+++ b/module/project/test/lib/createkanban.ui.class.php
@@ -0,0 +1,101 @@
+initForm('project', 'create', array('model' => 'kanban'));
+ if(isset($kanban['parent'])) $form->dom->parent->picker($kanban['parent']);
+ $categoryLang = (array)$this->lang->project->projectTypeList;
+ if(isset($kanban['type'])) $form->dom->btn($categoryLang[$kanban['type']])->click();
+ if(isset($kanban['name'])) $form->dom->name->setValue($kanban['name']);
+ if(isset($kanban['end'])) $form->dom->end->datepicker($kanban['end']);
+ else $form->dom->longTime->click(); //如果设置了end时间就选择,没有设置就选择长期
+ if(isset($kanban['PM'])) $form->dom->PM->picker($kanban['PM']);
+
+ $form->dom->btn($this->lang->save)->click();
+ $form->wait(5);
+ return $this->checkResult($kanban);
+ }
+
+ /**
+ * 创建看板项目后结果检查。
+ * Check the result after creating the kanban project.
+ *
+ * @param string $kanban
+ * @access public
+ * @return object
+ */
+ public function checkResult($kanban = array())
+ {
+ /* 检查创建页面时的提示信息 */
+ if($this->response('method') != 'browse')
+ {
+ if($this->checkFormTips('project')) return $this->success('创建看板项目表单页提示信息正确');
+ if($form->dom->endTip)
+ {
+ /* 检查结束日期不能为空 */
+ $endTiptext = $form->dom->endTip->getText();
+ $endTip = sprintf($this->lang->copyProject->endTip,'');
+ return ($endTiptext == $endTip) ? $this->success('创建看板项目表单页提示信息正确') : $this->failed('创建看板项目表单页提示信息不正确');
+ form->wait(1);
+ }
+ return $this->failed('创建看板项目表单页提示信息不正确');
+ }
+ /* 检查创建成功后的提示信息 */
+ else
+ {
+ /* 跳转到项目列表页面,按照项目名称进行搜索 */
+ $browsePage = $this->loadPage('project', 'browse');
+ $browsePage->dom->search($searchList = array("项目名称,包含, {$kanban['name']}"));
+ $browsePage->wait(2);
+ $browsePage->dom->kanbanName->click();
+ // 进入项目概况页面
+ $browsePage->dom->settings->click();
+ $viewPage = $this->loadPage('project', 'view');
+ $viewPage->wait(2);
+
+ // 断言检查名称、项目类型是否正确
+ if($viewPage->dom->projectName->getText() != $kanban['name']) return $this->failed('名称错误');
+ $categoryLang = (array)$this->lang->project->projectTypeList;
+ if($viewPage->dom->category->getText() != $categoryLang[$kanban['type']]) return $this->failed('类型错误');
+ // 检查日期是否正确,如果是产品型项目,就使用hasprojectend元素,因为产品型项目比项目型项目多了一个关联产品区块,所以“计划完成”的元素不能通用
+ if($categoryLang[$kanban['type']] == '产品型')
+ {
+ if(isset($kanban['end']))
+ {
+ $endtext = $viewPage->dom->hasproductend->getText();
+ if($endtext != $kanban['end']) return $this->failed('日期错误');
+ }
+ else
+ {
+ $endtext = trim($viewPage->dom->hasproductend->getText());
+ if($endtext != '长期') return $this->failed('日期错误');
+ }
+ }
+ // 如果是项目型项目,就使用noproductend元素
+ else
+ {
+ if(isset($kanban['end']))
+ {
+ $endtext = $viewPage->dom->noproductend->getText();
+ if($endtext != $kanban['end']) return $this->failed('日期错误');
+ }
+ else
+ {
+ $endtext = trim($viewPage->dom->noproductend->getText());
+ if($endtext != '长期') return $this->failed('日期错误');
+ }
+ }
+
+ return $this->success();
+ }
+ }
+}
diff --git a/module/project/test/ui/createkanban.php b/module/project/test/ui/createkanban.php
new file mode 100755
index 0000000000..caaee4860d
--- /dev/null
+++ b/module/project/test/ui/createkanban.php
@@ -0,0 +1,42 @@
+#!/usr/bin/env php
+login();
+
+//设置看板项目数据
+$kanban = array(
+ array('name' => '', 'end' => date('Y-m-d', strtotime('+30 days'))),
+ array('name' => '一个产品型看板项目'.time(), 'end' => ''),
+ array('type' => 1, 'name' => '一个产品型看板项目'.time(), 'end' => date('Y-m-d', strtotime('+1 month')), 'PM' => 'admin'),
+ array('type' => 1, 'name' => '一个长期的产品型看板项目'.time(), 'PM' => 'admin'),
+ array('type' => 0, 'name' => '一个项目型看板项目'.time(), 'end' => date('Y-m-d', strtotime('+1 month')), 'PM' => 'admin'),
+);
+
+r($tester->checkInput($kanban['0'])) && p('message,status') && e('创建看板项目表单页提示信息正确,SUCCESS'); // 创建看板项目缺少项目名称
+r($tester->checkInput($kanban['1'])) && p('message,status') && e('创建看板项目表单页提示信息正确,SUCCESS'); // 创建看板项目计划完成时间置空
+r($tester->checkInput($kanban['2'])) && p('status') && e('SUCCESS'); // 创建有日期的产品型看板项目
+r($tester->checkInput($kanban['3'])) && p('status') && e('SUCCESS'); // 创建一个长期的产品型看板项目
+r($tester->checkInput($kanban['4'])) && p('status') && e('SUCCESS'); // 创建有日期的项目型看板项目
+
+$tester->closeBrowser();
diff --git a/module/project/test/ui/page/browse.php b/module/project/test/ui/page/browse.php
index c147ba8a9a..54d159f58a 100644
--- a/module/project/test/ui/page/browse.php
+++ b/module/project/test/ui/page/browse.php
@@ -48,7 +48,9 @@ class browsePage extends page
'moreTab' => "//*[@id='featureBar']/menu/li[5]/a/span[1]",
'suspended' => "//*[@id='more']/menu/menu/li[1]/a/div/div",
'closed' => "//*[@id='more']/menu/menu/li[2]/a/div/div",
- 'num' => "//*[@id='table-project-browse']/div[3]/div[2]/strong"
+ 'num' => "//*[@id='table-project-browse']/div[3]/div[2]/strong",
+ /*创建看板项目*/
+ 'kanbanName' => "//*[@id='mainContent']/div[2]/div/div/div[2]/div[1]/div/div[2]/div/a"
);
$this->dom->xpath = array_merge($this->dom->xpath, $xpath);
}
diff --git a/module/project/ui/ajaxgetdropmenu.html.php b/module/project/ui/ajaxgetdropmenu.html.php
index ccc8f57b03..0369a50880 100644
--- a/module/project/ui/ajaxgetdropmenu.html.php
+++ b/module/project/ui/ajaxgetdropmenu.html.php
@@ -61,11 +61,12 @@ foreach($projects as $programID => $programProjects)
$group = $getProjectGroup($project);
$item = array();
- $item['id'] = $project->id;
- $item['text'] = $project->name;
- $item['icon'] = $project->model == 'scrum' ? 'sprint' : $project->model;
- $item['keys'] = zget(common::convert2Pinyin(array($project->name)), $project->name, '');
- $item['url'] = sprintf($link, $project->id);
+ $item['id'] = $project->id;
+ $item['text'] = $project->name;
+ $item['icon'] = $project->model == 'scrum' ? 'sprint' : $project->model;
+ $item['keys'] = zget(common::convert2Pinyin(array($project->name)), $project->name, '');
+ $item['url'] = sprintf($link, $project->id);
+ $item['involved'] = isset($involvedProjects[$project->id]);
if((empty($project->multiple) || $project->type == 'kanban' || $project->model == 'kanban') && strpos($link, 'ajaxSwitchBelong') === false) $item['url'] = helper::createLink('project', 'index', "projectID={$project->id}");
diff --git a/module/story/test/lib/changestory.ui.class.php b/module/story/test/lib/changestory.ui.class.php
index 7cc9cfbf96..e5d1a76224 100755
--- a/module/story/test/lib/changestory.ui.class.php
+++ b/module/story/test/lib/changestory.ui.class.php
@@ -19,15 +19,21 @@ class changeStoryTester extends tester
* @access public
* @return object
*/
- public function changeStory($storyName)
+ public function changeStory($storyName, $reviewer)
{
$form = $this->initForm('story', 'change', array('id' => 1), 'appIframe-product');
$form->dom->title->setValue($storyName);
- $form->dom->reviewer->multiPicker(array('admin'));
+ $form->dom->reviewer->multiPicker($reviewer);
$form->dom->btn($this->lang->save)->click();
$form->wait(1);
- if($this->response('method') != 'view')
+ if($this->response('method') != 'view' and $reviewer == array())
+ {
+ if($form->dom->alertmodal('text') == '『评审人员』不能为空。') return $this->success('变更需求表单页面提示信息正确');
+ return $this->failed('变更需求表单页面提示信息不正确');
+ }
+
+ if($this->response('method') != 'view' and $storyName == null)
{
if($form->dom->alertmodal('text') == '『研发需求名称』不能为空。') return $this->success('变更需求表单页面提示信息正确');
return $this->failed('变更需求表单页面提示信息不正确');
@@ -39,6 +45,42 @@ class changeStoryTester extends tester
if($viewPage->dom->storyName->getText() != $storyName) return $this->failed('需求名称不正确');
if($viewPage->dom->status->getText() != '评审中') return $this->failed('需求状态不正确');
+ return $this->success('变更需求成功');
+ }
+
+ /**
+ * change an epic.
+ *
+ * @param string $storyName
+ * @param array $reviewer
+ * @access public
+ * @return object
+ */
+ public function changeEpic($storyName, $reviewer)
+ {
+ $form = $this->initForm('epic', 'change', array('id' => 3), 'appIframe-product');
+ $form->dom->title->setValue($storyName);
+ $form->dom->reviewer->multiPicker($reviewer);
+ $form->dom->btn($this->lang->save)->click();
+ $form->wait(1);
+
+ if($this->response('method') != 'view' and $reviewer == array())
+ {
+ if($form->dom->alertmodal('text') == '『评审人员』不能为空。') return $this->success('变更需求表单页面提示信息正确');
+ return $this->failed('变更需求表单页面提示信息不正确');
+ }
+ if($this->response('method') != 'view' and $storyName == null)
+ {
+ if($form->dom->alertmodal('text') == '『业务需求名称』不能为空。') return $this->success('变更需求表单页面提示信息正确');
+ return $this->failed('变更需求表单页面提示信息不正确');
+ }
+
+ /* 跳转到需求列表页面搜索创建需求并进入该需求详情页。 */
+
+ $viewPage = $this->loadPage('epic', 'view');
+ if($viewPage->dom->storyName->getText() != $storyName) return $this->failed('需求名称不正确');
+ if($viewPage->dom->status->getText() != '评审中') return $this->failed('需求状态不正确');
+
return $this->success('变更需求成功');
}
}
diff --git a/module/story/test/ui/changestory.php b/module/story/test/ui/changestory.php
index 6498cc003d..a446bbd1de 100755
--- a/module/story/test/ui/changestory.php
+++ b/module/story/test/ui/changestory.php
@@ -4,7 +4,7 @@ declare(strict_types=1);
/**
-title=变更研发需求测试
+title=变更需求测试
timeout=0
cid=80
@@ -51,6 +51,9 @@ $storyspec->version->range('1');
$storyspec->title->range('激活研发需求,激活用户需求,激活业务需求');
$storyspec->gen(3);
+$storyreview = zenData('storyreview');
+$storyreview->gen(0);
+
$action = zenData('action');
$action->id->range('1-4');
$action->objectType->range('product,story,story,story');
@@ -71,7 +74,16 @@ $storys = array();
$storys['null'] = '';
$storys['default'] = '变更后需求';
-r($tester->changeStory($storys['null'])) && p('message,status') && e('变更需求表单页面提示信息正确,SUCCESS'); // 缺少需求名称,变更失败
-r($tester->changeStory($storys['default'])) && p('message,status') && e('变更需求成功,SUCCESS'); // 使用默认选项变更需求,详情页信息对应
+$reviewer = array();
+$reviewer['null'] = array();
+$reviewer['default'] = array('admin');
+
+r($tester->changeStory($storys['default'], $reviewer['null'])) && p('message,status') && e('变更需求表单页面提示信息正确,SUCCESS'); // 缺少评审人,变更失败
+r($tester->changeStory($storys['null'], $reviewer['default'])) && p('message,status') && e('变更需求表单页面提示信息正确,SUCCESS'); // 缺少需求名称,变更失败
+r($tester->changeStory($storys['default'], $reviewer['default'])) && p('message,status') && e('变更需求成功,SUCCESS'); // 使用默认选项变更需求,详情页信息对应
+
+r($tester->changeEpic($storys['default'], $reviewer['null'])) && p('message,status') && e('变更需求表单页面提示信息正确,SUCCESS'); // 缺少评审人,变更失败
+r($tester->changeEpic($storys['null'], $reviewer['default'])) && p('message,status') && e('变更需求表单页面提示信息正确,SUCCESS'); // 缺少需求名称,变更失败
+r($tester->changeEpic($storys['default'], $reviewer['default'])) && p('message,status') && e('变更需求成功,SUCCESS'); // 使用默认选项变更需求,详情页信息对应
$tester->closeBrowser();
diff --git a/module/testcase/config/action.php b/module/testcase/config/action.php
index 003b99b767..975725d9fd 100644
--- a/module/testcase/config/action.php
+++ b/module/testcase/config/action.php
@@ -25,6 +25,7 @@ $config->testcase->actionList['ztfRun']['text'] = $lang->testtask->runCa
$config->testcase->actionList['ztfRun']['hint'] = $lang->testtask->runCase;
$config->testcase->actionList['ztfRun']['url'] = array('module' => 'testtask', 'method' => 'runCase', 'params' => 'runID={runID}&caseID={caseID}&version={version}');
$config->testcase->actionList['ztfRun']['notLoadModel'] = true;
+$config->testcase->actionList['ztfRun']['notInModal'] = true;
$config->testcase->actionList['ztfRun']['className'] = 'ztf-case';
$config->testcase->actionList['ztfRun']['data-toggle'] = 'modal';
$config->testcase->actionList['ztfRun']['data-size'] = 'lg';
diff --git a/module/testcase/test/lib/testcase.ui.class.php b/module/testcase/test/lib/testcase.ui.class.php
old mode 100644
new mode 100755
index 2990faabb6..21ca4c91d6
--- a/module/testcase/test/lib/testcase.ui.class.php
+++ b/module/testcase/test/lib/testcase.ui.class.php
@@ -141,7 +141,7 @@ class testcase extends tester
if(isset($testcase['result'])) $form->dom->result->picker($testcase['result']);
if(isset($testcase['reviewedBy'])) $form->dom->{'reviewedBy[]'}->multiPicker($testcase['reviewedBy']);
if(isset($testcase['comment'])) $form->dom->comment->setValueInZenEditor($testcase['comment']);
- $form->dom->btn($this->lang->projectreview->common)->click();
+ $form->dom->needReview->click();
$this->webdriver->wait(1);
if($form->dom->review->attr('href')) return $this->success('测试用例评审通过');
@@ -226,20 +226,4 @@ class testcase extends tester
}
}
}
-
- /**
- * 测试用例列表。
- * check testcase list.
- *
- * @param array $project
- * @access public
- * @return object
- */
- public function testcaseBrowse($project)
- {
- $this->login();
- $form = $this->initForm('testcase', 'browse', $project, 'appIframe-qa');
- if($form->dom->caseListID->getText()) return $this->success('测试用例列表验证成功');
- return $this->failed('测试用例列表验证失败');
- }
}
diff --git a/module/testcase/test/ui/page/browse.php b/module/testcase/test/ui/page/browse.php
index 8acd07f579..1830ac67cd 100755
--- a/module/testcase/test/ui/page/browse.php
+++ b/module/testcase/test/ui/page/browse.php
@@ -9,7 +9,8 @@ class browsePage extends page
'caseName' => "(//div[@data-col='title']//a[@data-app='qa'])[1]",
'caseNameView' => "(//div[@id='mainContent']//span[text()])[3]",
'review' => "(//div[@data-row='case_1']//a[@data-toggle='modal'])[1]",
- 'comment' => "//zen-editor[@menubar-mode='compact']"
+ 'comment' => "//zen-editor[@menubar-mode='compact']",
+ 'needReview' => "(//form/div//button[@type='submit'])[2]"
);
$this->dom->xpath = array_merge($this->dom->xpath, $xpath);
diff --git a/module/testcase/test/ui/testcasereview.php b/module/testcase/test/ui/testcasereview.php
index 8705f0329b..853fcf49e1 100755
--- a/module/testcase/test/ui/testcasereview.php
+++ b/module/testcase/test/ui/testcasereview.php
@@ -19,8 +19,48 @@ $story = zenData('story');
$story->id->setFields(array(array('range' => '2')));
$story->version->setFields(array(array('range' => '1')));
$story->gen(1);
+
/* 修改zt_config表中控制用例评审的开关。value值为'1'则开启,'0'则关闭。 */
-zenData('setting')->dao->update(TABLE_CONFIG)->set('value')->eq('1')->where('module')->eq('testcase')->andWhere('`key`')->eq('needReview')->exec();
+$reviewData = new stdclass();
+$reviewData->open = new stdclass();
+$reviewData->open->forceReview = new stdclass();
+$reviewData->open->forceReview->id = zenData('setting')->dao->lastInsertID();
+$reviewData->open->forceReview->owner = 'system';
+$reviewData->open->forceReview->module = 'testcase';
+$reviewData->open->forceReview->key = 'forceReview';
+
+$reviewData->open->reviewCase = new stdClass();
+$reviewData->open->reviewCase->id = zenData('setting')->dao->lastInsertID();
+$reviewData->open->reviewCase->owner = 'system';
+$reviewData->open->reviewCase->module = 'testcase';
+$reviewData->open->reviewCase->key = 'reviewCase';
+$reviewData->open->reviewCase->value = '1';
+
+$reviewData->open->needReview = new stdClass();
+$reviewData->open->needReview->id = zenData('setting')->dao->lastInsertID();
+$reviewData->open->needReview->owner = 'system';
+$reviewData->open->needReview->module = 'testcase';
+$reviewData->open->needReview->key = 'needReview';
+$reviewData->open->needReview->value = '1';
+
+$reviewData->open->forceNotReview = new stdClass();
+$reviewData->open->forceNotReview->id = zenData('setting')->dao->lastInsertID();
+$reviewData->open->forceNotReview->owner = 'system';
+$reviewData->open->forceNotReview->module = 'testcase';
+$reviewData->open->forceNotReview->key = 'forceNotReview';
+
+zenData('setting')->dao->delete()->from(TABLE_CONFIG)->where('module')->eq('testcase')->andWhere('key')->in('forceReview, reviewCase, needReview, forceNotReview')->exec();
+zenData('setting')->dao->insert(TABLE_CONFIG)->data($reviewData->open->forceReview)->exec();
+zenData('setting')->dao->insert(TABLE_CONFIG)->data($reviewData->open->reviewCase)->exec();
+zenData('setting')->dao->insert(TABLE_CONFIG)->data($reviewData->open->needReview)->exec();
+zenData('setting')->dao->insert(TABLE_CONFIG)->data($reviewData->open->forceNotReview)->exec();
+
+$user = zenData('user');
+$user->id->setFields(array(array('range' => zenData('user')->dao->lastInsertID())));
+$user->account->setFields(array(array('range' => 'luxuyang')));
+$user->realname->setFields(array(array('range' => '研发')));
+$user->gen(1, $isClear = false);
+
zenData('case')->loadYaml('case')->gen(1);
$tester = new testcase();
@@ -35,4 +75,9 @@ $testcase = array(
'comment' => '备注一下'
);
-r($tester->testcaseReview($product, $testcase)) && p('message,status') && e('测试用例评审通过,SUCCESS'); //测试用例评审通过。
\ No newline at end of file
+r($tester->testcaseReview($product, $testcase)) && p('message,status') && e('测试用例评审通过,SUCCESS'); //测试用例评审通过。
+
+/* 还原zt_config、zt_user数据 */
+zenData('setting')->dao->delete()->from(TABLE_CONFIG)->where('module')->eq('testcase')->andWhere('key')->in('forceReview, reviewCase, needReview, forceNotReview')->exec();
+zenData('user')->dao->delete()->from(TABLE_USER)->where('account')->eq('luxuyang')->exec();
+$tester->closeBrowser();
diff --git a/module/upgrade/config.php b/module/upgrade/config.php
index 8163324f65..e204945d45 100644
--- a/module/upgrade/config.php
+++ b/module/upgrade/config.php
@@ -58,7 +58,8 @@ $config->upgrade->maxVersion['max5_5'] = '20_6';
$config->upgrade->maxVersion['max5_6'] = '20_7';
$config->upgrade->maxVersion['max5_6_1'] = '20_7_1';
$config->upgrade->maxVersion['max5_7'] = '20_8';
-$config->upgrade->maxVersion['max6_0'] = '21_0'; // max insert position.
+$config->upgrade->maxVersion['max6_0'] = '21_0';
+$config->upgrade->maxVersion['max6_1'] = '21_1'; // max insert position.
$config->upgrade->bizVersion = array();
$config->upgrade->bizVersion['biz1_0'] = '9_5_1';
@@ -155,7 +156,8 @@ $config->upgrade->bizVersion['biz10_5'] = '20_6';
$config->upgrade->bizVersion['biz10_6'] = '20_7';
$config->upgrade->bizVersion['biz10_6_1'] = '20_7_1';
$config->upgrade->bizVersion['biz10_7'] = '20_8';
-$config->upgrade->bizVersion['biz11_0'] = '21_0'; // biz insert position.
+$config->upgrade->bizVersion['biz11_0'] = '21_0';
+$config->upgrade->bizVersion['biz11_1'] = '21_1'; // biz insert position.
$config->upgrade->proVersion = array();
$config->upgrade->proVersion['pro1_0'] = '3_1';
@@ -289,7 +291,8 @@ $config->upgrade->ipdVersion['ipd2_5'] = '20_6';
$config->upgrade->ipdVersion['ipd2_6'] = '20_7';
$config->upgrade->ipdVersion['ipd2_6_1'] = '20_7_1';
$config->upgrade->ipdVersion['ipd2_7'] = '20_8';
-$config->upgrade->ipdVersion['ipd3_0'] = '21_0'; // ipd insert position.
+$config->upgrade->ipdVersion['ipd3_0'] = '21_0';
+$config->upgrade->ipdVersion['ipd3_1'] = '21_1'; // ipd insert position.
$config->upgrade->lowerTables = array();
$config->upgrade->lowerTables[$config->db->prefix . 'caseStep'] = $config->db->prefix . 'casestep';
@@ -1401,6 +1404,10 @@ $config->delete['20_9'][] = 'extension/ipd/deploy/ui/managescope.html.php';
$config->delete['20_9'][] = 'extension/biz/deploy/js/managescope.ui.js';
$config->delete['20_9'][] = 'extension/max/deploy/js/managescope.ui.js';
$config->delete['20_9'][] = 'extension/ipd/deploy/js/managescope.ui.js';
+$config->delete['20_9'][] = 'extension/biz/deploy/js/finish.ui.js';
+$config->delete['20_9'][] = 'extension/max/deploy/js/finish.ui.js';
+$config->delete['20_9'][] = 'extension/ipd/deploy/js/finish.ui.js';
+$config->delete['20_9'][] = 'module/account/';
$config->upgrade->openModules = array('action', 'admin', 'ai', 'bi', 'aiapp', 'api', 'automation', 'backup', 'block', 'branch', 'budget', 'bug', 'build', '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');
$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/lang/version.php b/module/upgrade/lang/version.php
index bf6d6fc5e0..16ad2680a4 100644
--- a/module/upgrade/lang/version.php
+++ b/module/upgrade/lang/version.php
@@ -203,7 +203,8 @@ $lang->upgrade->fromVersions['20_6'] = '20.6';
$lang->upgrade->fromVersions['20_7'] = '20.7';
$lang->upgrade->fromVersions['20_7_1'] = '20.7.1';
$lang->upgrade->fromVersions['20_8'] = '20.8';
-$lang->upgrade->fromVersions['21_0'] = '21.0'; // pms insert position.
+$lang->upgrade->fromVersions['21_0'] = '21.0';
+$lang->upgrade->fromVersions['21_1'] = '21.1'; // pms insert position.
global $config;
/* Lite. */
@@ -407,7 +408,8 @@ $lang->upgrade->fromVersions['biz10_5'] = 'Biz10.5';
$lang->upgrade->fromVersions['biz10_6'] = 'Biz10.6';
$lang->upgrade->fromVersions['biz10_6_1'] = 'Biz10.6.1';
$lang->upgrade->fromVersions['biz10_7'] = 'Biz10.7';
-$lang->upgrade->fromVersions['biz11_0'] = 'Biz11.0'; // biz insert position.
+$lang->upgrade->fromVersions['biz11_0'] = 'Biz11.0';
+$lang->upgrade->fromVersions['biz11_1'] = 'Biz11.1'; // biz insert position.
/* Max. */
$lang->upgrade->fromVersions['max2_0_beta4'] = 'Max2.0.beta4';
@@ -469,7 +471,8 @@ $lang->upgrade->fromVersions['max5_5'] = 'Max5.5';
$lang->upgrade->fromVersions['max5_6'] = 'Max5.6';
$lang->upgrade->fromVersions['max5_6_1'] = 'Max5.6.1';
$lang->upgrade->fromVersions['max5_7'] = 'Max5.7';
-$lang->upgrade->fromVersions['max6_0'] = 'Max6.0'; // max insert position.
+$lang->upgrade->fromVersions['max6_0'] = 'Max6.0';
+$lang->upgrade->fromVersions['max6_1'] = 'Max6.1'; // max insert position.
/* Ipd */
$lang->upgrade->fromVersions['ipd1_0_beta1'] = 'Ipd1.0.beta1';
@@ -492,4 +495,5 @@ $lang->upgrade->fromVersions['ipd2_4'] = 'Ipd2.4';
$lang->upgrade->fromVersions['ipd2_5'] = 'Ipd2.5';
$lang->upgrade->fromVersions['ipd2_6'] = 'Ipd2.6';
$lang->upgrade->fromVersions['ipd2_6_1'] = 'Ipd2.6.1';
-$lang->upgrade->fromVersions['ipd2_7'] = 'Ipd2.7'; // ipd insert position.
+$lang->upgrade->fromVersions['ipd2_7'] = 'Ipd2.7';
+$lang->upgrade->fromVersions['ipd3_0'] = 'Ipd3.0'; // ipd insert position.
diff --git a/www/dev.php b/www/dev.php
index 7cc20f86f3..b7aff2e791 100644
--- a/www/dev.php
+++ b/www/dev.php
@@ -176,8 +176,8 @@ function initTable(data)
footer: [function(result, layout) {
return [
{html: `Total ${layout.allRows.length}`, className: 'text-gray mr-4'},
- metricsStats.danger ? {html: `BLOCK ${metricsStats.danger}
`, className: 'text-danger mr-4'} : null,
- metricsStats.warning ? {html: `WARN ${metricsStats.warning}
`, className: 'text-warning mr-4'} : null,
+ metricsStats.danger ? {html: `BLOCK ${metricsStats.danger}
`, className: 'text-danger mr-4'} : null,
+ metricsStats.warning ? {html: `WARN ${metricsStats.warning}
`, className: 'text-warning mr-4'} : null,
];
}],
cols: cols,
@@ -231,7 +231,7 @@ function initTable(data)
console.log('> clicked', info.rowInfo.data);
}
});
- console.log('> table', table);
+ window.table = table;
}
function initData(data)
@@ -244,7 +244,7 @@ function initData(data)
row['metrics.backend.totalTime'] = row.metrics.backend.totalTime;
row['metrics.backend.sqlCount'] = row.metrics.backend.sqlCount;
row['metrics.backend.sqlTime'] = row.metrics.backend.sqlTime * ((!row.dataVer || row.dataVer < 2) ? 1000 : 1);
- row['metrics.backend.requestMemory'] = row.metrics.backend.requestMemory;
+ row['metrics.backend.requestMemory'] = row.metrics.backend.requestMemory * 1024;
row['metrics.backend.phpFileLoaded'] = row.metrics.backend.phpFileLoaded;
row['metrics.frontend.renderTime'] = row.metrics.frontend.renderTime;
row['metrics.frontend.downloadSize'] = row.metrics.frontend.downloadSize;
diff --git a/www/js/zui3/zui.zentao.css b/www/js/zui3/zui.zentao.css
index f7797ff4c3..6904461cab 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:balance}.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}.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)}.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.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:.5rem;--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{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-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-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-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"}.icon-docspace:before{content:"\ea1b"}.icon-doclib:before{content:"\ea1c"}.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)}.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}:root{--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}.form-batch-row-actions{padding-bottom:.75rem!important;padding-top:.75rem!important}.form-batch-ditto-wrapper{position:relative}.form-batch-ditto-control .form-control{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))}.form-batch-ditto-control .pick-pri{padding-right:calc(var(--form-batch-ditto-width) + 8px)}.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}.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}.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-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-content{flex:none}.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{height:auto!important;overflow:visible!important}.doc-editor .affine-page-root-block-container{padding:0!important}.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-view-sidebar{display:flex;flex-direction:column;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-sidebar-closed .doc-view-sidebar-content{display:none}.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-sidebar-closed:hover .doc-view-sidebar{opacity:1;transition-delay:0s}.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-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}.blocksuite-portal{position:absolute!important}.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}.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}.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-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}.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
+.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}.form-batch-row-actions{padding-bottom:.75rem!important;padding-top:.75rem!important}.form-batch-ditto-wrapper{position:relative}.form-batch-ditto-control .form-control{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))}.form-batch-ditto-control .pick-pri{padding-right:calc(var(--form-batch-ditto-width) + 8px)}.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}.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}.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-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-content{flex:none}.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!important}.doc-editor-keywords,.doc-editor-title{flex:none}.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;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-sidebar-closed .doc-view-sidebar-content{display:none}.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-sidebar-closed:hover .doc-view-sidebar{opacity:1;transition-delay:0s}.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-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}.blocksuite-portal{position:absolute!important}.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}.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}.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-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}.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 dd519ac6c4..7409c83266 100644
--- a/www/js/zui3/zui.zentao.js
+++ b/www/js/zui3/zui.zentao.js
@@ -1,10 +1,10 @@
-var hu=(N,et,Tt)=>{if(!et.has(N))throw TypeError("Cannot "+Tt)};var St=(N,et,Tt)=>(hu(N,et,"read from private field"),Tt?Tt.call(N):et.get(N)),Ot=(N,et,Tt)=>{if(et.has(N))throw TypeError("Cannot add the same private member more than once");et instanceof WeakSet?et.add(N):et.set(N,Tt)},Bt=(N,et,Tt,Wa)=>(hu(N,et,"write to private field"),Wa?Wa.call(N,Tt):et.set(N,Tt),Tt);var uu=(N,et,Tt)=>(hu(N,et,"access private method"),Tt);(function(N,et){typeof exports=="object"&&typeof module<"u"?et(exports):typeof define=="function"&&define.amd?define(["exports"],et):(N=typeof globalThis<"u"?globalThis:N||self,et(N.zui={}))})(this,function(N){var da,fa,nr,ir,sr,rr,or,ar,pa,tg,ma,ng,Wn,Un;"use strict";const et="",Tt="",Wa="",Lw="",Rw="",Ow="",zw="",Fw="",jw="",Bw="",Hw="",Ww="",ag="3.0.0",lg="production",ln=document,kr=window,pu=ln.documentElement,ei=ln.createElement.bind(ln),mu=ei("div"),Ua=ei("table"),cg=ei("tbody"),gu=ei("tr"),{isArray:Sr,prototype:yu}=Array,{concat:hg,filter:Va,indexOf:_u,map:vu,push:ug,slice:bu,some:Ka,splice:dg}=yu,fg=/^#(?:[\w-]|\\.|[^\x00-\xa0])*$/,pg=/^\.(?:[\w-]|\\.|[^\x00-\xa0])*$/,mg=/<.+>/,gg=/^\w+$/;function qa(i,e){const t=yg(e);return!i||!t&&!ti(e)&&!nt(e)?[]:!t&&pg.test(i)?e.getElementsByClassName(i.slice(1).replace(/\\/g,"")):!t&&gg.test(i)?e.getElementsByTagName(i):e.querySelectorAll(i)}class Tr{constructor(e,t){if(!e)return;if(Ga(e))return e;let n=e;if(_t(e)){const s=t||ln;if(n=fg.test(e)&&ti(s)?s.getElementById(e.slice(1).replace(/\\/g,"")):mg.test(e)?Tu(e):Ga(s)?s.find(e):_t(s)?y(s).find(e):qa(e,s),!n)return}else if(ni(e))return this.ready(e);(n.nodeType||n===kr)&&(n=[n]),this.length=n.length;for(let s=0,r=this.length;s{for(;e.firstChild;)e.removeChild(e.firstChild)})};function $r(...i){const e=vg(i[0])?i.shift():!1,t=i.shift(),n=i.length;if(!t)return{};if(!n)return $r(e,y,t);for(let s=0;s{nt(r)&&ct(t,(o,a)=>{n?e?r.classList.add(a):r.classList.remove(a):r.classList.toggle(a)})})},ie.addClass=function(i){return this.toggleClass(i,!0)},ie.removeAttr=function(i){const e=Dr(i);return this.each((t,n)=>{nt(n)&&ct(e,(s,r)=>{n.removeAttribute(r)})})};function wg(i,e){if(i){if(_t(i)){if(arguments.length<2){if(!this[0]||!nt(this[0]))return;const t=this[0].getAttribute(i);return ds(t)?void 0:t}return $t(e)?this:ds(e)?this.removeAttr(i):this.each((t,n)=>{nt(n)&&n.setAttribute(i,e)})}for(const t in i)this.attr(t,i[t]);return this}}ie.attr=wg,ie.removeClass=function(i){return arguments.length?this.toggleClass(i,!1):this.attr("class","")},ie.hasClass=function(i){return!!i&&Ka.call(this,e=>nt(e)&&e.classList.contains(i))},ie.get=function(i){return $t(i)?bu.call(this):(i=Number(i),this[i<0?i+this.length:i])},ie.eq=function(i){return y(this.get(i))},ie.first=function(){return this.eq(0)},ie.last=function(){return this.eq(-1)};function Cg(i){return $t(i)?this.get().map(e=>nt(e)||_g(e)?e.textContent:"").join(""):this.each((e,t)=>{nt(t)&&(t.textContent=i)})}ie.text=Cg;function cn(i,e,t){if(!nt(i))return;const n=kr.getComputedStyle(i,null);return t?n.getPropertyValue(e)||void 0:n[e]||i.style[e]}function Yt(i,e){return parseInt(cn(i,e),10)||0}function Cu(i,e){return Yt(i,`border${e?"Left":"Top"}Width`)+Yt(i,`padding${e?"Left":"Top"}`)+Yt(i,`padding${e?"Right":"Bottom"}`)+Yt(i,`border${e?"Right":"Bottom"}Width`)}const Qa={};function xg(i){if(Qa[i])return Qa[i];const e=ei(i);ln.body.insertBefore(e,null);const t=cn(e,"display");return ln.body.removeChild(e),Qa[i]=t!=="none"?t:"block"}function xu(i){return cn(i,"display")==="none"}function ku(i,e){const t=i&&(i.matches||i.webkitMatchesSelector||i.msMatchesSelector);return!!t&&!!e&&t.call(i,e)}function Ir(i){return _t(i)?(e,t)=>ku(t,i):ni(i)?i:Ga(i)?(e,t)=>i.is(t):i?(e,t)=>t===i:()=>!1}ie.filter=function(i){const e=Ir(i);return y(Va.call(this,(t,n)=>e.call(t,n,t)))};function kn(i,e){return e?i.filter(e):i}ie.detach=function(i){return kn(this,i).each((e,t)=>{t.parentNode&&t.parentNode.removeChild(t)}),this};const kg=/^\s*<(\w+)[^>]*>/,Sg=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,Su={"*":mu,tr:cg,td:gu,th:gu,thead:Ua,tbody:Ua,tfoot:Ua};function Tu(i){if(!_t(i))return[];if(Sg.test(i))return[ei(RegExp.$1)];const e=kg.test(i)&&RegExp.$1,t=Su[e]||Su["*"];return t.innerHTML=i,y(t.childNodes).detach().get()}y.parseHTML=Tu,ie.has=function(i){const e=_t(i)?(t,n)=>qa(i,n).length:(t,n)=>n.contains(i);return this.filter(e)},ie.not=function(i){const e=Ir(i);return this.filter((t,n)=>(!_t(i)||nt(n))&&!e.call(n,t,n))};function hn(i,e,t,n){const s=[],r=ni(e),o=n&&Ir(n);for(let a=0,l=i.length;ae.selected&&!e.disabled&&!e.parentNode.disabled),"value"):i.value||""}function Tg(i){return arguments.length?this.each((e,t)=>{const n=t.multiple&&t.options;if(n||zu.test(t.type)){const s=Sr(i)?vu.call(i,String):ds(i)?[]:[String(i)];n?ct(t.options,(r,o)=>{o.selected=s.indexOf(o.value)>=0},!0):t.checked=s.indexOf(t.value)>=0}else t.value=$t(i)||ds(i)?"":i}):this[0]&&$u(this[0])}ie.val=Tg,ie.is=function(i){const e=Ir(i);return Ka.call(this,(t,n)=>e.call(t,n,t))},y.guid=1;function Qt(i){return i.length>1?Va.call(i,(e,t,n)=>_u.call(n,e)===t):i}y.unique=Qt,ie.add=function(i,e){return y(Qt(this.get().concat(y(i,e).get())))},ie.children=function(i){return kn(y(Qt(hn(this,e=>e.children))),i)},ie.parent=function(i){return kn(y(Qt(hn(this,"parentNode"))),i)},ie.index=function(i){const e=i?y(i)[0]:this[0],t=i?this:y(e).parent().children();return _u.call(t,e)},ie.closest=function(i){const e=this.filter(i);if(e.length)return e;const t=this.parent();return t.length?t.closest(i):e},ie.siblings=function(i){return kn(y(Qt(hn(this,e=>y(e).parent().children().not(e)))),i)},ie.find=function(i){return y(Qt(hn(this,e=>qa(i,e))))};const $g=/^\s*\s*$/g,Dg=/^$|^module$|\/(java|ecma)script/i,Ig=["type","src","nonce","noModule"];function Ng(i,e){const t=y(i);t.filter("script").add(t.find("script")).each((n,s)=>{if(Dg.test(s.type)&&pu.contains(s)){const r=ei("script");r.text=s.textContent.replace($g,""),ct(Ig,(o,a)=>{s[a]&&(r[a]=s[a])}),e.head.insertBefore(r,null),e.head.removeChild(r)}})}function Mg(i,e,t,n,s){n?i.insertBefore(e,t?i.firstChild:null):i.nodeName==="HTML"?i.parentNode.replaceChild(e,i):i.parentNode.insertBefore(e,t?i:i.nextSibling),s&&Ng(e,i.ownerDocument)}function Sn(i,e,t,n,s,r,o,a){return ct(i,(l,c)=>{ct(y(c),(d,u)=>{ct(y(e),(p,g)=>{const b=t?u:g,C=t?g:u,S=t?d:p;Mg(b,S?C.cloneNode(!0):C,n,s,!S)},a)},o)},r),e}ie.after=function(){return Sn(arguments,this,!1,!1,!1,!0,!0)},ie.append=function(){return Sn(arguments,this,!1,!1,!0)};function Eg(i){if(!arguments.length)return this[0]&&this[0].innerHTML;if($t(i))return this;const e=/